Установка и настройка 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"