Информационные технологииStfw.Ru 🔍

Конфигурирование DNS-сервера BIND (dns bind domain)

🕛 23.03.2009, 12:18
Данное руководство описывает механизмы конфигурирования DNS-сервера

BIND 8.х и выше. Рассматриваются не только вопросы настройки сервера,
доменных зон, но и ряд функциональных возможностей, повышающих
безопасность работы данного сервиса.

Введение

DNS-сервис является одним из важных сервисов для нормального
функционирования Internet сети. Его основная задача состоит в
определении соответствия между сетевыми адресами узлов сети и их
удобочитабельными названиями. Существует два варианта определения
этого соответствия - прямое и реверсивное определение. При прямом
разрешении DNS-сервер по имени определяет и выдает сетевой адрес, а
при реверсивном - по адресу ищет соответствующее имя. Это необходимо
учитывать при настройке DNS-сервиса, поскольку для осуществления
данных механизмов используются разные таблицы.

В операционной системе Sun Solaris, как, в прочем, и в других
UNIX-системах, в качестве DNS-сервера используется BIND-сервер версии
8.х и выше. Хотя, нужно заметить, в Solaris-е есть возможность
использования и сервера версии 4.х. Система определяет какой версии

DNS-сервер запускать по тому, какой конфигурационный файл существует в
каталоге /etc. Если используется файл - named.boot, то запускается
старая версия сервиса, а если - named.conf - то, соответственно, новая
(в Solaris 9 старой версии уже нет). Лучше естественно использовать

BIND 8.х и выше. Если у вас остались конфигурационные файлы named.boot
и вы хотите перевести ваш DNS-сервер на новую версию, то можно
воспользоваться скриптом /usr/sbin/named-bootconf который конвертирует
конфигурационный файл BIND 4.x в BIND 8.x.

Строгое имя сборки вычисляет кэш или контрольную сумму подписываемой
сборки и тем самым гарантирует ее подлинность для клиентского
приложения (или почти гарантирует).

Технология использования «strong name» определяется правилами
использования криптографических ключей в конкретной организации.
Рассмотрим алгоритм формирования строгих имен сборок в наиболее общем
виде.

Конфигурирование BIND 8.x

Конфигурирование BIND-сервера состоит из двух этапов - настройка
конфигурационного файла /etc/named.conf и создания и заполнения таблиц
доменных зон.

BIND 8.х позволяет создавать 4 типа доменных зон: - master (раньше называлась - primary). Данный DNS-сервер
является головным для данного домена. - slave (раньше называлась - secondary). Такие DNS-серверы
хранят копии доменных зон, которые скачивают и периодически обновляют
с master-сервера. - hint (раньше называлась - cache). Кэширующий сервер. Не
хранит никаких таблиц зон, а просто собирает с объявленных
root-серверов кэш резолвенных адресов. Используется для повышения
эффективности работы DNS-сервера. - stub аналог slave зоны, но в отличие от нее таблиц зоны не
хранит, только NS-записи, и просто перенаправляет запросы на
объявленные DNS-сервера.

Очевидно, что вы можете настроить так ваш BIND-сервер, что он
одновременно может обслуживать несколько разных доменных зон и для
одних он может быть master-ом, для других - slave и тд.

В любом случае, какие-бы типы зон вы не настраивали, две зоны будут
присутствовать у вас почти всегда - это зона hint и localhost (прямая
и реверсивная).

Итак, начнем с просто кэширующего DNS-сервера. Создаем /etc/named.conf
и прописываем там глобальные параметры и те две «стандартные» зоны о
которых я только что упоминал:

Конфигурационный файл /etc/named.conf для кэширующего DNS-сервера
options {
directory "/var/named";
listen-on { 192.168.6.1; localhost; };
version "Go away!";
allow-transfer { none; };
allow-query { 192.168.6.0/24; localhost; };
forward first;
forwarders { 192.168.1.1; };
};

zone "localhost" in {
type master;
file "/var/named/localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" in {
type master;
file "/var/named/127.0.0.zone";
allow-update { none; };
};

zone "." in {
type hint;
file "/var/named/root.hint";
};

Синтаксис этого файла очень похож на С++. Структура options описывает глобальные параметры для сервера, а структуры zone описывают, соответственно, доменные зоны.

-directory - указывает каталог расположения таблиц зон

-listen-on - позволяет указать на какие сетевые интерфейсы будет
«вешаться» демон. Тут прописываем адрес локального интерфейса, у меня
это 192.168.6.1, и не забываем указать и 127.0.0.1

-version - строка, которая будет выдаваться на запрос определения
версии DNS-сервера

-allow-transfer - устанавливает возможность передачи зон для
slave-серверов. В нашем случае трансфер запрещен.

-allow-query - а этот параметр указывает кому разрешается подавать
запросы к нашему серверу. Мы прописали нашу локальную сетку
192.168.6.0 и 127.0.0.1

-forward - этот параметр позволяет указать каким образом сервер
обрабатывает запрос клиента. Я указал first - это означает что сервер
сначала перенаправит запрос выше и если не получит положительного
результата, то посмотрит в своем кэше. Если указать only - то у себя
смотреть не будет

-forwarders - а тут вы и указываете куда перенаправлять запросы
клиентов. Я указал, для примера, свой вышестоящий DNS-сервер
192.168.1.1

-type - тип зоны

-file - имя файла таблицы зоны

-allow-update - разрешить или нет, и кому если разрешить, возможность
изменения(обновления) таблицы зоны

Теперь добавим записи для master-зон:

Конфигурационный файл /etc/named.conf для master DNS-сервера
options {
directory "/var/named";
listen-on { 192.168.6.1; localhost; };
version "Go away!";
allow-transfer { none; };
allow-query { 192.168.6.0/24; localhost; };
};

zone "localhost" in {
type master;
file "/var/named/localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" in {
type master;
file "/var/named/127.0.0.zone";
allow-update { none; };
};

zone "." in {
type hint;
file "/var/named/root.hint";
};

zone "sun.urix.ru" in {
type master;
file "/var/named/sun.urix.zone";
};

zone "6.168.192.in-addr.arpa" in {
type master;
file "/var/named/192.168.6.zone";
};

Я добавил две структуры: «прямую» зону - sun.urix.ru и реверсивную 6.168.192.in-addr.arpa. Удалил опции определяющие форвард запросов и
пока не разрешаю трансфер своих таблиц. Таким образом у меня получился
мастер DNS-сервер для моего домена sun.urix.ru.

Теперь настроим наш BIND в случае когда у нас существуют и
slave-серверы. Сначала необходимо подправить на мастер-сервере
возможность передачи таблиц зон. Для этого нужно только разрешить
трансфер зон:
allow-transfer { 192.168.6.2; 192.168.6.3; };

Здесь 192.168.6.2 и 192.168.6.3 - мои slave-серверы. А теперь на
slave-сервере делаем конфигурационный файл:

Конфигурационный файл /etc/named.conf для slave DNS-сервера
options {
directory "/var/named";
listen-on { 192.168.6.2; localhost; };
version "Go away!";
allow-transfer { none; };
allow-query { 192.168.6.0/24; localhost; };
};

zone "localhost" in {
type master;
file "/var/named/localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" in {
type master;
file "/var/named/127.0.0.zone";
allow-update { none; };
};

zone "." in {
type hint;
file "/var/named/root.hint";
};

zone "sun.urix.ru" in {
type slave;
file "/var/named/sun.urix.zone";
masters { 192.168.6.1; };
};

zone "6.168.192.in-addr.arpa" in {
type slave;
file "/var/named/192.168.6.zone";
masters { 192.168.6.1; };
};

Все, теперь когда демон на slave-сервере будет запускаться он
прочитает адрес, прописанный в masters, и скачает таблицу зоны, а в
последствии будет ее и обновлять.

Несколько слов о том, как запускать и останавливать bind-демон и где
читать логи:

#/usr/sbin/in.named - так запускается демон

#pkill in.named - а так его можно «убить»

/var/log/messages - файл логов куда и демон in.named пишет свои логи.

Таблицы зон

Теперь приступаем к созданию таблиц зон. Понятно, что для
slave-сервера большинство таблиц будут скачены с master-сервера.
Первым делом пропишим таблицы для localhost и зоны hint. Мы объявили,
что /var/named - каталог где помещаются таблицы - вот и идем туда и
создаем необходимые таблицы.

Файл /var/named/localhost.zone
$ttl 38400
localhost. IN SOA localhost. root.localhost. (

2004071001 ;serial
108000 ;refresh
1800 ;retry
1209600 ;expiry
604800)

localhost. IN NS solaris.
localhost. IN A 127.0.0.1

Файл /var/named/127.0.0.zone
$ttl 38400
0.0.127.in-addr.arpa. IN SOA localhost. root.localhost. (

2004071001 ;serial
108000 ;refresh
1800 ;retry
1209600 ;expiry
604800)

0.0.127.in-addr.arpa. IN NS solaris.
1.0.0.127.in-addr.arpa. PTR localhost.

Файл /var/named/root.hint
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4

Разберемся теперь в формате этих таблиц. localhost.zone и 127.0.0.zone - это прямая и реверсивная таблицы loopback интерфейса, а файл
root.hint - используется для кэширующего сервера. Эти три файла, как
мы помним, присутствуют неизменно на любом DNS-сервере.

Что касается файла root.hint, то его, как правило, берут у своего
провайдера. Данные в нем периодически устаревают и меняются, поэтому
выкачивать его у своего провайдера - это самый оптимальный вариант. Но
я хочу посоветовать вам упростить этот файл всего до одной-двух
записей рутовых серверов и указать их на DNS-серверы вашего
провайдера. Что это даст? Дело в том, что ваш сервер при каждом
запуске и по истечении параметра TTL(time-to-live) будет обращаться ко
всем серверам из этого файла и, таким образом, создаст вам огромный
трафик, хотя накопленной информации, хранящейся на сервере вашего
провайдера, вполне для вас будет достаточно. В качестве примера я
написал только один адрес А-root сервера, если вы хотите добавить еще
сервера, то создайте B,C,D... и т.д.

Расшифровка полей файлов зон:

−2004071001 ;serial - серийный номер версии таблицы. Самый лучший
формат - ГГГГММДДNN, где NN - номер изменения таблицы за текущий день

−108000 ;refresh - время в секундах, указывающее как часто необходимо
проверять таблицу мастер-сервера на необходимость update-а

−1800 ;retry - время в секундах, которое сервер ожидает при ошибочном
сеансе refresh-а чтобы начать его заново

−1209600 ;expiry - максимальный предел в секундах времени хранения
таблицы, по его истечении таблица считается устаревшей и скачивается
заново.

−604800 ;ttl - параметр time-to-live. Время в секундах, которое
указывает серверу сколько хранить в кэше данные таблицы. По его
истечении срвер перечитывает таблицу заново.

Файл /var/named/sun.urix.zone
$ttl 38400
sun.urix.ru. IN SOA solaris. root.solaris.sun.urix.ru. (

2004071001 ;serial
108000 ;refresh
1800 ;retry
1209600 ;expiry
604800)

sun.urix.ru. IN NS solaris.
sun.urix.ru. IN MX 10 solaris.sun.urix.ru.
solaris IN A 192.168.6.1
class IN A 192.168.6.10
slave IN A 192.168.6.2
www IN CNAME solaris

Файл /var/named/192.168.6.zone
$ttl 38400
6.168.192.in-addr.arpa. IN SOA solaris. root.solaris.sun.urix.ru. (
2004012001 ;serial
108000 ;refresh
1800 ;retry
1209600 ;expiry
604800)

6.168.192.in-addr.arpa. IN NS solaris.
1 IN PTR solaris.sun.urix.ru.
2 IN PTR slave.sun.urix.ru.
10 IN PTR class.sun.urix.ru.

-NS - указывает name-серверы для данной зоны
-MX - указывает на почтовые серверы домена, очередность - 0,10,20,
-A - «прямая» запись ресурса (имя-адрес)
-PTR - «реверсивная» запись (адрес-имя)
-CNAME - псевдоним

Точка в конце некоторых названий означает, что не нужно дописывать
название доменной зоны. Если ее не ставить, то сервер автоматически
допишет название домена для которого данная таблица и составляется. Не
забывайте про это.

Вот и все, если таблицы готовы, то теперь можно и запускать ваш
сервер. Как это делать мы уже рассмотрели выше.

Передача зон по защищенному ключу

Если перед вами стоит задача повысить уровень безопасности при
трансфере таблиц между master и slave серверами, то необходимо
наложить дополнительную аутентификацию на этот механзм. Вообще,
механизм аутентификации по ключу, который мы сейчас настроим, может
применяться не только при передаче зон, но и даже при обработке
запросов клиент-сервер. Но это уже особый случай повышенной
безопасности.

Естественно, перед тем как настраивать DNS-сервер на использование
ключей аутентификации их необходимо сначала сгенерировать. Вот и
запускаем следующую команду, которая создаст нам нужный ключ:
#dnskeygen -H 128 -z -n ns1

-H - указывает что необходимо сгенерировать ключ HMAC-MD5, диапазона
[1..512]. Я указал - 128.

-z - ключ генерируется для зоны

-n - указывает имя ключа

В результате в текущем каталоге создаются два файла Kns1.+157+00000.key и ns1.+157+00000.private. Заглянем в них:

Содержимое файла Kns1.+157+00000.key
ns1. IN KEY 257 3 157 cArC69abJAYH8sqijvyxjw==

Содержимое файла Kns1.+157+00000.private
Private-key-format: v1.2
Algorithm: 157 (HMAC)
Key: cArC69abJAYH8sqijvyxjw==

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

Теперь возвращаемся к конфигурационному файлу /etc/named.conf на
master-сервере и приводим его к следующему виду:

Конфигурационный файл /etc/named.conf для master DNS-сервера с
использованием ключа при трансфере зон
key ns1 {
algorithm hmac-md5;
secret "cArC69abJAYH8sqijvyxjw==";
};

server 192.168.6.2 {
keys { ns1; };
};

server 192.168.6.3 {
keys { ns1; };
};

options {
directory "/var/named";
listen-on { 192.168.6.1; localhost; };
version "Go away!";
allow-transfer { key ns1; };
allow-query { 192.168.6.0/24; localhost; };
};

zone "localhost" in {
type master;
file "/var/named/localhost.zone";
allow-update { none; };
};

zone "0.0.127.in-addr.arpa" in {
type master;
file "/var/named/127.0.0.zone";
allow-update { none; };
};

zone "." in {
type hint;
file "/var/named/root.hint";
};

zone "sun.urix.ru" in {
type master;
file "/var/named/sun.urix.zone";
};

zone "6.168.192.in-addr.arpa" in {
type master;
file "/var/named/192.168.6.zone";
};

Как видно, добивились две новые структуры - key и server. Первая
задает нам ключ, а вторая - какие серверы этим ключем подписываются. В
моем примере я указал две структуры для моих slave-серверов и обоим
приписал один ключ. Конечно, вы можете генерировать ключи для каждого
сервера отдельно и даже несколько ключей на один сервер и использовать
их потом для разных целей.

На slave-серверах необходимо, так же, прописать аналогичные структуры.
Причем структура key - «один в один» - иначе не пройдет
аутентификация, а вот структура server должна быть одна с адресом
вашего master-сервера.

Вот и все, запускаете службу и если не ошиблись при наборе ключа
серверы начнут трансфер зон. Единственно на что еще хочется обратить
внимание - это на синхронизацию времени между master и slave
серверами. Если трансфер зон не прошел, то читайте лог - там причина
будет описана. Если ошиблись в ключе - проверяйте его идентичность,
если не совпадает время - синхронизируйте его (команды date, rdate
либо запустите ntp механизм) и все будет - ОК!

DNS-клиент

Для настройки DNS-клиента первое что необходимо сделать - это
подправить файл /etc/nsswitch.conf. Найдите там следующую строчку и
допишите как это показано у меня:
hosts: files dns

Таким образом вы указываете системе откуда и в каком порядке
определять сетевые адреса. Теперь создаем файл /etc/resolv.conf и
прописываем туда следующее:
domain sun.urix.ru
nameserver 127.0.0.1
nameserver 192.168.6.2
nameserver 192.168.6.3

Domain - указывает клиентом какого домена вы являетесь, а nameserver адреса DNS-серверов. Причем опрос идет в порядке сверху-вниз и
максимальное количество объявленных северов - три. Адрес 127.0.0.1
нужно указывать только если вы настраиваете клиента на самом сервере.
Вот и все что нужно сделать, все значения система подхватывает «на
лету».

Не хочется утомлять Вас банальностями, объясняющими влияние полнолуния
на безопасность информационных систем...

Unix   Теги: Bind, Dns

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉