更改主IP时IP别名丢失

rmf*_*low 0 networking linux ip-aliasing

我的/etc/network/interfaces:

auto eth0
iface eth0 inet static
    address 192.168.3.75
    netmask 255.255.255.0
    gateway 192.168.3.0
Run Code Online (Sandbox Code Playgroud)

情况一:

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

现在ifconfig报告两个 IP 地址192.168.3.75ateth0192.168.3.111ateth0:0

当我改变主IP到另一个网络:ifconfig eth0 192.168.1.111别名eth0:0丢失

情况二:

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

现在ifconfig报告两个 IP 地址192.168.3.75ateth0192.168.4.111ateth0:0

当我将主 IP 更改为另一个网络时:ifconfig eth0 192.168.1.111别名eth0:0 保持不变

如何正确更改主 IP,以免丢失所有别名?

Bat*_*hyX 5

解决方案很简单:停止使用史前ifconfig. 它已被弃用,它使用已弃用的 ioctl API。您遇到的是内核的兼容层,它试图推断出提供ifconfigroute未提供的信息。

ipiproute2包装中使用。ifupdown无论如何,这就是现代人所做的(看看ifup -v eth0我在说什么)。

ip 和 rtnetlink 具有将多个 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
Run Code Online (Sandbox Code Playgroud)

它应该做正确的事情。测试ifup -v eth0以确保。


为什么兼容层会以这种方式破坏?这很简单。考虑用户期望系统在运行时做什么ifconfig eth0 192.0.2.42

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

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

使用 rtnetlink,没有歧义:您管理具有不同类型(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地址。

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