Сервер пересылки на BIND9 настраивается проще простого. Тем не менее, не лишним будет выполнить ряд дополнительных задач, чтобы администрирование сервиса в будущем не выглядело одной большой проблемой.
Если вам интересно подробнее изучить задачи администрирования BIND9, рекомендую обратиться к соответствующему тегу на моем блоге.
Содержание
Сервер пересылки на BIND9
Знакомство с этой статьей не освобождает вас от чтения документации 1. Итак, приступим.
Установка
Установим все необходимые пакеты, которые доступны в стандартных репозиториях Debian:
1 |
apt-get install bind9 bind9utils bind9-doc |
Создадим временную папку и отправим туда дефолтные конфиги. Они нам не нужны, мы напишем свои.
1 |
mkdir /usr/bind_old && mv /etc/bind/* /usr/bind_old |
В главном конфиге нам нужна всего лишь одна строчка, которая инклудит доп. конфиг с главной секцией options{}. Вытащим её командой:
1 |
sed -e '/options/!d' /usr/bind_old/named.conf > /etc/bind/named.conf |
Собственно вот эта строчка:
1 |
include "/etc/bind/named.conf.options"; |
Теперь перетаскиваем все не закомментированные строчки из конфига named.conf.options:
1 |
sed -e '/^[[:space:]]*\/.*/d' -e '/^$/d' /usr/bind_old/named.conf.options > /etc/bind/named.conf.options |
Итого вот все опции, которые нам нужны на данном этапе:
1 2 3 4 5 6 |
options { directory "/var/cache/bind"; dnssec-validation auto; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; }; |
Перезапустим демона:
1 |
systemctl restart bind9 |
После выполненных изменения ваш BIND9 должен работать в минимальной конфигурации. Все дальнейшие настройки будем производить в следующих главах.
Настройка rndc
Для DNS-сервиса важно обеспечить непрерывный аптайм, не допуская даже минутных простоев. Если вы попытаетесь перезапустить systemd-юнит обычной командой systemctl (как в главе выше), а в конфигурации будут ошибки, то BIND9 не запустится. Чтобы избежать столь неприятных последствий, всего-то надо правильно настроить утилиту rndc, которая позволяет обойти эти сложности.
Итак, первым делом сгенерируем конфигурацию командой:
1 |
rndc-confgen |
Вывод будет содержать все необходимые настройки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Start of rndc.conf key "rndc-key" { algorithm hmac-md5; secret "IS1eb6wA/Ghva71dnT6KGw=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "rndc-key" { # algorithm hmac-md5; # secret "IS1eb6wA/Ghva71dnT6KGw=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.conf |
Создаем файл rndc.conf и сразу назначаем ему корректные права:
1 |
( umask 077; touch /etc/bind/rndc.conf ) |
Открываем его для редактирования:
1 |
nano /etc/bind/rndc.conf |
И вставляем не закомментированный участок конфигурации, полученной с помощью rndc-confgen выше:
1 2 3 4 5 6 7 8 9 10 |
key "rndc-key" { algorithm hmac-md5; secret "IS1eb6wA/Ghva71dnT6KGw=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; }; |
Обратите внимание, что значение поля secret у вас будет другое. Далее открываем файл named.conf.options:
1 |
nano /etc/bind/named.conf.options |
Копируем в него закомментированный участок вывода (разумеется предварительно расскомментируйте его) утилиты rndc-confgen 2:
1 2 3 4 5 6 7 8 |
key "rndc-key" { algorithm hmac-md5; secret "IS1eb6wA/Ghva71dnT6KGw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; |
Перезапустите демона:
1 |
systemctl restart bind9 |
Как только мы настроили rndc, обновлять конфигурацию BIND9 можно одной командой (используйте её в следующих главах, когда будете менять конфиги):
1 |
rndc reload |
rndc: ‘reload’ failed: failure
Rndc заслуживает более широкого обзора, но в рамках этой статьи я не могу его предоставить. Тем не менее посмотрите главы ниже, там будут полезные сценарии использования rndc.
Настройка пересылки
Первым делом немного позаботимся о безопасности, создав списки контроля доступа (acl) для каждой подсети, которые есть в нашей инфраструктуре. Для этого открываем в режиме редактирования новый файл named.conf.acl:
1 |
nano /etc/bind/named.conf.acl |
И вставляем следующие стройки:
1 2 3 4 5 6 |
acl acllist_dmz { 172.16.0.0/12; }; acl acllist_local { 192.168.0.0/16; }; |
acl acllist_dmz { !172.16.0.15; 172.16.0.0/12; };
acl acllist_local { 192.168.0.0/16; 172.16.0.15; };.
Теперь нам нужно подключить созданный выше конфиг в главную конфигурацию:
1 |
echo 'include "/etc/bind/named.conf.acl";' >> /etc/bind/named.conf |
Пришло время внести изменения в основные опции. Открываем для редактирования named.conf.options:
1 |
nano /etc/bind/named.conf.options |
Приводим его к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
options { directory "/var/cache/bind"; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; recursion yes; allow-query { localhost; acllist_local; }; allow-query-cache { localhost; acllist_local; }; forward only; forwarders { 8.8.8.8; 8.8.4.4; }; listen-on port 53 { 127.0.0.1; 192.168.1.14; }; }; key "rndc-key" { algorithm hmac-md5; secret "IS1eb6wA/Ghva71dnT6KGw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; |
Где 192.168.1.14 – адрес нашего сервера. Коротко описание каждой новой опции ниже 3:
- recursion – разрешает выполнение рекурсивных запросов;
- allow-query – разрешает запросы из указанных подсетей;
- allow-query-cache – разрешает возвращать результаты из кэша клиентам из указанных подсетей;
- forward – устанавливает приоритет пересылки (only – только пересылать; first – пересылать в первую очередь). Актуально лишь с опцией forwarders;
- forwarders – список серверов пересылки;
Перезапускаем демона и с любого клиента проверим как разрешает имена наш сервер:
1 |
dig +short @192.168.1.14 google.ru |
Базовая настройка на этом закончена, но эта статья была бы не полной без описания настройки логов.
Логи
По умолчанию BIND9 отправляет логи в syslog и вы сможете их найти в /var/log/messages. Тем не менее бывают ситуации, когда логи нужно перенаправить в отдельные файлы или, более того, разделить их по степени важности и/или источнику. В этом нам поможет отдельная секция logging {}.
Для начала создадим нужный нам каталог и сменим владельца:
1 |
mkdir /var/log/named && chown bind:bind /var/log/named |
Теперь откроем для редактирования новый файл named.conf.logging:
1 |
nano /etc/bind/named.conf.logging |
И вставим в него конфигурацию ниже 4:
1 2 3 4 5 6 7 8 9 10 11 12 |
logging{ channel channel_default { file "/var/log/named/default.log" versions 3 size 100m; severity debug; print-time yes; print-severity yes; print-category yes; }; category default{ channel_default; }; }; |
Изменим основной конфиг, добавив в него запись include:
1 |
echo 'include "/etc/bind/named.conf.logging";' >> /etc/bind/named.conf |
Как только обновите конфигурацию все логи будут направляться в один отдельный файл. Уже лучше, но BIND9 позволяет управлять логами более гибко 5, воспользуемся этой возможностью.
Например сделаем так, чтобы категории логов client и rpz (что такое rpz расскажу в следующих статьях) отправлялись в отдельные файлы. Также создадим отдельный канал, куда бы сыпались вообще все логи, чтобы было удобнее дебажить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
logging{ channel channel_client { file "/var/log/named/client.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_rpz { file "/var/log/named/rpz.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_default { file "/var/log/named/default.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_debug { file "/var/log/named/debug.log" versions 3 size 10m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; category client{ channel_client; channel_debug; }; category rpz{ channel_rpz; channel_debug; }; category default{ channel_default; channel_debug; }; }; |
Вы можете добавлять сколько угодно категорий и комбинировать в них какие угодно каналы.
Отладка BIND9
Если сервер BIND9 вдруг работает не так как вы ожидали, либо не работает вообще, можно попробовать залезть в логи. Но для начала нужно включить повышенный уровень отладки, а также логирование пользовательских запросов. Сделать это можно всего лишь одно командой (ну хорошо, двумя, но перечисленными в одну строчку):
1 |
rndc trace 99 ; rndc querylog on |
Далее смотрите логи на предмет ошибок.
Как только режим отладки будет не нужен, верните демона в режим работы по умолчанию:
1 |
rndc notrace ; rndc querylog off |
Функционал rndc достаточно широк. С её помощью можно также сбрасывать кэш BIND9. Это может быть особенно полезно также при отладке поведения BIND9, ведь кэш сильно влияет на ответы демона:
1 |
rndc flush && rndc reload |
Сброс кэша на серверах в проде может негативно повлиять на быстродействие в том случае, если вы имеете дело в высоконагруженными сервисами.
Лучшие практики
Кроме того, что мы уже успели настроить, хорошей практикой 7 считается подключать зону с корневыми серверами (если вы разрешаете рекурсию – recursion yes), а также другие зоны. Благо все они уже есть в дефолтной конфигурации, остается лишь вернуть их из нашей временной папки (/usr/bind_old) в корневой каталог BIND9. Сделать это можно командой:
1 |
cd /usr/bind_old ; mv -t /etc/bind/ db.root db.local db.255 db.127 db.0 named.conf.default-zones |
Сразу подключаем в named.conf:
1 |
echo 'include "/etc/bind/named.conf.default-zones";' >> /etc/bind/named.conf |
Подгружайте измененную конфигурацию и проверяйте работу.
Итоговые конфиги
На всякий случай конфиги в том виде, в котором они должны оказаться к окончанию настройки BIND9 по этой статье.
1. /etc/bind/named.conf:
1 2 3 4 |
include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.acl"; include "/etc/bind/named.conf.logging"; include "/etc/bind/named.conf.default-zones"; |
2. /etc/bind/named.conf.options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
options { directory "/var/cache/bind"; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; recursion yes; allow-query { localhost; acllist_local; }; allow-query-cache { localhost; acllist_local; }; forward only; forwarders { 8.8.8.8; 8.8.4.4; }; listen-on port 53 { 127.0.0.1; 192.168.1.14; }; }; key "rndc-key" { algorithm hmac-md5; secret "IS1eb6wA/Ghva71dnT6KGw=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; |
3. /etc/bind/named.conf.acl:
1 2 3 4 5 6 |
acl acllist_dmz { 172.16.0.0/12; }; acl acllist_local { 192.168.0.0/16; }; |
4. /etc/bind/named.conf.logging:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
logging{ channel channel_client { file "/var/log/named/client.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_rpz { file "/var/log/named/rpz.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_default { file "/var/log/named/default.log" versions 3 size 100m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; channel channel_debug { file "/var/log/named/debug.log" versions 3 size 10m; severity dynamic; print-time yes; print-severity yes; print-category yes; }; category client{ channel_client; channel_debug; }; category rpz{ channel_rpz; channel_debug; }; category default{ channel_default; channel_debug; }; }; |
На этом все.