我在 vServer 上运行 Debian 8。安装 docker 并启用 IPv6 后,我注意到一些奇怪的事情。我不知道 docker 是否与此有关,只是我在安装它后才注意到这个问题。
我的默认路由配置为在约 1800 秒后过期。实际上,我在此超时后就消失了。这时我(显然)失去了 IPv6 连接。
root@wopr:~# ip -6 route
xxxx:yyyy:zzz:xxxx::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev br-5c1ce68ea951 proto kernel metric 256
fe80::/64 dev br-61f6bbfdbe87 proto kernel metric 256
[a lot more routed for my docker containers]
default via fe80::1 dev eth0 proto ra metric 1024 expires 1259sec hoplimit 64
为什么路由配置为 1800 秒后过期?我在哪里可以配置它?
[编辑 2016-05-14 16:08]
手动添加默认路由似乎效果很好。它会保持不变。但我需要启动后有一个不过期的路由。
[编辑 2016-05-14 16:13]
该机器在 netcup.de 托管的 KVM 主机上运行。它使用 virtio 驱动程序,这是我的提供商推荐的。
root@wopr:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
address xxxx:yyyy:zzz:xxxx::1
netmask 64
gateway fe80::1
virt-what 说:
root@wopr:~# virt-what
kvm
[编辑 2016-05-14 15:34]
看起来我错过了将其net.ipv6.conf.default.autoconf
设置为 1。现在我在 /etc/sysctl.d 中添加了一个文件以在启动时抑制这种情况:
root@wopr:~# cat /etc/sysctl.d/ipv6.conf
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.eth0.accept_ra=0
net.ipv6.conf.eth0.autoconf=0
答案1
看起来我错过了将 net.ipv6.conf.default.autoconf 设置为 1。在 /etc/sysctl.d 中添加一个文件以在启动时抑制这种情况解决了我的问题:
root@wopr:~# cat /etc/sysctl.d/ipv6.conf
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.eth0.accept_ra=0
net.ipv6.conf.eth0.autoconf=0
现在我得到了一个在启动时不会过期的默认路由。问题解决了。谢谢你为我指明了正确的方向,Sander。
答案2
1800 秒听起来像是路由器广告的默认超时时间。
我的第一个猜测是网络上有一个 Cisco 路由器,该路由器ipv6 nd ra suppress
在接口上配置了路由。在该模式下,当主机请求带有路由信息的路由时,路由器会发送路由信息,但不会定期刷新路由信息。主机在启动接口时会发送路由信息,这可以解释为什么它在启动后会获得默认路由。
该设置是 Cisco 的一个奇怪而无用的设置。路由器要么在被要求时定期发送 RA(Cisco 上的默认设置),要么根本不发送 RA(ipv6 nd ra suppress all
)。半途而废的设置ipv6 nd ra suppress
会导致类似这样的奇怪行为,不应使用。
答案3
实际上,标记的答案是错误的。问题在于 docker 在接口上启用了转发,这导致 Linux 内核忽略了该特定接口上的 RA,请参阅:https://www.mattb.net.nz/blog/2011/05/12/linux-ignores-ipv6-router-advertisements-when-forwarding-is-enabled/
因此,在这种情况下正确的解决方案是设置accept_ra
为2
:
# cat /etc/sysctl.d/ipv6.conf
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.eth0.accept_ra=2
而不是完全禁用路由发现。