Я запускаю Debian 8 на vServer. После установки докера и включения IPv6 я заметил кое-что странное. Я не знаю, имеет ли докер какое-либо отношение к этому, просто я заметил эту проблему после его установки.
Мой маршрут по умолчанию настроен на истечение примерно через 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]
Машина работает на хосте KVM, размещенном на netcup.de. Он использует драйвер 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
вирт-что говорит:
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 для подавления этого при загрузке решило проблему для меня:
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
Теперь я получаю маршрут по умолчанию, который не истекает во время загрузки. Задача решена. Спасибо, что указали мне правильное направление, Сандер.
1800 секунд звучит как тайм-аут по умолчанию для объявления маршрутизатора.
Я предполагаю, что в сети есть маршрутизатор Cisco, настроенный с помощью ipv6 nd ra suppress
на интерфейсе. В этом режиме маршрутизатор будет отправлять RA, когда хост запрашивает его с RS, но не обновляет его регулярно. Хост отправляет RS при вызове интерфейса, что объясняет, почему он получает маршрут по умолчанию после загрузки.
Эта настройка - странная бесполезная настройка Cisco. Маршрутизатор должен либо отправлять RA по запросу + регулярно (по умолчанию в Cisco), либо не отправлять вообще (ipv6 nd ra suppress all
). На полпути ipv6 nd ra suppress
вызывает такое странное поведение и не должен использоваться.
Собственно, отмеченный ответ неверен. Проблема в том, что докер позволяет пересылку интерфейса (ов), и это заставляет ядро 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
вместо того, чтобы полностью отключить обнаружение маршрута.