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
命令,可以根据自己的需要选择使用。
那么,您认为哪种命令更方便,您更喜欢使用哪种命令呢?