分配给网络接口的 IPv4 和 IPv6 地址的行为有所不同:当链接断开时(如使用“ip link set down dev eth0”),IPv4 地址会保留,但 IPv6 地址会被刷新。如果链接再次建立,则可以立即使用 IPv4 地址来传递流量,但必须分配 IPv6 地址。
这是错误还是设计使然?如果是设计使然,我在哪里可以找到明确记录?
一位同事认为这是一个错误,将在即将发布的内核中修复;另一位同事认为这是设计使然,因为 IPv6 假设动态寻址。我在几个不同的 Linux 发行版和不同的内核版本中发现了相同的行为,所以我几乎可以肯定这是设计使然,但我想找到文档(如 RFC 中的引文)来解决这个问题。
如果有一种解决方法可以强制保留手动分配的 IPv6 地址,那么了解它也会很有用。
答案1
听起来你正在寻找的设置是keep_addr_on_down
在 Linux 4.6 中引入的。引用文档/网络/ip-sysctl.txt:
keep_addr_on_down - INTEGER
Keep all IPv6 addresses on an interface down event. If set static
global addresses with no expiration time are not flushed.
>0 : enabled
0 : system default
<0 : disabled
Default: 0 (addresses are removed)
如果您使用的是 4.6 之前的 Linux 版本,我建议的最佳解决方法是将地址分配给一个dummy
接口,即使物理接口关闭,您也可以保留该接口:
modprobe dummy
ip -6 addr add dev dummy0 2001:db8::42/128