Динамическое изменение DNS записей в BIND.

В этой статье мы разберемся как динамически изменять записи на сервер BIND с помощью nsupdate. Или DynDNS на коленке ).

Допустим у нас есть компьютер с динамическим IP, но мы хотим что бы всегда был доступ из интернета к нему. Такой мини домашний сервер чего то там. Погуглив вы сразу найдете простой способ решить этот вопрос, DynDNS сервер\сервис. Но у нас есть свой сервер dns, как же на нем сделать все это не прибегая к сторонним сервисам ?

nsupdate — утилита входящая в пакет bind, для удаленного обновления dns записей на сервер с поддержкой dnssec. По этому на домашнем сервере(клиенте который будет обновлять свой IP при изменение) должен стоять bind.

Создание ключей.

Первым делом нам надо на клиенте(домашнем сервере, виртуальной машине и т.д.) сгенерировать ключи безопасности, которые будут использоваться для обновления DNS записей.

 dnssec-keygen -a HMAC-SHA256 -b 256 -n USER dyndns
  • -a algorithm (the named server supports hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384 and hmac-sha512).
  • -b keysize.
  • -n nametype ZONE (for a DNSSEC zone key (KEY/DNSKEY)), HOST or ENTITY (for a key associated with a host (KEY)), USER (for a key associated with a user(KEY)).
  • -K directory.

В результате у нас появиться два ключа типа : Kdyndns.+157+47946.key и Kdyndns.+157+47946.private. Тут все не сложно. key это публичный ключ который будем использовать на сервере dns. Второй приватный, который храниться в строгости у клиент )

Настройка сервера.

Теперь нам надо настроить сам сервер DNS. В файл named.conf добавим публичный ключ и право обновлять зону:

key dyndns {  # задаем сам ключ
algorithm hmac-sha256;
secret "LDpsgdfPPed[weTVjrJ4jfsjt6450234567="; # сам ключ из файла
Kdyndns.+157+47946.key(всё, что находится после числа 157 в файле .key)
};
zone exempel.com. {
type master;
file "exempel.zone";
allow-update { # Разрешаем обновление с индификацией по ключу.
key dyndns;};
};

­В данном случае пользователь с ключом может изменить любые записи зоны DNS. Что не очень безопасно, можно использовать вместо allow-update опцию update-policy .

 update-policy {
grant dyndns A; # Разрешаем изменять только А записи.
};

Не забудьте перезагрузить настройки сервера DNS

service bind9 reload

Обновление зоны.

Остался последний штрих. Созданим файл updane.zone на клиенте :

zone exempel.com 
update delete dyndns.exemple.com. A # Удаляем старую запись если была
update add dyndns.exemple.com. 60 IN A 45.255.13.13 # Добавляем новую запись
send

Теперь запускаем на клиенте nsupdate и обновляем данные о нашем IP на сервере.

nsupdate -k Kddserver.+157+47946.private -v update.zone

Вот и вся не сложная схема. Что бы доделать DynDNS на коленке вам осталось написать скрипт который будет автоматически обновлять записи при смене IP и добавить его запуск в cron.