DNS на FreeBSD. Сервер имен named. Теория и практика

Что же такое DNS? Теория

Domain Name System — система доменных имен — компьютерная распределенная система для получения информации о доменах. Спецификация: RFC 1034, RFC 1035 / STD 13

Для доменного имени может быть не меньше двух серверов DNS (одного master и от одного slave), на которых информация дублируется — таким образом обеспечивается отказоустойчивость.

Иерархия DNS

Это значит, что сервер DNS знает про домен (например, rublin.org.ua.). А если и не знает, то знает у кого спросить. Этот процесс происходит с конца:

  1. пользователь обращается к домену rublin.org.ua.
  2. отправляется запрос к DNS серверу провайдера, который, естественно, не знает никакого домена rublin.org.ua.
  3. сервер провайдера отправляет запрос на корневые сервера «.», но и они не знают этого домена, но знают зону ua.
  4. корневые сервера спрашивают у серверов зоны ua. Сервер зоны ua не знает домена, но знает зону org.ua.
  5. сервер зоны ua. спрашивает у сервера зоны org.ua. Там уже есть информация о домене — делегирован DNS сервером регистратора
  6. сервер зоны перенаправляет запрос на сервер регистратора и получает ответ, то домен 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/ &amp;&amp; make rmconfig &amp;&amp; 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"' &gt;&gt; /etc/rc.conf
echo 'named_program="/usr/sbin/named"' &gt;&gt; /etc/rc.conf
echo 'named_flags="-u bind -c /etc/namedb/named.conf"' &gt;&gt; /etc/rc.conf

И настроем логирование. В /etc/syslog.conf допишем:

!named
*.* /var/log/named.log

Создадим пустой файл лога и выставим права:

touch /var/log/named.log &amp;&amp; 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
; &lt;&lt;&gt;&gt; DiG 9.6.-ESV-R3 &lt;&lt;&gt;&gt; rublin.org.ua
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;

Источник : rublin.org/article/dns-na-freebsd-server-imen-named-teoriya-i-praktika

Запись опубликована в рубрике *Unix,*Linux, FreeBSD. Добавьте в закладки постоянную ссылку.

Один комментарий на «DNS на FreeBSD. Сервер имен named. Теория и практика»

  1. m говорит:

    Проблема не стартует 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91