Любой уважающий себя админ обязан иметь хотя бы один ДНС сервер. Может придется домен регистрировать, может в интернет выпускать локалку, или сделать свою зону, или отдать кому-то поддомен. Мало ли что? Классическим ДНС сервером для unix систем является BIND (Berkley Internet Name Domain) или сокращенно named . В систему настройки ДНС исторически внеслись некоторые глупости, которые и по сей день вызывают недоумение у новичков, а потому, кто не понимает причины такого подхода, могут идти читать официальную документацию, а здесь вы видете шпаргалку, которую применяю я сам для своих нужд. Итак, сначала установим... А вот на самом деле, named уже есть в штатной установке FreeBSD, но мы уж поставим что-нибудь посвежее, если из портов, то:
root@localhost# cd /usr/ports/dns/bind9 && make install
Либо из пакетов (что совсем просто):
root@localhost# pkg_add -r bind9
Особенностью полной сборки является утилита rndc , управляющая демоном named. А посему нам придется сгенерировать пару ключей для rndc и правильно их прописать. Поскольку named - это штатный демон для FreeBSD, то его конфиг находится в /etc/namedb (а не в /usr/local/etc/named, как обычно). Итак запускаем rndc-confgen :
root@localhost# rndc-confgen # Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "zDfVVNmsufD3PYiGeXNlmw=="; }; 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 "zDfVVNmsufD3PYiGeXNlmw=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.conf
Как мы видим нам очень просто и наглядно дают понять что именно и в какой файл мы должны вписать, так и поступаем - тупо Copy/Paste в указанные файлы. Только не забываем, конечно, убрать комментарии ('#') в начале строки в named.conf. Cамое время вписать в /etc/rc.conf строку:
После чего лучше перегрузить компьютер, но если перезагружать очень не хочется, то можно запустить его командой /usr/sbin/named -t /var/named -u bind . Если на команду rndc reload сервер реагирует адекватно, значит все в порядке. ДНС может использоваться следующими способами: 1. Кеширующий ДНС 2. Мастер ДНС - главный держатель зоны 3. Подчиненный ДНС - умеет скачивать доверенную зону, хранить у себя и обслуживать ДНС запросы на эту зону. Итак наш named.conf:
#Это вносится от rndc-confgen key "rndc-key" { algorithm hmac-md5; secret "zDfVVNmsufD3PYiGeXNlmw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; # В trusted вносим сервера вторичные, провайдерские, те которые могут скачивать зоны, # то есть доверенные узлы. Остальным лишняя информация не нужна. acl "trusted" { 192.168.0.0/24; 127.0.0.1; 195.196.197.198; 195.196.197.199; 195.94.224.129; }; # Описываем общие опции для всех зон: options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; allow-transfer { trusted; }; # имеют права скачивать зону allow-query { any; }; # имеют право отпралять запрос allow-recursion { any; }; # не помню listen-on { any; }; # слушать ip со всех интерфейсов, query-source address * port 53; auth-nxdomain yes; version "WinDNS 1.01"; # Просто для прикола }; # как будут записываться логи logging { category lame-servers { null; }; category default { default_syslog;}; channel default_log { file "/var/log/dns.log"; severity notice; print-time yes; print-category yes; print-severity yes; }; category queries { default_log;}; category xfer-in { default_log; }; category xfer-out { default_log; }; category security { default_log; }; category resolver { default_log; }; category client { default_log; }; category unmatched { default_log; }; category default { default_log; }; category database { default_log; }; }; # Для кеширующего ДНС-а нужна такая запись: # должен быть файл /etc/namedb/named.root с корневыми DNS-ами zone "." { type hint; file "named.root"; }; # Зона локалхоста zone "localhost" { type master; file "localhost.zone"; }; # описываем обратную зону для локалхоста # для этого достаточно запустить скрипт sh /etc/namedb/make-localhost zone "0.0.127.IN-ADDR.ARPA" { type master; file "localhost.rev"; notify no; };
Файл /etc/named/localhost.zone
$ttl 1D @ IN SOA dommain.ru. admin.domain.ru. ( 2007110201 ;serial 108000 ;refresh 1800 ;retry 1209600 ;expiry 604800) IN NS @ IN A 127.0.0.1
Пояснения: 1 Строка: "$TTL 1D" - Time To Live 1 Day. Именно со строчки TTL должен начинаться файл зоны. В противном случае named его не прочитает 2 строка: "@" (собачка :) - означает описанную зону в named.conf, в нашем случае localhost, IN - без комментариев, SOA (start of autherity кажется) ответсвенный сервер, dommain.ru. - наш домен (обязательно с точкой), admin.domain.ru. - наше мыло (ибо собачка используется как имя зоны). Во второй строке обязательно должна присутсвовать SOA-запись . 3 строка: серийный номер для обновления. Если в зону вносятся любые изменения номер должен быть увеличен. Обычно, номер делают как ГГГГ-ММ-ДД 01-99. Благодря, такой нехитрой формуле можно гарантировать возрастающую уникальность серийного номера зоны. 4 строка: обновляться каждые 30 часов 5 строка: повтроять через полчаса 6 строка: истечение срока 1209600 сек = 2 недели 8 запись типа: " IN NS @ " - сокращенная, полная выглядит так: localhost. IN NS @ или @ IN NS @ что в сущности одно и то же из named.conf Этой строкой мы объясняем кто будет мастер-сервером ДНС (выражение IN NS) для этой зоны. Как оказывается он сам и будет. 9 запись типа " IN A 127.0.0.1" тоже сокращенная, полный вариант описан чуть выше. Этой строкой мы объясняем на какой ip-адрес мы присваиваем имя localhost. Синаксис достаточно труднопонимаемый, но принципиально несложный. Если изложено непонятно, то рекомендую почитать Handbook , написано как раз так, чтобы понял каждый. Итак, после такого конфига у нас должен быть работающий кеширующий DNS-сервер. Пробуем:
root@localhost# rndc reload server reload successful root@localhost# echo "nameserver\t127.0.0.1" > /etc/resolv.conf root@localhost# host mail.ru mail.ru has address 194.67.57.126 mail.ru has address 194.67.57.226 mail.ru has address 194.67.57.26 mail.ru mail is handled by 10 mxs.mail.ru.
В ответ на команду "host" приходит ответ, значит наш DNS на 127.0.0.1 работает. Вообщем, кеширующий ДНС мы запустили. Теперь самое время прописать какую-нибудь зону. Например ounix.ru - домен второго уровня, полностью принадлежит нам. Тогда в /etc/namedb/named.conf вписываем:
zone "ounix.ru" { type master; file "ounix.ru"; allow-transfer { trusted;}; };
А в файле "ounix.ru" мы уже описываем нашу зону и все её поддомены, NS и MX записи:
$TTL 38400 @ IN SOA ns1.ounix.ru. admin.ounix.ru. ( 2007102501 ;serial 108000 ;refresh 1800 ;retry 1209600 ;expiry 604800) @ IN NS ns1.ounix.ru. ; Первый (master) DNS сервер @ IN NS ns2.ounix.ru. ; Вторичный (slave) сервер зоны @ IN MX 10 mail.ounix.ru. ; MX-запись на поддомен mail, опишем чуть позже @ IN A 195.91.211.84 ; Сама зона присваивается машине 195.91.211.84 mail IN A 195.91.211.84 ; поддомен mail присваеваем ip 195.91.211.84 ns1 IN A 195.91.211.84 ; поддомен ns1 туда же ns2 IN A 195.94.224.129 ; а вот поддомен ns2 уйдет на другой сервер ftp IN A 195.91.211.84 ; Ну далее все должно быть понятно www IN A 195.91.211.84 dark IN A 195.91.211.84 unix IN A 195.91.211.84 test IN A 195.91.211.84 jabber IN A 195.94.224.129
Хочется обратить внимание что NS и MX записи могут быть только на доменные имена, но никак не на ip адреса. Если мы пишем имя хоста полностью, обязательно ставим точку в конце, в противном случае к записи без точки добавляется имя зоны. Например, "mail" тождественно "mail.ounix.ru." Таким образом, мы описали зону на master-сервере DNS. А как же вторичные сервера прописывают у себя зоны? А вот так:
zone "ounix.ru" { type slave; file "slave/ounix.ru"; masters { 195.91.211.84; }; };
Мы указали, что являемся подчиненным DNS сервером для этой зоны, что мастер у нас 195.91.211.84, что скачивать зону на ounix.ru надо с него, а хранить ее надо в /etc/namedb/slave/ounix.ru И после перезапуска BIND-а, если нигде нет ошибок, на подчиненном сервере появится копия файла зоны ounix.ru