我在虚拟服务器上运行 Debian 8。安装 docker 并启用 IPv6 后,我注意到一些奇怪的事情。我不知道docker是否与此有关,只是我安装后注意到了这个问题。
我的默认路由配置为在 ca 之后过期。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 说:
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
看起来我错过了 net.ipv6.conf.default.autoconf 设置为 1。在 /etc/sysctl.d 中添加一个文件以在启动时抑制它为我解决了这个问题:
现在我得到了一个不会在启动时过期的默认路由。问题解决了。谢谢你指出我正确的方向,桑德。
1800 秒听起来像是路由器通告的默认超时。
我的第一个猜测是网络上有一个 Cisco 路由器在
ipv6 nd ra suppress
接口上配置。在这种模式下,当主机请求一个带有 RS 的路由器时,路由器将发出一个 RA,但不会定期刷新它。主机在启动接口时会发送一个 RS,这可以解释为什么它在启动后会获得默认路由。该设置是一个奇怪的无用思科设置。路由器应该在被询问时+定期发送 RA(Cisco 的默认设置),或者根本不发送(
ipv6 nd ra suppress all
)。中途设置ipv6 nd ra suppress
会导致这样的奇怪行为,不应使用。实际上,标记的答案是错误的。问题是 docker 在接口上启用转发,这使得 Linux 内核忽略该特定接口上的 RA,请参阅:https ://www.mattb.net.nz/blog/2011/05/12/linux-ignores -ipv6-router-advertisements-when-forwarding-is-enabled/
因此,在这种情况下,正确的解决方案是设置
accept_ra
为2
:而不是完全禁用路由发现。