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.75
ateth0
和192.168.3.111
ateth0:0
当我改变主IP到另一个网络:ifconfig eth0 192.168.1.111
别名eth0:0
是丢失!
情况二:
linux启动后,我设置了一个IP别名: ifconfig eth0:0 192.168.4.111
现在ifconfig
报告两个 IP 地址192.168.3.75
ateth0
和192.168.4.111
ateth0:0
当我将主 IP 更改为另一个网络时:ifconfig eth0 192.168.1.111
别名eth0:0
保持不变!
如何正确更改主 IP,以免丢失所有别名?
解决方案很简单:停止使用史前ifconfig
. 它已被弃用,它使用已弃用的 ioctl API。您遇到的是内核的兼容层,它试图推断出提供ifconfig
和route
未提供的信息。
ip
从iproute2
包装中使用。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
:
有时,用户想要第一个选项。有时,它需要第二个选项(例如,当完全更改配置时)。但是 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 地址只是正常行为,这非常方便。