В этой статье мы разберемся как динамически изменять записи на сервер 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.
можно не городить связку ключей из dnssec-keygen
есть простая утилита tsig-keygen, которая сразу генерирует кусок конфига с ключом:
~ $ /usr/sbin/tsig-keygen
key «tsig-key» {
algorithm hmac-sha256;
secret «HE5t22HuE5GOfnWCeimhhtK5d10CnW2K5frkEOK+1DU=»;
};