Нюанс с IPv6 и Duplicate Address Detection
Долго не мог понять что не так с моим ipv6: после смены конфигурации несколько минут ничего не пингуется, сеть не работает, хотя адрес и роут присвоены. Раньше, в стародавние времена, когда ipv4 ещё не кончились, такого не наблюдалось. Грешил на systemd-networkd, но он тут, оказывается, ни при чём.
С какого-то момента (не уверен с какого, но подозреваю где-то года с 2016-го), даже если адрес сконфигурирован вручную, запускается алгоритм duplicate address detection, и он, как показывает практика, чертовски не быстро работает, как минимум в некоторых случаях (в каких именно – надо потратить пол-дня на отладку, я пока не готов).
Можно его нафиг выключить через sysctl:
sysctl -w net.ipv6.conf.all.accept_dad=0
sysctl -w net.ipv6.conf.default.accept_dad=0
sysctl -w net.ipv6.conf.<interface>.accept_dad=0
(да, нужно устанавливать и в all
и прямо на интерфейсе, потому что эффективное значение – max(all,<interface>)
)
Но есть более удачная версия, Optimistic DAD. В ядре включается опцией CONFIG_IPV6_OPTIMISTIC_DAD
, а в sysctl соответственно net.ipv6.conf.<interface>.optimistic_dad
. Тогда адрес можно будет использовать ещё до того как DAD завершится.
Может кому-то эта заметка сэкономит полчаса времени.