Понадобилось мне применять изменения в динамической зоне на сервере, где установлен dns-сервер BIND. Можно, конечно, подредактировать сам файл зоны, а потом перезапустить named или средствами rndc перечитать зону из файла. Это без проблем работает со статической зоной, но в динамической не катит, т.к. в файле зоны хранится не последняя версия зоны, есть ещё дополнения с расширениями jbk и jnl. Поэтому используем правильный метод средствами nsupdate.
Сперва нужно создать сам ключ. Ранее ключ создавался средствами dnssec-keygen, однако сейчас уже это делать не рекомендуется и в будущем данная возможность из утилиты dnssec-keygen выпилится. Поэтому сделаем так:
$ tsig-keygen -a HMAC-SHA512 dnsupdater > dnsupdater.key $ more dnsupdater.key key "dnsupdater" { algorithm hmac-sha512; secret "8k6iPPHUlSaUKhvuVYbPbvTkWYA7qF/vB+y54 /blT9mmDkSC3595IRhJAsq0iJG90J+2SWcZXuqCNMWeyrygqg=="; };
Пояснения: -a — задаёт алгоритм ключа, dnsupdater — имя ключа; dnsupdater.key — имя файла, где сохранится ключ. Для подробностей юзать man tsig-keygen.
Теперь этот ключ нужно подсунуть dns-серверу. Можно конечно содержимое файла просто подсунуть в named.conf, но это опять не кошерный вариант. Поступим правильно — добавим в конфиг named.conf строку:
include "/usr/local/etc/namedb/keys.conf"
а уже в файле /usr/local/etc/namedb/keys.conf будет наш ключ:
# cat dnsupdater.key >> /usr/local/etc/namedb/keys.conf # chown root:wheel /usr/local/etc/namedb/keys.conf # chmod 600 /usr/local/etc/namedb/keys.conf
После данных манипуляций файл с ключами может прочитать только root, тогда как named.conf прочитать можно всем. При запуске демон named прочитает ключи под root-ом однократно, а далее будет работать под пользователем bind.
Следующий этап — настройка dns-сервера для управления зоной. Для этого нужно править в файле named.conf раздел требуемой зоны. Добавим туда следующее:
update-policy { grant dnsupdater wildcard *.domain.com. ANY; grant dnsupdater name domain.com ANY; };
Получиться следующий раздел:
zone "domain.com" { type master; file "/usr/local/etc/namedb/dynamic/domain.com.db"; update-policy { grant dnsupdater wildcard *.domain.com. ANY; grant dnsupdater name domain.com ANY; }; };
Перезапускаем dns-сервер — named готов к управлению.
Ну а теперь меняем что-то в зоне. Например поменяем содержимое SOA
$ dig soa domain.com ... ANSWER SECTION: domain.com. 259200 IN SOA server1.domain.com. hostmaster.domain.com. 22 86400 43200 604800 10800 ;; Query time: 0 msec ... $ nsupdate -k dnsupdater.key > zone domain.com > update delete domain.com SOA server1.domain.com hostmaster.domain.com. 22 86400 43200 604800 10800 > update add domain.com 259200 SOA server2.domain.com hostmaster.domain.com. 23 86400 43200 604800 10800 > send quit $ dig soa domain.com ... ;; ANSWER SECTION: domain.com. 259200 IN SOA server2.domain.com. hostmaster.domain.com. 23 86400 43200 604800 10800
Всё работает.