更改主IP时,IP别名丢失

我的/ etc / network / interfaces:

auto eth0 iface eth0 inet static address 192.168.3.75 netmask 255.255.255.0 gateway 192.168.3.0 

情况1:

linux启动后,我设置了一个IP别名: ifconfig eth0:0 192.168.3.111

现在, ifconfigeth0报告两个IP地址192.168.3.75 ,在eth0:0报告192.168.3.75

当我将主IP更改为另一个networking时: ifconfig eth0 192.168.1.111 alias eth0:0 丢失

情况2:

在linux启动后,我设置了一个IP别名: ifconfig eth0:0 192.168.4.111

现在, ifconfigeth0报告两个IP地址192.168.3.75 ,在eth0:0报告192.168.3.75

当我更改主IP到另一个networking: ifconfig eth0 192.168.1.111别名eth0:0 保持

我如何正确地更改主IP,所以我所有的别名都不会丢失?

解决scheme很简单:停止使用史前ifconfig 。 它被弃用,它使用不推荐使用的ioctl API。 你打的是内核的兼容层,它试图推断ifconfigroute不提供的信息。

使用iproute2软件包中的ip 。 这是现代的ifupdown无论如何(见ifup -v eth0来看看我在说什么)。

ip和rtnetlink具有本地function,可以将多个IP地址添加到接口,而无需使用诸如接口别名(不是接口和别名)的巨大过时黑客。

哦,顺便说一句:现代ifupdown应该能够支持这一点:

 auto eth0 iface eth0 inet static address 192.168.3.75 netmask 255.255.255.0 gateway 192.168.3.0 iface eth0 inet static address 192.168.3.111 netmask 255.255.255.0 

它应该做正确的事情。 用ifup -v eth0进行testing以确认。


兼容性层为什么这样打破? 这很简单。 考虑一下当用户运行ifconfig eth0 192.0.2.42时,用户希望系统执行什么操作:

  • 用户是否要将192.0.2.42 IP地址添加到可用地址列表中?
  • 用户是否要重置接口的现有地址,使其只有192.0.2.42地址?

有时,用户需要第一个选项。 有时,它需要第二个选项(例如完全更改configuration时)。 但是SIOCSIFADDR ioctl没有定义的语义。

使用rtnetlink时,不会有任何歧义:您可以pipe理不同types(IPv4,IPv6 …)的地址列表,并使用RTM_NEWADDR添加地址,RTM_DELADDR删除现有地址(如果指定了一个地址)一个界面。

ip是rtnetlink API的一个薄包装:

  • 使用ip addr add 192.168.3.111/24 dev eth0添加地址。
  • 使用ip addr del 192.168.3.111/24 dev eth0删除一个地址。 如果地址不存在,操作将失败。
  • 使用ip -4 addr flush dev eth0删除所有的ipv4地址。

您可以用相同的方式pipe理IPv6地址。 考虑到在一个接口上有多个IPv6地址是非常正常的行为,这是非常方便的。