В данном руководстве описано как настроить динамическое обновление зоны DNS с удаленной машины, например с DHCP сервера, или если адрес выдается динамически, как при использовании ADSL. Описано как простое обновление зоны вручную, или по крону, так и обновление зоны DHCP сервером при выдаче ip-адреса клиенту. Настройка идентична для всех дистрибутивов и ОС (Linux, FreeBSD, Mac OS и прочих систем где есть Bind9).Итак, у нас есть две машины, dns-сервер, и клиент, который будет обновлять зону в соответствии со своим ip-адресом.
На обоих машинах должен быть установлен bind9.
Настройку можно начать с генерации ключей, по которым будет происходить авторизация клиента на dns-сервере, в примере ниже показано как сгенерировать ключ, в примере я использую имя dnsupdater, вы можете поменять на нужное вам. Генерировать ключи нужно на машине клиенте.
dnssec-keygen -a hmac-md5 -b 128 -n USER dnsupdater
После выполнения команды в текущей директории вы найдете 2 файла с именем Kdnsupdater.+157+31204.key и Kdnsupdater.+157+31204.private, последние пять цифр в имени меняются каждый раз при генерации, и у вас они будут другие. Файл с расширением .key является публичным ключем, он используется на сервере dns, файл с расширением .private нужен для авторизации клиента.
Перейдем к настройке сервера, в директории с конфигурационными файлами bind9 (обычно это либо /etc/bind, /etc/namedb, /var/named)
Я настраивал сервер на линуксе, там это была директория /etc/bind, я буду использовать ее в этом руководстве.
Создайте файл dnskeys.conf в директории /etc/bind, затем впишите туда данные о нашем ключе, сгенерированном на машине клиента
# cat Kdnsupdater.+157+31204.key
dnsupdater. IN KEY 0 3 157 YmEIxrGd1w1dT6Kyo9CQtQ==
Так выглядит наш ключ, нам нужна только часть после цифры 157, а именно YmEIxrGd1w1dT6Kyo9CQtQ== (она каждый раз новая, у вас будет другая)
В файл /etc/bind/dnskeys.conf впишите следующее (замените имя ключа и secret на ваши)
key dnsupdater {
algorithm hmac-md5;
secret «YmEIxrGd1w1dT6Kyo9CQtQ==«;
};
Затем в файл /etc/bind/named.conf впишите в самый конец файла
include "/etc/bind/dnskeys.conf";
Затем настроим зоны которые будут обновляться удаленно, в моем примере это зона для домена example.com и зона для обратных записей для адресов 192.168.0.0/24, ниже приведены примеры сразу для двух этих зон, обратите внимание на то, что файлы зон для обновления должны быть созданы заранее, в них должны быть прописаны SOA , NS, SERIAL и прочие стандартные настройки зоны.
zone "example.com" {
type master;
file "master/example.com"
allow-update { key dnsupdater; };
};
zone "0.168.192.in-addr.arpa" {
type master;
file "master/ptr/0.168.192.in-addr.arpa";
allow-update { key dnsupdater; };
};
После этого выполните команду rndc reload для применения настроек.
Небольшое отступление, если у вас установлена операционная система Ubuntu или Debian, или у вас в системе используется apparmor то вам необходимо перенастроить его, так как пользователь от которого работает DNS сервер bind9 не имеет права записи в каталог с файлами конфигурации /etc/bind, а удаленное обновление зон как раз требует возможности записи в этот каталог от пользователя bind. Исправить это можно отредактировав конфигурационный файл apparmor для ограничения bind, найти его можно в директории /etc/apparmor.d/, имя файла usr.sbin.named. Отредактируйте файл как показано в примере ниже
Значение по умолчанию:
/etc/bind/** r,
Должно быть:
/etc/bind/** rw,
После этого перезапустите apparmor и bind9.
Теперь сервер готов к удаленному обновлению зон, перейдем к конечной настройке клиента.
Создадим простой скрипт который будет парсить файл с командами для обновления зон, в нем нам понадобится путь до второго ключа, с расширением .private, вы можете положить его в директорию /etc/bind, и не забудьте сменить имя ключа в скрипте на ваше.
#!/bin/bash
/usr/bin/nsupdate -k /etc/bind/Kdnsupdater.+157+31204.private -v $1
Сохраним данный скрипт с именем zonechange.sh и сделаем его исполняемым командой chmod +x zoneupdate.sh
Затем создадим файл обновления зон, обновлять можно сразу несколько зон, по очереди. В примере мы добавим обратную зону для адреса 192.168.0.1, удалим обратную зону для адреса 192.168.0.15, и добавим поддомен test.example.com. Для обновления существующих записей нужно сначала удалить старую, затем добавить новую.
server ns.example.com
zone 0.168.192.in-addr.arpa
update delete 15.0.168.192.in-addr.arpa. 10800 IN PTR somedomain.example.com.
update add 1.0.168.192.in-addr.arpa. 10800 IN PTR somedomain123.example.com.
send
zone example.com
update add test.example.com. 10800 IN A 192.168.0.254
send
Как видите, необходимо записи для обратной зоны и поддоменов указывать полностью, и перед сменой зоны отправлять обновление для предыдущей. Так же необходимо указывать TTL для каждой записи. Сохраните файл с именем changes, или любым вам удобным, в директории со скриптом zonechange.sh.
Проверим работоспособность скрипта, выполните нижеприведенную команду для отправки запроса на обновление наших зон на сервер
./zonechanhe.sh changes
Если все прошло успешно никакого вывода не последует, на сервере в логах можно будет увидеть подробности изменения зон. У меня на сервере записи в файлах внесенные удаленно появляются только после рестарта bind9, но работать начинают сразу после отправки обновления с клиента, так что проверяйте работу обновления не по наличию записи в файлах зон, а по запросу данной записи с сервера посредством nslookup или dig.
Теперь можно перейти к настройке обновления записей зон при помощи dhcp сервера. Настройки DNS мы менять не будем, они описаны выше, поэтому мы будем пользоваться ими. Ключи так же возьмем из примеров выше. Настройка описана для DHCP сервера isc dhcp3
В глобальные опции DHCP сервера внесите следующие правки (файл конфигурации dhcpd.conf)
ddns-update-style interim;
# Включение обновления dns записей для статично прописанных хостов
update-static-leases on;
Затем добавим информацию о зонах которые будем обновлять, и информацию о ключе для авторизации.
Обратите внимание, записи о зонах и ключе вносятся так же как в конфиге bind, но БЕЗ кавычек, в противном случае у вас будет ошибка синтаксиса.
key dnsupdater {
algorithm hmac-md5
secret YmEIxrGd1w1dT6Kyo9CQtQ==;
}
zone 0.168.192.in-addr.arpa {
primary ns.example.com;
key dnsupdater;
}
zone example.com {
primary dns;
key dnsupdater;
}
Далее пример конфига для клиента без фиксированного ip адреса
host happylaptop {
hardware ethernet 00:0a:39:22:da:39;
option host-name "happylaptop";
option domain-name "example.com";
ddns-hostname "happylaptop";
ddns-domain-name "example.com";
}
Затем идет пример для группы хостов, или секции group в dhcpd.conf
group {
option domain-name "example.com";
ddns-domainname "example.com";
host happylaptop {
hardware ethernet 00:0a:39:22:da:39;
option host-name "happylaptop";
ddns-hostname "happylaptop";
}
host dellstation {
hardware ethernet 00:b1:48:2a:ad:9c;
option host-name "dellstation";
ddns-hostname "dellstation";
}
}
Далее идет пример клиента со фиксированным ip адресом
host jukebox {
hardware ethernet 01:d0:06:b8:68:34;
fixed-address 192.168.0.5;
ddns-hostname "jukebox";
ddns-domain-name "example.com";
option host-name "jukebox";
option domain-name "example.com";
}
После сохранения настроек не забудьте перезапусить DHCP-сервер.
Ссылки по теме:
* http://www.semicomplete.com/blog/articles/dynamic-dns-with-dhcp
* http://ubuntuforums.org/showthread.php?t=713469
URL: http://sudouser.com/nastrojka-dynamic-dns-na-baze-bind9-i-ns...
Обсуждается: http://www.opennet.dev/tips/info/2349.shtml