ifconfig vs ip:网络配置命令的差异与比较
- 一、背景
- 二、ip 命令:ifconfig 的替代方案
- 三、ip 与 ifconfig 命令的比较
- 3.1、显示所有网络接口
- 3.2、添加或删除 IP 地址
- 3.3、添加 MAC 地址
- 3.4、设置其他网络接口配置
- 3.5、启用或禁用网络接口
- 3.6、启用或禁用 ARP 协议
 
- 四、总结
一、背景
几乎所有Linux 发行版都提供了一套命令行工具来方便地配置网络,这些工具来自 net-tools 包,包含 ifconfig、route、nameif、iwconfig、iptunnel、netstat、arp 等命令。这些命令曾经是配置网络的标准工具,足以满足任何新手或专家级 Linux 用户的网络配置需求。但由于 Linux 内核的不断发展和 net-tools 包的维护问题,它们逐渐被弃用,取而代之的是功能更强大的替代方案,能够取代所有这些命令。
这个替代方案也存在了一段时间,并且比任何一个上述命令都更加强大。本文重点介绍这个替代方案,并将其与 net-tools 包中的 ifconfig 命令进行比较。
二、ip 命令:ifconfig 的替代方案
ifconfig 存在了很长时间,并且仍然被许多人用来配置、显示和控制网络接口。但现在 Linux 发行版中存在一个比它更强大的替代方案,那就是来自 iproute2util 包的 ip 命令。
虽然这个ip命令乍一看可能有点复杂,但它的功能比 ifconfig 功能更强大,可以替代所有 net-tools 包中的命令。ip 命令在网络协议栈的第二层(链路层)和第三层(IP 层)上都提供了强大的功能,并完成了 net-tools 包中所有上述命令的工作。
ifconfig 主要用于显示或修改系统接口,而 ip 命令能够完成以下任务:
- 显示或修改接口属性。
- 添加、删除 ARP 缓存条目,以及为主机创建新的静态 ARP 条目。
- 显示与所有接口关联的 MAC 地址。
- 显示和修改内核路由表。
ip 命令与 ifconfig 最主要的区别在于,后者使用 ioctl 进行网络配置,这是一种不太理想的内核交互方式。而前者利用 netlink 套接字机制来实现相同的功能,这是一种更灵活的 ioctl 替代方案,用于内核和用户空间之间的通信,使用 rtnetlink(它增加了网络环境操作能力)。
ifconfig 与 ip 命令对比表:
| ifconfig (net-tools) | ip (iproute2) | 说明 | 
|---|---|---|
| ifconfig | ip a,ip link | 显示和配置网络接口 | 
| route | ip route | 管理路由表 | 
| arp | ip neigh | 管理 ARP 邻居表 | 
| netstat | ss | 查看网络连接状态 | 
| netstat -M | conntrack -L | 查看连接跟踪信息 | 
| netstat -g | ip maddr | 查看多播组成员关系 | 
| netstat -i | ip -s link | 查看网络接口统计信息 | 
| netstat -r | ip route | 查看路由表 | 
| iptunnel | ip tunnel | 管理隧道接口 | 
| tunctl | ip tuntap | 管理虚拟网络接口 | 
| brctl | bridge | 管理桥接设备 | 
三、ip 与 ifconfig 命令的比较
现在可以开始重点介绍 ifconfig 的功能以及它们是如何被 ip 命令有效地替代的。下面重点介绍了一些 ifconfig 命令及其使用 ip 命令的替代方案。
3.1、显示所有网络接口
这里,ip 和 ifconfig 之间的一个区别是:
- ifconfig只显示已启用的接口。
- ip命令显示所有接口,无论它们是已启用还是已禁用。
ifconfig 命令:
ifconfig

ip 命令:
ip a
输出:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:15:5d:c1:36:f0 brd ff:ff:ff:ff:ff:ffinet 172.28.129.124/20 brd 172.28.143.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::215:5dff:fec1:36f0/64 scope linkvalid_lft forever preferred_lft forever
3.2、添加或删除 IP 地址
例如,将 IP 地址 192.168.80.174 分配给 eth0 接口。
-  ifconfig 命令: ifconfig eth0 add 192.168.80.174 # 添加 IP 地址 ifconfig eth0 del 192.168.80.174 # 删除 IP 地址
-  ip 命令: ip a add 192.168.80.174 dev eth0 # 添加 IP 地址 ip a del 192.168.80.174 dev eth0 # 删除 IP 地址
3.3、添加 MAC 地址
例如:将 eth0 接口的硬件地址设置为命令中指定的地址。可以通过检查 ifconfig 命令输出中的 HWaddr 值来验证这一点。
ifconfig 添加 MAC 地址,使用 ifconfig 命令添加 MAC 地址的语法:
ifconfig eth0 hw ether 00:0c:29:33:4e:aa
ip 添加 MAC 地址,使用 ip 命令添加 MAC 地址的语法:
ip link set dev eth0 address 00:0c:29:33:4e:aa
3.4、设置其他网络接口配置
除了设置 IP 地址或硬件地址之外,还可以对接口应用其他配置,包括:
- MTU(最大传输单元)
- 多播标志
- 传输队列长度
- 监听模式
- 启用或禁用所有多播模式
ifconfig 命令:
ifconfig eth0 mtu 2000         # 设置 MTU 值: 将 MTU 值设置为 2000
ifconfig eth0 multicast        # 启用多播
ifconfig eth0 txqueuelen 1200  # 设置传输队列长度
ifconfig eth0 promisc          # 启用混杂模式
ifconfig eth0 allmulti         # 启用所有多播
ip 命令:
ip link set dev eth0 mtu 2000         # 设置 MTU 值
ip link set dev eth0 multicast on     # 启用多播
ip link set dev eth0 txqueuelen 1200  # 设置传输队列长度
ip link set dev eth0 promisc on       # 启用混杂模式
ip link set dev eth0 allmulti on      # 启用所有多播
3.5、启用或禁用网络接口
(1)ifconfig 禁用/启用网络接口的命令:例如,禁用 eth0 接口,可以通过 ifconfig 的输出进行验证,默认情况下只显示已启用的接口。要重新启用接口,只需将 down 替换为 up。
ifconfig eth0 down  # 禁用接口
ifconfig eth0 up    # 启用接口
(2)ip 禁用/启用网络接口:以下 ip 命令是 ifconfig 的替代方案,用于禁用特定接口。可以通过 ip a 命令的输出进行验证,该命令默认显示所有接口,无论是已启用还是已禁用,并突出显示其状态以及描述。要重新启用接口,只需将 down 替换为 up。
ip link set eth0 down  # 禁用接口
ip link set eth0 up    # 启用接口
3.6、启用或禁用 ARP 协议
ifconfig 启用/禁用 ARP 协议:以下命令启用 ARP 协议与 eth0 接口一起使用。要禁用此选项,只需将 arp 替换为 -arp。
ifconfig eth0 arp  # 启用 ARP
ifconfig eth0 -arp # 禁用 ARP
ip 启用/禁用 ARP 协议:以下命令是 ifconfig 的 ip 替代方案,用于为 eth0 接口启用 ARP。要禁用,只需将 on 替换为 off。
ip link set dev eth0 arp on  # 启用 ARP
ip link set dev eth0 arp off # 禁用 ARP
四、总结
ip 命令比 ifconfig 功能更强大,更灵活,并且使用 netlink 套接字机制,比 ifconfig 的 ioctl 机制更先进。虽然 ip 命令可能看起来更复杂,但它可以完成 ifconfig 的所有功能,并且提供了更多高级功能。目前,Linux 发行版同时提供 ifconfig 和 ip 命令,可以根据自己的需要选择使用。
那么,您认为哪种命令更方便,您更喜欢使用哪种命令呢?
 