Обновление динамических зон DNS с помощью nsupdate

Одна из зон сервера сделана динамической, для автоматического получения сертификатов от Let’s Encrypt. Она не применяется для других целей, но тоже иногда требует обновления данных.

Посмотреть текущее содержимое зоны можно из командной строки, в нашем случае доступ организован только из командной строки самого сервера.

host -l -a ad-easy.ru
Trying "ad-easy.ru"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15914
;; flags: qr aa ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ad-easy.ru.                    IN      AXFR

;; ANSWER SECTION:
ad-easy.ru.             3600    IN      SOA     ns0.ad-easy.ru. hostmaster.ad-easy.ru. 2020110657 43200 7200 1209600 86400
ad-easy.ru.             3600    IN      NS      ns0.net-easy.ru.
ad-easy.ru.             3600    IN      NS      ns1.net-easy.ru.
ad-easy.ru.             3600    IN      A       78.46.77.166
ad-easy.ru.             3600    IN      MX      10 mx.ad-easy.ru.
ftp.ad-easy.ru.         3600    IN      CNAME   www.ad-easy.ru.
imap.ad-easy.ru.        3600    IN      A       5.9.71.4
mail.ad-easy.ru.        3600    IN      A       5.9.71.4
mx.ad-easy.ru.          3600    IN      A       5.9.71.4
ns0.ad-easy.ru.         3600    IN      A       78.46.77.166
ns1.ad-easy.ru.         3600    IN      A       159.69.222.21
smtp.ad-easy.ru.        3600    IN      A       5.9.71.4
www.ad-easy.ru.         3600    IN      A       78.46.77.166
ad-easy.ru.             3600    IN      SOA     ns0.ad-easy.ru. hostmaster.ad-easy.ru. 2020110657 43200 7200 1209600 86400

В данном случае, проще сказать, что же тут правильного? Практически вся зона нуждается в корректировке.

Делаем простой скрипт, что бы не вводить длинные пути руками.

root@main:/usr/local/etc/namedb # vim dzone_update.sh

#!/bin/sh
export LANG=C # disable current os localization

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

keyfile='/usr/local/etc/namedb/keys/update.key'
updscript='./zoneupd.txt'
/usr/local/bin/nsupdate -k $keyfile $updscript

chmod +x dzone_update.sh

В том же каталоге заводим текстовый файл zoneupd.txt в котором и пропишем команды для nsupdate.

vim zoneupd.txt

server 127.0.0.1
zone ad-easy.ru
update delete ad-easy.ru.       3600    IN      SOA
update add ad-easy.ru.  3600    IN      SOA     ns0.net-easy.ru. info.net-easy.ru. 2022031801 43200 7200 1209600 86400
show
send
answer
update delete ad-easy.ru.       IN      A
update add ad-easy.ru.  3600    IN      A       83.222.15.147
update delete ftp.ad-easy.ru.   IN      CNAME
update delete imap.ad-easy.ru.  IN      A
update delete mail.ad-easy.ru.  IN      A
update delete mx.ad-easy.ru.    IN      A
update delete ns0.ad-easy.ru.   IN      A
update delete ns1.ad-easy.ru.   IN      A
update delete smtp.ad-easy.ru.  IN      A
update delete www.ad-easy.ru.   IN      A
update delete ad-easy.ru.       IN      MX
update add ad-easy.ru.  3600    IN      MX      10      mx.net-easy.ru.
show
send
answer

Вносить изменения при изменении SOA, лучше двумя сообщениями. При добавлении SOA необходимо руками внести новый серийный номер для зоны. В данном случае он выделен жирным шрифтом. При изменении записей других типов серийный номер изменится автоматически.

В первой строке указывается сервер, с которым мы планируем работать. Скрипт надо выполнять там, где располагается первичный DNS сервер.

Во второй строке указана зона, в которую необходимо внести изменения.

Третья строка удалает запись типа SOA с неактуальными данными.

Четвёртая строка добавляет эту запись, но уже исправленную. Запись типа SOA может быть только одна, потому можно обойтись и одной строкой, которая добавляет нужную запись, с нужным серийным номером. Она перезапишет старые данные.

Сообщение для сервера сформировано и команда show отобразит его на экране. Далее команда send передаст его серверу DNS и команда answer покажет результат работ.

Запускаем скрипт: ./dzone_update.sh

Результат выполнения данного скрипта:

Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;ad-easy.ru.                    IN      SOA

;; UPDATE SECTION:
ad-easy.ru.             0       ANY     SOA
ad-easy.ru.             3600    IN      SOA     ns0.net-easy.ru. info.net-easy.ru. 2022031801 43200 7200 1209600 86400

Answer:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  63841
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;ad-easy.ru.                    IN      SOA

;; TSIG PSEUDOSECTION:
update.                 0       ANY     TSIG    hmac-sha512. 1647588662 300 64 LqBunHp98nLAOwMWNX+iml2w72fCtX7lkVuyMuTHD
5HTAoklM4KOb2XA lwA6VoCXcY0dDOj6JSNLz94nJQq3IQ== 63841 NOERROR 0 

Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;ad-easy.ru.                    IN      SOA

;; UPDATE SECTION:
ad-easy.ru.             0       ANY     A
ad-easy.ru.             3600    IN      A       83.222.15.147
ftp.ad-easy.ru.         0       ANY     CNAME   
imap.ad-easy.ru.        0       ANY     A
mail.ad-easy.ru.        0       ANY     A
mx.ad-easy.ru.          0       ANY     A
ns0.ad-easy.ru.         0       ANY     A
ns1.ad-easy.ru.         0       ANY     A
smtp.ad-easy.ru.        0       ANY     A
www.ad-easy.ru.         0       ANY     A
ad-easy.ru.             0       ANY     MX
ad-easy.ru.             3600    IN      MX      10 mx.net-easy.ru.

Answer:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  55810
;; flags: qr; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;ad-easy.ru.                    IN      SOA

;; TSIG PSEUDOSECTION:
update.                 0       ANY     TSIG    hmac-sha512. 1647588662 300 64 2FEFYEPVcYo4mFLE2jY+q+uzObswcYbrE5Fjc/lzz
aDu9KKgyz0g551L WfYKcvubhzJam58yfdjIDxXorh6FpQ== 55810 NOERROR 0 

Теперь можно запросить вторичный сервер DNS и убедиться, что зона распространилась и изменения внесены успешно.

host -l -a ad-easy.ru. ns1.net-easy.ru

Trying "ad-easy.ru"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41157
;; flags: qr aa ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ad-easy.ru.                    IN      AXFR

;; ANSWER SECTION:
ad-easy.ru.             3600    IN      SOA     ns0.net-easy.ru. info.net-easy.ru. 2022031802 43200 7200 1209600 86400
ad-easy.ru.             3600    IN      NS      ns0.net-easy.ru.
ad-easy.ru.             3600    IN      NS      ns1.net-easy.ru.
ad-easy.ru.             3600    IN      A       83.222.15.147
ad-easy.ru.             3600    IN      MX      10 mx.net-easy.ru.
ad-easy.ru.             3600    IN      SOA     ns0.net-easy.ru. info.net-easy.ru. 2022031802 43200 7200 1209600 86400

Received 187 bytes from 127.0.0.1#53 in 0 ms

Приятной работы.