Debian / IPv6:默认路由在 1800 秒后过期,失去连接

Debian / IPv6:默认路由在 1800 秒后过期,失去连接

我在 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_ra2

# 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

而不是完全禁用路由发现。

相关内容