Основная цель 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.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
Редактируем файл /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 для резолвера содержит информацию, которую первым делом читают подпрограммы резолвера, вызванные каким-либо процессом. Данный файл устроен так, чтобы его мог читать человек и содержит список ключевых слов и значений, которые предоставляют резолверу различную информацию.
В нормально настроенной системе данный файл не нужен: запросы будут обрабатываться сервером на локальном хосте, имя домена определяется из имени машины, а путь поиска машины по домену конструируется из имени домена.
Параметры конфигурации:
адрес сервера имен в Интернет (в нотации xxx.xxx.xxx.xxx), который будет обрабатывать запросы от резолвера. Серверов имен может быть максимум 3 (остальные игнорируются), по одному на каждой строке. Если задано несколько серверов, то библиотека резолвера опрашивает их в порядке перечисления. Если записей nameserver нет, то по умолчанию используется сервер имен на локальной машине. (Используемый алгоритм пытается подключиться к серверу имен и, если запрос не был обработан через некоторый промежуток времени, делается попытка подключиться к следующему серверу имен, и так до тех пор пока не будет обработан весь список серверов, затем повторить процедуру, пока не будет достигнуто максимальное количество повторов).
Локальное имя домена. Большинство запросов на имена машин в этом домене смогут использовать лишь краткие имена, без указания имени домена. Если записей domain нет, то домен определяется из имени локальной машины, которое возвращается функцией gethostname(); доменной частью имени считается все, что следует после первой точки `.'. Наконец, если имя машины не содержит доменной части, назначается корневой домен.
Список для поиска имен машин. Список обычно определяется из локального имени домена; по умолчанию он содержит только имя локального домена. В списке может быть задано несколько доменов, которые должны следовать за ключевым словом search и отделяться друг от друга пробелами или табуляциями. В большинстве случаев, если в запросе к резолверу задано короткое имя машины (без доменной части), то к нему будет поочередно добавляться каждый домен из заданного списка, пока не будет найдено полное совпадающее имя машины. Заметим, что данный процесс может быть медленным, и станет генерировать ощутимый сетевой траффик, если серверы, обслуживающие перечисленные в списке домены, не являются локальными, а также что запросы вернут ошибку тайм-аута, если сервер для одного из доменов недоступен. Список в данный момент ограничен шестью доменами, общая длина имен которых не должна превышать 256 символов.
Разрешает сортировку адресов, которые возвращаются вызовом gethostbyname(). Опция sortlist задается с помощью пары: IP адрес/маска сети. Маска сети является необязательной, по умолчанию используется текущая маска сети. Пары из IP-адреса и необязательной маски сети разделяются прямой косой чертой. Может быть задано до 10 пар. пример: sortlist 130.155.160.0/255.255.240.0 130.155.0.0
Данная опция разрешает изменение определенных переменных резолвера. Синтаксис такой:
options опция ... где опция может принимать одно из следующих значений: debug --- устанавливает RES_DEBUG в _res.options. ndots:n --- устанавливает порог для количества точек, которое должно быть в имени, заданном в res_query (см. resolver(@LIB_NETWORK_EXT@)) перед тем как будет создан начальный абсолютный запрос (initial absolute query). По умолчанию, n ``1'', означает, что если в имени есть хоть одна точка, будет попытка считать это имя абсолютным перед добавлением к нему элементов из списка search.
Настраиваем 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/
Ошибка устранена.
Для логирования всего происходящего при работе 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";
};
};
В то время как управление работающим сервером 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). Следующими ключами можно модифицировать получаемый файл:
Утилита rndc позволяет менять параметры соединения с сервером с помощью ключей:
Если запустить rndc без указания команды, то она выдаст список поддерживаемых команд:
Правильность настройки DNS сервера и его скорость вы можете проверить при помощи Domain Name Speed Benchmark. Уникальная, комплексная, точная и бесплатная утилита для Windows (и Linux/Wine) для определения точной производительности локальных и удаленных DNS-серверов имен.
Читайте также: Настройка и использование динамического DNS (Dynamic DNS), Файл hosts Назначение и Альтернативы: как управлять DNS-разрешением в Linux, Windows, FreeBSD.