Установка и Настройка DNS-сервера BIND в RHEL, CentOS, Fedora

Bind – это наиболее популярная реализация DNS-сервера. Данный пакет входит в состав абсолютного большинства unix систем.

Сайт проекта BIND: www.isc.org.

DNS-сервер BIND уже есть в вашем дистрибутиве. Проверьте установленны ли RPM-пакеты bind и bind-chroot командами:

# rpm -q bind
# rpm -q bind-chroot

В данном руководстве указаны опции которые необходимо указать DNS-серверу для обеспечения безопасности его функционирования.

Журналирование событий

Для своевременного реагирования на проблемы, связанные с функционированием DNS-сервера, крайне важно вести журналирование событий Bind.

Пакет Bind предоставляет администратору обширные возможности по настройке системы регистрации событий. Так как в стандартной конфигурации named настроен без включенной системы логирования, и работает named в chroot окружении, то вам необходимо сделать некоторые дополнительные действия:

  • В каталоге /var/named/chroot/var создайте каталог log, в котором создайте подкаталог named.
  • В каталоге /var/named/chroot/var/log/named создайте файлы: xfer.log, lamers.log, conf.log и security.log.
  • Установите права на эти файлы в 644 и установите владельца и группу на эти файлы named.named.
# cd /var/named/chrrot/var/log/named
# touch xfer.log
# touch lamers.log
# touch conf.log
# touch security.log
# chmod 644 *
# chown named.named *

Конфигурационный файл BIND:

logging{
 channel "xfer" {
  file "/var/log/named/xfer.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };
 channel "lame" {
  file "/var/log/named/lamers.log" versions 2 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };
 channel "config" {
  file "/var/log/named/conf.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };
 channel "security" {
  file "/var/log/named/security.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };

 // События, связанные с получением зон
 category "xfer-in" { "xfer"; };

 // События, связанные с передачей зон
 category "xfer-out" { "xfer"; };

 // События связанные с изменениями в зонах
 category "notify" { "xfer"; };

 // События, связанные с некорректным делегированием
 category "lame-servers" { "lame"; };

 // События, связанные с обработкой файла конфигурации
 category "config" { "config"; };

 // События, связанные с запрещением/разрешением запросов
 category "security" { "security"; };

 // Если для события канал не определен
 category "default" { "default_syslog"; "default_debug"; };
};

Рассмотрим подробней один из каналов.

  • Параметр file задает с каком файле будет храниться информация попадающая в данный канал.
  • Опция version указывает уровень ротации данного канала, т.е.при достижении лимита указанного в параметре size файл переименовывается в имя.0, имя.1 и т.д.
  • Для каждого из каналов в опции severity возможно указать события какой степени важности записывать в лог. При указании уровня все события этого и вышестоящих уровней будут записываться в файл регистрации. Возможно указать следующие уровни:
    • critical
    • error
    • warning
    • notice
    • info
    • debug
    • dynamic.
  • Опция print-time yes указывает на то, что в файле регистрации события должно указываться время, в которое данное событие произошло.
  • Опция print-severity yes указывает DNS-серверу записывать в файл регистрации уровень важности события.

Рекомендуемые опции bind для обеспечения безопасности

Для сокрытия версии bind в секции options добавьте строку:

version "DNS Server";

Для разрешения запросов только из своих сетей добавьте в секцию options следующую строку:

allow-query { Список сетей; }

Если ваш DNS-сервер является либо master либо slave для какой-либо зоны, то Вам необходимо разрешить запросы для всех IP-адресов. Данная опция разрешает запросы к DNS-серверу только с IP-адресов указанных в скобках.

Для разрешения рекурсивных запросов добавьте:

allow-recursion { Список сетей; }

Обратите внимание на эту очень важную опцию. С помощью ее вы указываете своему серверу, кому можно разрешать имена доменов, используя ваш DNS-сервер. Обязательно используйте эту опцию, иначе вы можете столкнуться с ситуацией, когда запросами на разрешение имен к вашему DNS-серверу будет сгенерированн большой объем входящего трафика, за который в конечном итоге ваш провайдер заставит вас расчитаться (если у вас не безлимитный тарифный план), либо ваш DNS-сервер будет сильно загружен запросами на разрешение имен DNS, Данную опцию следует включить только для довереных сетей, без указания данной опции ваши клиенты не смогут делать преобразование символьных адресов в IP-адреса.

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

allow-transfer {список IP-адресов slave серверов;}

Если вы ведете slave-зону для какого-нибудь домена, необходимо указать опцию:

allow-transfer { none; };

Данные опции могут задаваться как глобально в секции options, так и для каждой зоны в отдельности.

В случае, если вы оплачиваете входящий либо исходящий трафик своему провайдеру, но ваш провайдер разрешил вам использовать его DNS-сервера, и стоимость обмена трафиком с данными серверами гораздо ниже чем глобальный трафик, либо обмен трафиком с данными серверами бесплатен, то я рекомендую использовать опции:

forwarders {первый DNS-сервер провайдера; второй DNS-сервер провайдера;};
forward only;

Данными параметрами Вы указываете вашему серверу BIND использовать DNS-сервера провайдера для разрешения имен.

Если Вы вместо forwarders only; укажете forward first, то ваш DNS-сервер будет пытаться разрешать имена с помощью DNS-серверов, указанных в параметре forwarders, и лишь в случае, если разрешить имя с помощью данных серверов не удалось, то будет осуществлять попытки разрешения имени самостоятельно.

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

transfers-per-ns 2;

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

Можно также установить максимальное значение одновременно запрашиваемых зон вашим DNS-сервером. За это отвечает параметр

transfers-in 5;

в секции options.

Можно также установить значение одновременно запрашиваемых зон у вашего DNS-сервера. За это отвечает параметр

transfers-out 5;

в секции options.

Для того чтобы задать время в минутах которое DNS-сервер может потратить на получение зоны с первичного DNS-сервера служит параметр

max-transfer-time-in 60;

Если по истечении времени зона так и не будет получена с первичного DNS-сервера, то наш DNS-сервер автоматически разорвет сессию.

Для задания максимального времени на передачу зоны slave-серверам служит параметр

 max-transfer-time-out 60;

Интервал обновления зоны может быть очень маленьким, таким образом вторичные DNS-сервера будут зачастую выполнять ненужную работу. Для установления ограничений на минимальное и максимальное кол-во передач зоны можно использовать параметры:

max-refresh-time 86400; // обновлять зону не реже чем раз в сутки.
min-refresh-time 1800; // обновлять зону не чаще 1 раза в 30 минут.

Также имеет смысл установить параметр

recursive-clients 100;

в секции options, который ограничивает число клиентов параллельно обслуживаемых вашим DNS-сервером.

Параметр

tcp-clients 200;

ограничивает число одновременных TCP-соединений с вашим DNS-сервером.

Если в вашем сервере установлено несколько сетевых интерфейсов, и вы хотите чтобы named работал только на одном из них, то вам необходимо использовать параметр

listen-on {localhost; нужный сетевой интерфейс;};

Если вы не используете IPv6, отключите его поддержку в BIND

listen-on-v6 { none; };

Работа named под непривилегированным пользователем

Очень важным является указание BIND работать от имени непривилегированного пользователя а не от root-a. По умолчанию, в RHEL bind так и работает от имени пользователя named. Убедиться в этом можно, выполнив команду

# ps ax | grep named

при запущеном демоне named. Ответ должен выглядеть примерно так

# /usr/sbin/named -u named

Имя пользователя после параметра -u говорит под каким пользователем работает BIND.

Другой способ убедиться у том, что BIND работает из под непривилегированного пользователя, это проверить стартовый скрипт /etc/init.d/named на наличие строки

# daemon /usr/sbin/named -u named ${OPTIONS};

Пример настройки кэширующего DNS-сервера bind

Допустим ваш провайдер выделил вам 1 IP-адрес. В вашей внутренней сети используется адресация 10.0.0.0/24 (10.0.0.0 по маске 255.255.255.0). У вашего шлюза в интернет внутренний IP-адрес 10.0.0.1. Внешний IP-адрес выделеный провайдером (192.168.0.10). IP-адреса DNS-серверов провайдера 192.168.0.1, 192.168.0.2. Данный DNS-сервер должен разрешать имена используя только DNS-сервера провайдера.

// Настраиваем логирование
logging {
 channel "xfer" {
  file "/var/log/named/xfer.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };

 channel "lame" {
  file "/var/log/named/lamers.log" versions 2 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };

 channel "config" {
  file "/var/log/named/conf.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };

 channel "security" {
  file "/var/log/named/security.log" versions 3 size 10m;
  print-time yes;
  print-severity yes;
  severity info;
 };

 category "xfer-in" { "xfer"; };
 category "xfer-out" { "xfer"; };
 category "notify" { "xfer"; };
 category "lame-servers" { "lame"; };
 category "config" { "config"; };
 category "security" { "security"; };
 category "default" { "default_syslog"; "default_debug"; };
};

Список сетей для которых разрешены рекурсивные запросы
acl "my_net" {
 localhost;
 10.0.0.0/24;
};

options {
 directory "/var/named";
 dump-file "/var/named/data/cache_dump.db";
 statistics-file "/var/named/data/named_stats.txt";
 version "DNS Server";
 allow-recursion { my_net; };
 allow-query { my_net; };
 forwarders { 192.168.0.1; 192.168.0.2; };
 listen-on{localhost;10.0.0.1;};
 forward only;
 recursive-clients 100;
};

controls {
 inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone "." IN {
 type hint;
 file "named.ca";
};

zone "localdomain" IN {
 type master;
 file "localdomain.zone";
 allow-update { none; };
};

zone "localhost" IN {
 type master;
 file "localhost.zone";
 allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
 type master;
 file "named.local";
 allow-update { none; };
};

include "/etc/rndc.key";

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

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Разрешаем DNS запросы только к серверам провайдера
-A INPUT -i eth0 -s 192.168.0.1/32 -d 192.168.0.10/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.1/32 -d 192.168.0.10/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.1/32 -s 192.168.0.10/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.1/32 -s 192.168.0.10/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.2/32 -d 192.168.0.10/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.2/32 -d 192.168.0.10/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.2/32 -s 192.168.0.10/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.2/32 -s 192.168.0.10/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT

# Разрешаем запросы из внутренней сети
-A INPUT -i eth1 -s 10.0.0.0/24 -d 10.0.0.1/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A INPUT -i eth1 -s 10.0.0.0/24 -d 10.0.0.1/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth1 -d 10.0.0.0/24 -s 10.0.0.1/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth1 -d 10.0.0.0/24 -s 10.0.0.1/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT

# Остальные правила
--//--

В данном фрагменте правил предполагается, что:

  • eth0 – сетевой интерфейс с адресом 192.168.0.10;
  • eth1 – сетевой интерфейс с адресом 10.0.0.1.

В /etc/resolv.conf укажите:

nameserver 127.0.0.1

Автор: Денис Фролов

Статьи по Теме

Категории
Поиск