Нюанс с IPv6 и Duplicate Address Detection

Опубликовано 25 Июня, 2023 под тегами IPv6, DAD

Долго не мог понять что не так с моим 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 завершится.

Может кому-то эта заметка сэкономит полчаса времени.