Что же такое DNS? Теория
Domain Name System — система доменных имен — компьютерная распределенная система для получения информации о доменах. Спецификация: RFC 1034, RFC 1035 / STD 13
Для доменного имени может быть не меньше двух серверов DNS (одного master и от одного slave), на которых информация дублируется — таким образом обеспечивается отказоустойчивость.
Иерархия DNS
Это значит, что сервер DNS знает про домен (например, rublin.org.ua.). А если и не знает, то знает у кого спросить. Этот процесс происходит с конца:
- пользователь обращается к домену rublin.org.ua.
- отправляется запрос к DNS серверу провайдера, который, естественно, не знает никакого домена rublin.org.ua.
- сервер провайдера отправляет запрос на корневые сервера «.», но и они не знают этого домена, но знают зону ua.
- корневые сервера спрашивают у серверов зоны ua. Сервер зоны ua не знает домена, но знает зону org.ua.
- сервер зоны ua. спрашивает у сервера зоны org.ua. Там уже есть информация о домене — делегирован DNS сервером регистратора
- сервер зоны перенаправляет запрос на сервер регистратора и получает ответ, то домен rublin.org.ua. соответствует 89.184.73.125
Вот основная схема, которая объясняет иерархию в DNS. Могут быть исключения, когда у какого-то сервера закеширована информация. Тогда ответ получим быстрее.
И еще, для доменного имени может быть не меньше двух серверов DNS (одного master и от одного slave), на которых информация дублируется — таким образом обеспечивается отказоустойчивость.
Файл зоны
Зона — файл в котором описано соответствие хостов домена и их IP-адресов всех типов записей. Тоесть, файл зоны — основной файл домена, в котором описано все, что касается этого домена.
Типы записей DNS
SOA (Start Of Authority) — описывает «владельца» зоны и служебную информацию:
- Origin — доменное имя определенной оператором zone в named.conf. Это доменное имя является ключем к сокращениям в файле зоны и является суффиксом по умолчанию для всей информации в файле зоны. Маскируется под «собачку» @
- primary ns — первичный NS
- mail addr — Тут записан email адрес ответственного за зону. «Собачку» заменяет первая точка
- Serial — Серийный номер версии файла зоны; должен увеличиваться при каждом изменении в зоне — по нему вторичный сервер обнаруживает, что надо обновить информацию (заново скачать копию файла зоны). Обычно пишется в виде <год><месяц><число><номер изменения>
- Refresh — Временной интервал в секундах, через который вторичный сервер будет проверять необходимость обновления информации
- Retry — Временной интервал в секундах, через который вторичный сервер будет повторять обращения при неудаче
- Expire — Временной интервал в секундах, через который вторичный сервер будет считать имеющуюся у него информацию устаревшей
- Minimum — Значение времени жизни информации на кэширующих серверах ((ttl) в последующих записях ресурсов)
NS — Сервер Имен, описывает DNS-сервера содержащие (отвечающие за) данную зону
A — Адрес, содержит адрес указанного имени
CNAME (Canonical Name) — Каноническое имя, указывает псевдоним для официального имени хоста
MX (Mail Exchange) — Почтовый Сервер, такие записи используются для обозначения списка хостов, которые сконфигурированы для приема почты посланной на это доменное имя. Помимо адреса почтового сервера содержат числовое значение обозначающее приоритет, т.е. более низкие числа показывают более высокий приоритет, а приоритеты одинаковые отправители должны использовать в произвольном порядке хосты MX для равномерного распределения нагрузки
TXT — Текст, содержит текстовые данные любого вида. Применяется редко и специфичным образом
HINFO — Информация о Хосте, содержит некоторую информацию о машине, обычно — тип процессора и операционной системы, крайне редко используется
PTR — Pointer — указатель, служит для выполнения обратного преобразования IP-адресов в имена хостов
Важно! Файл зоны должен заканчиваться пустой строкой!
Настройки сервера DNS под FreeBSD. Практика
BIND доступен во FreeBSD «из коробки». Но перед настройкой нужно проверить версию:
named -v BIND 9.6.-ESV-R3
И при необходимости обновиться:
cd /usr/ports/dns/bind98/ && make rmconfig && make install clean
Не забываем включить опцию REPLACE_BASE.
Если получим ошибку (не понятно почему, но вылазит такое при первом запуске):
make: don't know how to make /usr/ports/dns/bind98/work/.install_done.bind98._usr_local. Stop *** Error code 2 Stop in /usr/ports/dns/bind98.
То нужно просто повторить запуск:
make install clean
Конфигурационный файл named.conf
Самый популярный вариант — свой NS обслуживает локальную сеть и свои зоны.
Мой конфиг имеет такой вид:
less /etc/namedb/named.conf
options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; listen-on { 127.0.0.1; ; }; disable-empty-zone "255.255.255.255.IN-ADDR.ARPA"; disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA"; disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA"; forwarders { 127.0.0.1; ; ; }; allow-recursion { 127.0.0.1; ; }; recursive-clients 30000; }; acl "trusted-dns" { 127.0.0.1; ; }; logging { category lame-servers { null; }; }; zone "." { type hint; file "/etc/namedb/named.root"; }; zone "0.0.127.IN-ADDR.ARPA" { type master; file "master/localhost.rev"; }; // RFC 3152 zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" { type master; file "master/localhost-v6.rev"; }; zone "rublin.org.ua" { type master; file "master/rublin.org.ua.zone"; allow-transfer { trusted-dns;}; };
Нужно создать (если их нет в /etc/namedb/master) файлы localhost.rev и localhost-v6.rev. Для этого выполним:
sh make-localhost
Файл зоны named
Теперь создадим файлы зон (для каждой зоны, указанной в конфиге). У меня вот как получилось:
less /etc/namedb/master/rublin.org.ua.zone
$TTL 3600 ; 1 hour @ IN SOA ns1.rublin.org.ua. admin.rublin.org.ua. ( 20110808001 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 3600 ; Minimum TTL ) ; DNS Servers @ IN NS ns1.rublin.org.ua. @ IN NS ns.secondary.net.ua. ; MX Records @ IN MX 10 mx1.rublin.org.ua. ; Machine Names @ IN A localhost IN A 127.0.0.1 ns1 IN A ns2 IN A mx1 IN A ; Aliases ;www IN CNAME @
Важно! Файл зоны должен заканчиваться пустой строкой!
Как видно из файла зоны, мой вторичный NS-сервер совсем не мой. Я воспользовался услугами Secondary.NET — они позволяют регистрировать вторичный NS, если настроен и доступен первичный.
Установка и настройка RNDC
Для удобства дальнейшего управления демоном named рекомендую использовать утилиту RNDC. Для этого запустим:
rndc-confgen
# Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "Lvekw+LSYvjc4MugWSXn/w=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "rndc-key" { # algorithm hmac-md5; # secret "Lvekw+LSYvjc4MugWSXn/w=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.conf
Вывод этой команды нужно использовать для редактирования конфигов. Все что от # Start of rndc.conf до # End of rndc.conf помещаем в /etc/named/rndc.conf. В итоге он такой:
less /etc/namedb/rndc.conf
key "rndc-key" { algorithm hmac-md5; secret "Lvekw+LSYvjc4MugWSXn/w=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; };
Все что от # Use with the following in named.conf, adjusting the allow list as needed: до # End of named.conf дописываем в конце named.conf, но без комментария (#). В итоге концовка моего конфига примерно такая:
less /etc/namedb/named.conf
****** zone "rublin.org.ua" { type master; file "master/rublin.org.ua.zone"; allow-transfer { trusted-dns;}; }; key "rndc-key" { algorithm hmac-md5; secret "Lvekw+LSYvjc4MugWSXn/w=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; };
Теперь читаем ман и учимся пользоваться. Ну а основные возможности такие:
rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command} reload - перечитать файл конфигурации и зон reload zone [class [view]] - перечитать файл зон retransfer zone [class [view]] - ретрансфер зоны без проверки серийника reconfig - перечитать конфиг и новый файл зоны (использовать при добавлении новой зоны) stats - писать статистику сервера в файл статистики stop - сохранить изменения в мастерфайл и потушить сервер halt - остановить сервер без сохранения flush - очистка кеша status - отобразить состояние сервера restart - рестарт сервера
Запуск и отладка named
Теперь в добавим записи для запуска:
echo 'named_enable="YES"' >> /etc/rc.conf echo 'named_program="/usr/sbin/named"' >> /etc/rc.conf echo 'named_flags="-u bind -c /etc/namedb/named.conf"' >> /etc/rc.conf
И настроем логирование. В /etc/syslog.conf допишем:
!named *.* /var/log/named.log
Создадим пустой файл лога и выставим права:
touch /var/log/named.log && chown bind:bind /var/log/named.log
Перезапустим процесс syslogd для того чтобы он перечитал конфиг:
/etc/rc.d/syslogd restart
Теперь все готово к запуску. Стартуем:
/usr/sbin/named -t /var/named -u bind -c /etc/namedb/named.conf
И в логах видим:
tail -F /var/log/named.log
Jun 15 19:31:46 rublin named[37338]: zone rublin.org.ua/IN: loaded serial 2011061502 Jun 15 19:31:46 rublin named[37338]: reloading zones succeeded Jun 15 19:31:46 rublin named[37338]: zone rublin.org.ua/IN: sending notifies (serial 2011061502)
Значит все ОК, named запущен и зона запущена.
Проверка работы named
Теперь мы можем изменить в /etc/resolv.conf сервер DNS на себя и проверить:
dig rublin.org.ua
; <<>> DiG 9.6.-ESV-R3 <<>> rublin.org.ua ;; global options: +cmd ;; Got answer: ;; ->>HEADER<
Источник : rublin.org/article/dns-na-freebsd-server-imen-named-teoriya-i-praktika
Проблема не стартует named, в /var/log/messages сыпется
ENGINE_by_id failed
initializing DST: crypto failure
# uname -r
8.2-RELEASE
# pkg_info | grep bind
bind99-base-9.9.2.1 BIND DNS suite with updated DNSSEC and DNS64
Решение:
cd /var/named
mkdir -p /var/named/usr/local/lib/engines
cp /usr/local/lib/engines/* /var/named/usr/local/lib/engines/
cp /usr/local/lib/libcrypto.so.8 /var/named/usr/local/lib/
ln -s /var/named/usr/local/lib/libcrypto.so.8 /var/named/usr/local/lib/libcrypto.so
ln -s /var/named/usr/local/lib/libcrypto.so.8 /var/named/usr/local/lib/libcrypto.so.7