为何需要放弃ifconfig改用ip配置 Linux 网络接口?

原文:Why you need to drop ifconfig for ip
作者:Rajan Bhardwaj,翻译:御坂弟弟

长久以来,配置网络接口的默认方法都是 ifconfig 命令。它为 Linux 用户提供了很好的服务,但是网络很复杂,并且要求配置它的命令必须健壮,所以现代系统新的默认网络命令是 ip,在本文中,我将向您展示如何使用它。

ip 命令通过 OSI 网络堆栈第2层(数据链路层)和第3层(网络或IP层)来实现其功能,并完成了旧 net-tools 程序包中的所有工作。

安装 ip 命令

ip 命令包含在 iproute2util 软件包中。它可能已经包含在您的 Linux 发行版中。如果不是,则可以从发行版的软件存储库中进行安装。

比较 ifconfig 和 ip 使用情况

ip 命令和 ifconfic 命令可用于配置网络接口,但他们做的事情不同。我将比较使用旧(ifconfig)和新(ip)命令如何执行常见任务。

查看网络接口和 IP 地址

如果要查看主机的 IP 地址或查看网络接口信息,旧命令 ifconfig 不带任何参数,并提供一个很好的摘要:

$ ifconfig
                                                                                                
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500                                                                 
       ether bc:ee:7b:5e:7d:d8  txqueuelen 1000  (Ethernet)                                                       
       RX packets 0  bytes 0 (0.0 B)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 0  bytes 0 (0.0 B)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       loop  txqueuelen 1000  (Local Loopback)
       RX packets 41  bytes 5551 (5.4 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 41  bytes 5551 (5.4 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.1.1.6  netmask 255.255.255.224  broadcast 10.1.1.31
       inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212  prefixlen 64  scopeid 0x0<global>
       inet6 fe80::8eb3:4bc0:7cbb:59e8  prefixlen 64  scopeid 0x20<link>
       ether 08:71:90:81:1e:b5  txqueuelen 1000  (Ethernet)
       RX packets 569459  bytes 779147444 (743.0 MiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 302882  bytes 38131213 (36.3 MiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

新命令 ip 提供了类似的结果,但命令为 ip address show 或者 ip a:

$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host  
      valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
   link/ether bc:ee:7b:5e:7d:d8 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
   link/ether 08:71:90:81:1e:b5 brd ff:ff:ff:ff:ff:ff
   inet 10.1.1.6/27 brd 10.1.1.31 scope global dynamic wlan0
      valid_lft 83490sec preferred_lft 83490sec
   inet6 fdb4:f58e:49f:4900:d46d:146b:b16:7212/64 scope global noprefixroute dynamic  
      valid_lft 6909sec preferred_lft 3309sec
   inet6 fe80::8eb3:4bc0:7cbb:59e8/64 scope link  
      valid_lft forever preferred_lft forever

添加IP地址

使用 ifconfig 命令向接口添加 IP 地址:

$ ifconfig eth0 add 192.9.203.21

ip 命令类似:

$ ip address add 192.9.203.21 dev eth0

并且 ip 命令可以简化:

$ ip addr add 192.9.203.21 dev eth0

甚至可以更短:

$ ip a add 192.9.203.21 dev eth0

删除IP地址

添加 IP 地址的相反操作是删除一个 IP 地址。

使用 ifconfig 命令,语法为:

$ ifconfig eth0 del 192.9.203.21

ip 命令语法如下:

$ ip a del 192.9.203.21 dev eth0

启用或禁用多播

ifconfig 命令使用 multicast 参数启用(或禁用)接口上的多播:

# ifconfig eth0 multicast

ip 需要 set 子命令设置设备(dev),并且 multicast 选项后要带开关或 bool 值:

# ip link set dev eth0 multicast on

启用或禁用网络

每个系统管理员都熟悉使用旧命令“关闭然后再打开”的技巧来解决问题。在网络接口方面,这意味着可以启动或关闭网络。

ifconfig 命令使用 up 或 down 关键字执行此操作:

# ifconfig eth0 up

或者,您可以使用专用命令:

# ifup eth0

ip 命令使用 set 子命令将接口设置为 up 或者 down 状态:

# ip link set eth0 up

启用或禁用地址解析协议(ARP)

使用 ifconfig,您可以通过声明 arp 来启用它:

# ifconfig eth0 arp

使用 ip,可以设置 arp 属性为 on 或者 off:

# ip link set dev eth0 arp on

ip 和 ifconfig 的优缺点

ip 命令使用 Netlink 套接字而不是 ioctl 系统调用,因此通用性和性能更好。

ip 命令可能看起来比 ifconfig 更加冗长和复杂,但这是它用途更广的原因之一。一旦开始使用它,您就会对它的内部逻辑有所了解(例如,使用 set 子命令而不是看似随意混合的声明或设置)。

最后,ifconfig 命令已经过时了(例如,它缺乏对网络名称空间的完全支持),并且 ip 命令是为现代网络设计的。试试看,您会很高兴去学习、使用它。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注