Mar. 16th, 2026

В одной из локаций ростелек даёт мне аж "/56"-подсеть. А я её никак не использую. Нехорошо. Решил это исправить. Но есть проблема: она динамическая. То есть после отключения электропитания или просто после реконнекта адреса могут измениться. И зафиксировать их никак нельзя. Значит нужен Dynamic DNS.

Вопрос условно делится на три части.

  1. Узнать что IP-адрес изменился.
  2. Узнать новый IP-адрес.
  3. Скормить его в DynDNS.

И задачка со звёздочкой: настроить временные IPv6-адреса, они же IPv6 Privacy Extensions по той же схеме. Не спрашивайте зачем. Может быть потом расскажу.

За основу настройки сети у меня взят systemd-networkd. Потому что в ifupdown-* невозможно узнать когда сеть реально настроена (нет механизма состояний), а NetworkManager меня бесит, хотя в чём-то он очень удобен. И тут кроется первая засада.

Формально для отслеживания состояния networkd существует специально обученная софтина "networkd-dispatcher". Однако она питонописная (читай: прожорливая по памяти) и выдаёт довольно куцые результаты. Поэтому была найдена другая, rustаманская, под названием "networkd-broker" (готовых deb-пакетов с ней нет, не ищите).

Вторая засада связана с той самой rustаманской софтиной: она выдает IPv6-адреса не в виде привычной строки, а в виде массива десятичных значений. То есть для дальнейшего использования его нужно ещё сконвертировать в HEX (не путать с НЁХ).

И третья засада, которую я разглядел слишком поздно. Временными адресами рулит ядро, а не networkd. Поэтому последний не присылает никаких DBus-событий по факту изменения временного адреса. Но к этому времени скрипты уже были написаны, так что переделывать я их не стал. А просто добавил ещё костылей (больше костылей богу костылей!).

Итак, скрипт для network-broker.

Проверяем что речь идет о нужном интерфейсе и нужном событии (ens19, routable). Парсим полученный от брокера JSON на предмет temporary-адреса. Если такового нет, берем постоянный. Дальше некий изврат по конвертации массива десятичных значений в шестнадцатеричный адрес. На выходе в переменной "${ADDR}" получаем готовый к последующему использованию адрес.

Но как я уже упоминал, при первом запуске брокер всё отдаст в лучшем виде, а вот об изменениях ничего не сообщит. Значит нужно его держать не в виде демона, а пинать принудительно. Для этого пишем сами другой [дерьмо]демон на всё том же bash-е.

И пихаем его в systemd. Он будет дёргать нашего брокера. Вообще говоря, при таком раскладе брокер становится не особо-то и нужен. Более того, даже проще будет вместо него накорябать очередной bash-скрипт: не придется с этой конвертацией из DEC в HEX заморачиваться. Но раз уж всё равно сделал, пофиг, пусть остается как есть.

IP Monitor отслеживает изменения temporary-адреса, брокер его сообщает. Осталось запихнуть его в DynDNS. Я у себя использую knot. Мне он чё-то понравился. Процесс внесения изменений в динамическую зону в нём реализован достаточно легко и приятно по сравнению с тем же bind9. В скрипте ниже предполагается, что в ключе запуска уже присутствует правильное значение адреса, которое нам не нужно дополнительно проверять. В моём примере Primary DNS Server для зоны "foo.staser.ru" находится на той же самой виртуалке, на которой я провожу эксперименты.

Готово. Вообще говоря, IPv6 Privacy Extensions по-хорошему совсем не предназначены для того, чтобы навешивать на них какие-либо сервисы. Более того, прежний временный адрес не удалится до тех пор, пока с его участием имеются какие-либо активные соединения. Возникает неиллюзорный риск поиметь на интерфейсе чёртову тонну таких временных адресов. Так что вот этот мой псто смело можно относить к категории "потные извращения".

Но раз я подобным озаботился, значит зачем-то оно мне стало нужно... пусть будет интрига.

Profile

Sergeich

March 2026

S M T W T F S
12345 6 7
8 91011 121314
15 16 17 18 1920 21
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 23rd, 2026 08:01 am
Powered by Dreamwidth Studios