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] 1 に設定されていることを見逃していたようです。net.ipv6.conf.default.autoconf起動時にこれを抑制するために、/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。そのモードでは、ホストが RS で RA を要求するとルータは RA を送信しますが、定期的に更新しません。ホストはインターフェイスを起動するときに RS を送信します。これが、起動後にデフォルト ルートを取得する理由です。

この設定は、奇妙で役に立たない Cisco 設定です。ルータは、要求されたときに RA を定期的に送信するか (Cisco のデフォルト)、まったく送信しないかのいずれかになります ( 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

ルート検出を完全に無効にする代わりに。

関連情報