Установка и настройка DNS-сервера BIND на CentOS в chroot-окружении

В статье рассказывается, как настроить DNS-сервер BIND в CentOS. Сервис будет работать в изолированном chroot-окружении, использовать разные зоны для внутренних и внешних клиентов (view).

Исходные данные:

  • зона example.com (обслуживают два сервера)
  • master-сервер: ns1.example.com, внешний ip:62.220.58.71, внутренний ip:172.16.0.1
  • slave-сервер: ns2.example.com, внешний ip:62.220.58.72, внутренний ip:172.16.0.2
  • локальная сеть: 172.16.0.0/22

Вначале установим сам сервис и необходимые утилиты:

# yum install bind-chroot bind-utils

Подготовим chroot-каталог, запустив специальный скрипт:

# /usr/libexec/setup-named-chroot.sh /var/named/chroot on

Укажем параметр для использования chroot

# mcedit /etc/sysconfig/named
OPTIONS="-4"

Редактируем файл конфигурации /etc/named.conf:

/* Список контроля доступа для внутренний сети */
acl "local-subnet" {
        127.0.0.0/8;
        172.16.0.0/22;
};

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };	
        directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	allow-query     { 
                127.0.0.0/8;
                172.16.0.0/22;
        };
        allow-update { none; };
        allow-transfer { none; };

	recursion yes;

	dnssec-enable no;
	dnssec-validation no;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";
	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

include "/etc/named.root.key";

view "internal" {
        match-clients { "local-subnet"; };
        include "/etc/named.rfc1912.zones";
        include "/etc/named/named.internal.conf";
};

view "external" {
        match-clients { any; };
	recursion no;
        include "/etc/named/named.external.conf";
};

Мы описали два "вида" (view) - в internal будут попадать запросы из внутренней сети: match-clients { "local-subnet"; };

и для них будет подгружаться конфиг /etc/named/named.internal.conf, все остальные попадут в external:

match-clients { any; };

для них отключена рекурсия и добавятся зоны из конфига /etc/named/named.external.conf.

Для удобства создадим символьную ссылку:

# ln -s /etc/named.conf /etc/named/named.conf

Дополнительные файлы конфигурации

Файл /etc/named/named.internal.conf:

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

zone "example.com" IN {
        type master;
        file "internal/example.com.zone";
        allow-transfer { 172.16.0.2; }; # slave-серверу можно передавать зону
        notify yes;
};

Файл /etc/named/named.external.conf:

zone "example.com" IN {
        type master;
        file "external/example.com.zone";
        allow-query { any; };
        allow-transfer { 172.16.0.2; }; # slave-серверу можно передавать зону
};

Описание зоны example.com на дополнительном (slave) сервере будет таким:

zone "example.com" IN {
        type slave;
        masters { 172.16.0.1; };
        file "[путь_к_папке]/example.com.zone";
        allow-query { any; };
        allow-notify { 172.16.0.1;};
        masterfile-format text; # храним файлы зон в текстовом виде
};

Создаем файлы зон на основном сервере

Для начала подготовим папки для храниения зон:

# mkdir /var/named/external && mkdir /var/named/internal # chown named:named /var/named/internal && chown named:named /var/named/external # chmod 770 /var/named/internal && chmod 770 /var/named/external # ln -s /var/named/internal /etc/named/internal && ln -s /var/named/external /etc/named/external

Внутренняя зона example.com

Зона для локальных клиентов храниться в файле /var/named/internal/example.com.zone:

$ORIGIN .
$TTL 3600
example.com            IN      SOA     example.com.   hostmaster.example.com. (
                                        2017011001 ; serial
                                        3600 ; refresh [1h]
                                        600; retry [10m]
                                        1209600 ; expire [14d]
                                        3600 ; min TTL [1h]
                                        )
                NS          ns1.example.com.
                NS          ns2.example.com.
                MX      10  mail.example.com.
                A           172.16.0.1

$ORIGIN example.com.
ns1             IN      A       172.16.0.1
ns2             IN      A       172.16.0.2
mail            IN      A       172.16.0.1

Внешняя зона example.com

Зона example.com для внешних клиентов храниться в файле /var/named/external/example.com.zone:

$ORIGIN .
$TTL 3600
example.com            IN      SOA     example.com.   hostmaster.example.com. (
                                        2017011001 ; serial
                                        3600 ; refresh [1h]
                                        600; retry [10m]
                                        1209600 ; expire [14d]
                                        3600 ; min TTL [1h]
                                        )
                NS          ns1.example.com.
                NS          ns2.example.com.
                MX      10  mail.example.com.
                A           62.220.58.71
                TXT         "v=spf1 ip4:62.220.58.71 ip4:62.220.58.72 +a ~all"

$ORIGIN example.com.
ns1              A       62.220.58.71
ns2              A       62.220.58.72
mail             A       62.220.58.71
www             CNAME    example.com.

TXT-запись в нашем случае имеет тип spf и определяет кто, может посылать письма от зоны example.com. Эта запись очень важна, крупные почтовые сервера типа GMail могут посчитать вашу почту спамом, из-за отсутствия данной записи.

Проверяем зоны на ошибки:

# named-checkzone example.com /var/named/external/example.com.zone # named-checkzone example.com /var/named/internal/example.com.zone
zone example.com/IN: loaded serial 2017011001
OK

Добавляем сервер в автозагрузку и запускаем

# chkconfig named on # service named start

Укажем сервер в качестве основного DNS-сервера в сетевых настройках:

# mcedit /etc/sysconfig/network-scripts/ifcfg-[сетевой_интерфейс]
DNS1=172.16.0.1

Добавляем правила в iptables

DNS-сервер работает на 53 порту UDP, а для передачи зон использует 53 порт TCP. Отвечать на запросы будет всем, но передавать зону только slave-серверу, по локальной сети.

# iptables -A INPUT -p udp --dport 53 -j ACCEPT -m comment --comment "dns-query" # iptables -A INPUT -s 172.16.0.2 -p tcp --dport 53 -j ACCEPT -m comment --comment "dns-transfer"

Добавить комментарий


Защитный код
Обновить