为什么 IPv6 地址会在链路断开时刷新?

bgv*_*han 7 networking linux ipv6 linux-networking

分配给网络接口的 IPv4 和 IPv6 地址之间的行为存在差异:当链接断开时,就像“ip link set down dev eth0”一样,IPv4 地址被保留,但 IPv6 地址被刷新。如果链路再次启动,IPv4 地址可以立即用于传递流量,但必须分配 IPv6 地址。

这是一个错误,还是设计使然?如果按照设计,我在哪里可以找到明确记录的内容?

一位同事认为这是一个错误,需要在即将发布的内核中修复。另一个人认为这是设计使然,因为 IPv6 假定动态寻址。我在几个不同的 Linux 发行版和不同的内核版本中发现了相同的行为,所以我几乎可以肯定这是设计使然,但我想找到文档,如来自 RFC 的引用,来解决这个问题。

如果有强制保留手动分配的 IPv6 地址的变通方法,那么了解它也会很有用。

kas*_*erd 6

听起来您正在寻找的设置是keep_addr_on_down在 Linux 4.6 中引入的。引用Documentation/networking/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)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是比 4.6 更旧的 Linux 版本,我建议的最佳解决方法是将地址分配给一个dummy接口,即使物理接口被关闭,您也能保持该地址:

modprobe dummy
ip -6 addr add dev dummy0 2001:db8::42/128
Run Code Online (Sandbox Code Playgroud)