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

FreeBSD Logo

Наш FreeBSD сервер поднят, обновлен и ядро пересобрано. Теперь можно и с сервисами поиграться. Давно хотел разобраться с DNSами. Разберем теорию (нужно же понимать о чем идет речь) и практику - собственно запустим свой DNS. Зачем? В хазяйстве все пригодиться. Да и домен в зоне org.ua. поучимся регистрировать "нашару".

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

Настройки сервера DNS под FreeBSD. Практика

Что же такое 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/ && 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; <ip вашего интерфейса>; };

        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; <DNS1 вашего провайдера>; <DNS2 вашего провайдера>;
        };

allow-recursion {
        127.0.0.1;  <ip локалки (если есть);>;
};
        recursive-clients 30000;
};
 acl "trusted-dns" {
        127.0.0.1; <ip вторичного DNS>;
};
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       <ip>
localhost       IN      A       127.0.0.1
ns1             IN      A       <ip>
ns2             IN      A       <ip>
mx1             IN      A       <ip>

; 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<<- opcode: QUERY, status: NOERROR, id: 50809
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;rublin.org.ua.                 IN      A

;; ANSWER SECTION:
rublin.org.ua.          3600    IN      A       192.168.67.99

;; AUTHORITY SECTION:
rublin.org.ua.          3600    IN      NS      ns.secondary.net.ua.
rublin.org.ua.          3600    IN      NS      ns1.rublin.org.ua.

;; ADDITIONAL SECTION:
ns1.rublin.org.ua.      3600    IN      A       192.168.1.2
ns.secondary.net.ua.    3600    IN      A       195.149.112.1

;; Query time: 14 msec
;; SERVER: 192.168.67.99#53(192.168.67.99)
;; WHEN: Wed Jun 15 19:38:41 2011
;; MSG SIZE  rcvd: 115

В выводе получили именно то, что прописывали. Сервер настроен правильно и функционирует.

9 коментарів

by Nikolas on Втр, 02/14/2012 - 16:23

Как теперь правильно настроить вторичный ДНС?

by rublin on Срд, 02/15/2012 - 11:49

Настройка вторичного ДНС ничем не отличается от первичного. Разница только в файле конфигурации (/etc/namedb/named.conf): нужно прописать тип зоны "slave":

zone "example.org" {
type slave;
file "slave/example.org";
};

Естественно, вторичный сервер должен быть в trusted-dns для первичного.

by Nikolas on Ндл, 02/19/2012 - 14:04

Все ок. Спасибо. Так и есть.

by zerofx on Сбт, 11/24/2012 - 14:40

а как быть с такой ситуацией когда доменное имя сайта зарегистрировано в на платном хостинге - и надо его перенести на сей сервер? под сервером я имел в виду тот сервер который стоит например у меня в оффиси (FreeBSD + Rial_IP)

by rublin on Чтв, 11/29/2012 - 15:49

Домен зарегистрирован, скорее, у регистратора, а не у хостера (хотя это может быть и одна контора).

В чем вопрос? Использовать свои НСы?

Настраиваете зону на своих серверах и прописываете IP своих серверов в настройках домена - регистратор подскажет.

by Rini on Птн, 04/11/2014 - 20:15

А как же обратная зона?

by rublin on Птн, 04/11/2014 - 21:40

Обратной зоной заведует ISP (провайдер). Я не ISP, по этому не было необходимости в обратной зоне.

by Artym on Сбт, 01/09/2016 - 01:41

Здравствуйте! Я вижу у вас прописан mx, нормально почта ходит без обратной зоны?

by rublin on Пн, 01/11/2016 - 15:42

Как я писал выше, обратной зоной (PTR запись) заведует тот, кто выдает IP адресс (провайдер). Без этой записи почта не будет работать нормально, так как очень много почтовых серверов ее проверяют.

Но нужно понимать, что не вы настраиваете PTR запись у себя на NSах, а провайдер это делает для вас.

Post new comment

Filtered HTML

  • Адреси сторінок і електронної пошти атоматично перетворюються у посилання.
  • Дозволені теги HTML: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Рядки та параграфи відокремлюються автоматично.

Plain text

  • HTML теґи не відображаються
  • Рядки та параграфи відокремлюються автоматично.
By submitting this form, you accept the Mollom privacy policy.
© rublin.org, 2009 - 2015 Буду вдячний за зворотнє посилання, при використанні матеріалів сайту. Powered by Rublin Team.