Настройка DNS -сервера BIND

Основная цель DNS — это отображение доменных имен в IP адреса и наоборот — IP в DNS.

BIND (Berkeley Internet Name Domain, до этого: Berkeley Internet Name Daemon) — открытая и наиболее распространённая реализация DNS-сервера

# named -v
BIND 9.4.3-P2

Расположение файлов BIND:

> tree /var/named/
/var/named/
|-- dev
|-- etc
|   `-- namedb #Каталог, в котором располагается вся информация о зонах BIND
|       |-- dynamic
|       |-- master
|       |   |-- empty.db
|       |   |-- localhost-forward.db
|       |   `-- localhost-reverse.db
|       |-- named.conf #Конфигурационный файл для даемона
|       |-- named.root 
|       `-- slave
`-- var
    |-- dump
    |-- log
    |-- run
    |   `-- named
    `-- stats

Разрешаем запуск DNS сервера:

# echo 'named_enable="YES"' >> /etc/rc.conf

Синтаксис файлов зон

  • ; - комментарий
  • @ - символ подставновки. Подставляется имя домена из named.conf (название файла зоны) или если задан переменная $ORIGIN
  • () - используется для переноса длинных строк.

named.root или db.root обновление

Файл named.root (db.root) содержит списки корневых серверов Раздел DNS: Что такое DNS. Этот файл меняется достаточно редко, но его последнюю официальную версию всегда можно скачать с ftp.internic.net (ftp.rs.internic.net). Содержимое db.root (иногда называемого named.ca для "certifying authority") носит достаточно специальный характер. Оно представляет из себя описание набора канонических корневых серверов, собственно регистрирующих домены.

> pwd
/var/named/etc/namedb
> fetch ftp://ftp.internic.net/domain/named.root
named.root                                    100% of 2994  B 4470 kBps

resolv.conf

Редактируем файл /etc/resolv.conf: первый DNS сервер это закольцовывание на ваш локальный сервер DNS (127.0.0.1), вторым ближайший к вам DNS сервер (обычно предоставляется вашим провайдером интернета), список остальных DNS на ваше усмотрение (они не являются обязательными). Файл resolv.conf, говорит нам о том, что в случае неудачного DNS запроса к вашему серверу (127.0.0.1), запрос будет автоматически переадресован ко второму по списку DNS серверу и т.д..

> ee /etc/resolv.conf
domain  your.domen
nameserver      127.0.0.1
#DNS your ISP
nameserver      x.x.x.x
nameserver      x.x.x.x

Резолвер(resolver) - это набор подпрограмм в библиотеке C, которые предоставляют доступ к Internel Раздел DNS: Что такое DNS (Domain Name System) (Системе Доменных Имен Интернет) (прим. пер. – DNS обеспечивает возможность преобразования символьных имен машин в IP-адреса и наоборот, IP-адресов в символьные имена). Файл с настройками /etc/resolv.conf для резолвера содержит информацию, которую первым делом читают подпрограммы резолвера, вызванные каким-либо процессом. Данный файл устроен так, чтобы его мог читать человек и содержит список ключевых слов и значений, которые предоставляют резолверу различную информацию.

В нормально настроенной системе данный файл не нужен: запросы будут обрабатываться сервером на локальном хосте, имя домена определяется из имени машины, а путь поиска машины по домену конструируется из имени домена.

Параметры конфигурации:

  • nameserver

адрес сервера имен в Интернет (в нотации xxx.xxx.xxx.xxx), который будет обрабатывать запросы от резолвера. Серверов имен может быть максимум 3 (остальные игнорируются), по одному на каждой строке. Если задано несколько серверов, то библиотека резолвера опрашивает их в порядке перечисления. Если записей nameserver нет, то по умолчанию используется сервер имен на локальной машине. (Используемый алгоритм пытается подключиться к серверу имен и, если запрос не был обработан через некоторый промежуток времени, делается попытка подключиться к следующему серверу имен, и так до тех пор пока не будет обработан весь список серверов, затем повторить процедуру, пока не будет достигнуто максимальное количество повторов).

  • domain

Локальное имя домена. Большинство запросов на имена машин в этом домене смогут использовать лишь краткие имена, без указания имени домена. Если записей domain нет, то домен определяется из имени локальной машины, которое возвращается функцией gethostname(); доменной частью имени считается все, что следует после первой точки `.'. Наконец, если имя машины не содержит доменной части, назначается корневой домен.

  • search

Список для поиска имен машин. Список обычно определяется из локального имени домена; по умолчанию он содержит только имя локального домена. В списке может быть задано несколько доменов, которые должны следовать за ключевым словом search и отделяться друг от друга пробелами или табуляциями. В большинстве случаев, если в запросе к резолверу задано короткое имя машины (без доменной части), то к нему будет поочередно добавляться каждый домен из заданного списка, пока не будет найдено полное совпадающее имя машины. Заметим, что данный процесс может быть медленным, и станет генерировать ощутимый сетевой траффик, если серверы, обслуживающие перечисленные в списке домены, не являются локальными, а также что запросы вернут ошибку тайм-аута, если сервер для одного из доменов недоступен. Список в данный момент ограничен шестью доменами, общая длина имен которых не должна превышать 256 символов.

  • sortlist

Разрешает сортировку адресов, которые возвращаются вызовом gethostbyname(). Опция sortlist задается с помощью пары: IP адрес/маска сети. Маска сети является необязательной, по умолчанию используется текущая маска сети. Пары из IP-адреса и необязательной маски сети разделяются прямой косой чертой. Может быть задано до 10 пар. пример: sortlist 130.155.160.0/255.255.240.0 130.155.0.0

  • options

Данная опция разрешает изменение определенных переменных резолвера. Синтаксис такой:

options опция ...
где опция может принимать одно из следующих значений:
debug --- устанавливает RES_DEBUG в _res.options.
ndots:n --- устанавливает порог для количества точек, которое должно быть в имени, заданном в res_query (см. resolver(@LIB_NETWORK_EXT@))
перед тем как будет создан начальный абсолютный запрос (initial absolute query). По умолчанию, n ``1'', означает, что если в имени есть
хоть одна точка, будет попытка считать это имя абсолютным перед добавлением к нему элементов из списка search.
Ключевые слова domain и search являются взаимно исключающими. Если эти слова заданы оба, то будет работать то, которое задано последним.
Ключевое слово и значение должны быть в одной строке, и кроме того, ключевое слово (например, nameserver), должно быть первым в строке. Значение должно отделяться от ключевого слова пробелом.

named.conf

Настраиваем named.conf

> ee /etc/namedb/named.conf
...
options {
...
//listen-on [ port ip_port ] { список-шаблонов-адресов };  (по умолчанию - все интерфейсы, порт 53; адрес и порт для приема запросов;
//может быть несколько таких предложений)
//
// укажем явно, на каких интерфейсах обслуживать запросы
        listen-on       { 127.0.0.1; адрес-сервера; };
//
// listen-on-v6 [ port ip_port ] { список-шаблонов-адресов }; (none; для IPv6)
//      listen-on-v6    { ::1; };

//allow-recursion { список-шаблонов-адресов }; (any; от кого принимать рекурсивные запросы; данные из кеша под запрет не попадают)
       allow-recursion { localhost; 127.0.0.1/8; ваша сеть; };
...
}

//Описание зон
//master - сервер является первичным уполномоченным сервером для данной зоны, т.е. загружает содержимое зоны из файла зоны,
// указанного опцией file
//slave - сервер является вторичным уполномоченным сервером для данной зоны; содержимое зоны считывается от одного из серверов,
//указанных в опции masters; указание имени файла в опции file  позволяет сохранять резервную копию зоны в файле
//
zone "your.com.ua" {
        type master;
        file "master/your.com.ua";
        allow-transfer{
        127.0.0.1;
//IP вашего сервера DNS
        x.x.x.x;
//IP slave
        195.24.128.164;
        };
};

Стартуем DNS нашего сервера.

> /etc/rc.d/named start
wrote key file "/var/named/etc/namedb/rndc.key"
Starting named.

Проверяем и видим ошибку "the working directory is not writable"

> tail -F /var/log/messages
...
Oct 25 16:12:48 ns named[59827]: starting BIND 9.4.3-P2 -t /var/named -u bind
Oct 25 16:12:48 ns named[59827]: command channel listening on 127.0.0.1#953
Oct 25 16:12:48 ns named[59827]: command channel listening on ::1#953
Oct 25 16:12:48 ns named[59827]: the working directory is not writable
Oct 25 16:12:48 ns named[59827]: running
...

BIND изначально запускается в песочнице. За настройки в песочнице отвечает файл BIND.chroot.dist. Изменим в этом файле строки для директорий namedb и master.

> cp /etc/mtree/BIND.chroot.dist /etc/mtree/BIND.chroot.dist.orig
> ee /etc/mtree/BIND.chroot.dist
...
    etc
        namedb uname=bind
            dynamic uname=bind
            ..
            master  uname=bind
...
> chown -R bind:wheel /etc/namedb/

Ошибка устранена.

Логирование DNS запросов

Для логирования всего происходящего при работе BIND нужно создать раздел logging в named.conf и создать нужные директории. В разделе logging задаются 2 параметра channel (можно и больше двух - на ваше усмотрение), эти параметры дословно можно назвать "канал" записи. Каждый канал определяет имя канала и настройки параметров записи (что записывать, а что - нет и куда писать). Директива category задает какую категорию сообщений в какой канал отправлять. Исходя из этого, мы имеем: запись стандартной информации в канал misc, а приходящие запросы посылаются в канал query. При этом, если файлы журнала достигают 4Мб (size 4m), он переименовывается добавлением к имени .1 и начинается запись в новый журнал, числа в конце других журналов увеличиваются. Журналы с номером, более указанного в version (в нашем случае 4) удаляются. Параметры print* определяют заносить ли в журнал время появления, важность и категорию информации. Более подробно про настройки раздела logging можно почитать в man (5) named.conf.

// настройки логирования
logging {
          channel "misc" {
                    file "/var/log/bind/misc.log" versions 4 size 4m;
                    print-time yes;
                    print-severity yes;
                    print-category yes;
          };

          channel "query" {
                    file "/var/log/bind/query.log" versions 4 size 4m;
                    print-time yes;
                    print-severity no;
                    print-category no;
          };

          category default {
                    "misc";
          };

          category queries {
                    "query";
          };
};

rndc - управление DNS сервером BIND 9

В то время как управление работающим сервером BIND 4 осуществлялось простой посылкой сигнала процессу (HUP - перезагрузить файл настройки и зоны; TERM - остановить; INT - сбросить базу данных в файл named_dump.db; ABRT - записать статистику в конец файла named.stats), управление сервером BIND 9 производится с помощью специальной утилиты rndc, которая соединяется с сервером (по умолчанию - TCP порт 953) и использует специальный протокол для передачи ему команд. Однако сигналы HUP, TERM пока действуют.

Настраивая сервер, необходимо обеспечить права доступа к управляющему порту (controls) и ключ (key), смотри ниже rndc-confgen.

Файл настройки rndc (/etc/rndc.conf) имеет такой же синтаксис, что и named.conf. Комментарии могут записываться в стиле C, C++ или sh. Файл настройки состоит из утверждений, завершающихся точкой с запятой. Утверждения содержат блок предложений, заключенный в фигурные скобки. Предложение в блоке также завершается точкой с запятой. Права на чтение этого файла должны быть только у того, кто имеет право запускать rndc. Предусматириваются следующие типы утверждений:

    * options {
          o default-server имя-или-адрес-сервера;
          o default-key "имя-ключа";
          o default-port номер-управляющего-порта;
      }
    * server имя-или-адрес-сервера { // адрес в двойных кавычках
          o key "имя-ключа";
          o port номер-управляющего-порта;
      }
    * key "имя-ключа"
          o algorithm hmac-md5;
          o secret "base-64-кодированный-ключ";
      }

Утилита rndc-confgen позволяет сгенерировать /etc/rndc.conf со случайным ключом (и закоментаренные предложения controls и key для /etc/named.conf). Следующими ключами можно модифицировать получаемый файл:

  • -b размер-ключа (по умолчанию - 128; от 1 до 512)
  • -k имя-ключа (по умолчанию - rndc-key)
  • -p номер-управляющего-порта (по умолчанию - 953)
  • -s имя-или-адрес-сервера (по умолчанию - 127.0.0.1)

Утилита rndc позволяет менять параметры соединения с сервером с помощью ключей:

  • -c имя-файла-настройки
  • -s имя-или-адрес-сервера
  • -p номер-управляющего-порта
  • -y имя-ключа
  • -V (трассировка исполнения для отладки)

Если запустить rndc без указания команды, то она выдаст список поддерживаемых команд:

  • reload (перезагрузить файл настройки и зоны)
  • reload зона [класс [вид]] (перезагрузить зону)
  • refresh зона [класс [вид]] (запланировать немедленное обновление зоны)
  • reconfig (перезагрузить файл настройки и новые зоны)
  • stats (записать статистику в конец файла named.stats)
  • querylog (включить/выключить журнализацию запросов) - после включения в логах можно будет увидеть с какого IP приходят запросы.
  • dumpdb (сбросить базу данных в файл named_dump.db, например: rndc dumpdb -all)
  • stop (сохранить изменения в файлы зон и остановить сервер)
  • halt (остановить сервер без сохранения изменений)
  • trace (увеличить уровень отладки на 1) в файле named.run -появятся отладочные сообщения
  • trace уровень (установить уровень отладки)
  • notrace (отключить отладку)
  • flush (сбросить весь кеш)
  • flush вид (сбросить кеш для указанного вида)
  • flushname (сбросить кеш для указанного домена, например, сбросить для домена mx.example.ru: rndc flushname mx.example.ru)
  • status (показать состояние сервера)
  • restart (перезапустить сервер; не реализовано)

Domain Name Speed Benchmark

Правильность настройки DNS сервера и его скорость вы можете проверить при помощи Domain Name Speed Benchmark. Уникальная, комплексная, точная и бесплатная утилита для Windows (и Linux/Wine) для определения точной производительности локальных и удаленных DNS-серверов имен.

Читайте также: Настройка и использование динамического DNS (Dynamic DNS), Файл hosts Назначение и Альтернативы: как управлять DNS-разрешением в Linux, Windows, FreeBSD.

PQ VPS сервера в 28+ странах.