分配给网络接口的IPv4和IPv6地址之间的行为存在差异:当链路断开时,与“ip link set down dev eth0”一样,IPv4地址将被保留,但IPv6地址将被刷新.如果再次启动链接,则可以立即使用IPv4地址传递流量,但必须分配IPv6地址.
这是一个错误,还是设计?如果按设计,我在哪里可以找到明确记录的内容?
一位同事认为这是一个错误,需要在即将到来的内核中修复;另一个人认为它是设计的,因为IPv6假定动态寻址.我在几个不同的Linux发行版和不同的内核版本中发现了相同的行为,所以我几乎可以肯定这是设计的,但我想找到文档,就像在RFC的引用中一样,来解决这个问题.
如果有一种解决方法会强制保留手动分配的IPv6地址,那么这也是有用的.
解决方法
听起来你正在寻找的设置是在Linux 4.6中引入的keep_addr_on_down.引用
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)
如果您使用的是比4.6版本更旧的Linux版本,我建议的最佳解决方法是将地址分配给虚拟接口,即使物理接口关闭,您仍然可以跟上它:
modprobe dummy ip -6 addr add dev dummy0 2001:db8::42/128