我的 /etc/network/interfaces:
auto eth0
iface eth0 inet static
address 192.168.3.75
netmask 255.255.255.0
gateway 192.168.3.0
情况一:
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
丢失!
情况2:
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 地址的本机功能,而无需使用大量过时的 hack,例如不是接口也不是别名的接口别名。哦,顺便说一句:现代
ifupdown
应该能够支持这一点:它应该做正确的事。测试
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 地址只是正常行为,这非常方便。