Опять же на работе понадобилось настроить кэширующий DNS-сервер BIND так, чтобы DNS-запросы сначала передавались провайдерским DNS-серверам (forwarders) и только в случае, если они не доступны, выполнялось самостоятельное рекурсивное решение DNS-запросов. DNS-серверы прописывать прямо в конфиг BIND не хотелось, хотелось чтобы он подхватывал их от PPPoE-подключения и Ethernet-подключения.
Вообще этот DNS-сервер не только выполняет функции кэширования, но является авторитативным для нескольких зон (master), подчинённым для других зон (slave), и выполняет передачу DNS-запросов для нескольких локальных корпоративных зон (forward) на локальные же авторитативные DNS-серверы вышестоящей корпоративной сети. Но суть заметки не в этом. Остальные аспекты настройки DNS-сервера хорошо описаны в различных источниках и не представляют каких-либо проблем.
Сначала поставим пакеты resolvconf и bind9:
# aptitude install resolvconf bind9
Пропишем в настройках Ethernet-интерфейса провайдера опцию dns-nameservers 81.30.199.5 81.30.199.94.
Соответствующий кусок файла /etc/network/interfaces будет выглядеть примерно так:
# ufanet auto eth0 iface eth0 inet static address xx.xx.xx.250 netmask 255.255.255.252 #gateway xx.xx.xx.249 dns-nameservers 81.30.199.5 81.30.199.94
Для получения адресов DNS-серверов от другого провайдера по протоколу PPPoE, в соответствующий этому провайдеру файл настроек /etc/ppp/peers/bis добавим опцию usepeerdns.
Теперь создадим шаблон для раздела опций BIND в файле /etc/bind/named.conf.options:
options { directory "/var/cache/bind/"; forward first; forwarders { }; listen-on { 127.0.0.1; xx.xx.xx.250; 10.3.0.0/18; }; };
Проверим, что в файле /etc/default/bind9 установлена переменная RESOLVCONF=yes. Если она принимает значение no, исправьте её на yes.
Если сейчас перезапустить BIND, то будет создан файл /var/run/bind/named.options, содержащий следующее:
// named.conf fragment automatically generated by /etc/resolvconf/update.d/bind // DO NOT EDIT THIS FILE. Instead edit /etc/bind/named.conf.options . options { forwarders { 81.30.199.5; 81.30.199.94; 10.3.1.4; }; directory "/var/cache/bind/"; forward first; listen-on { 127.0.0.1; xx.xx.xx.250; 10.3.0.0/18; }; };
А в файле /etc/resolv.conf можно будет увидеть следующее:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.0.1
То есть видно, что при запуске BIND или изменении DNS-настроек отрабатывают сценарии resolvconf, которые соответствующим образом изменяют эти файлы.
Чтобы настройки BIND брались из файла /var/run/bind/named.options нужно прописать его подключение в файле /etc/bind/named.conf, заменив директиву
include "/etc/bind/named.conf.options";
на директиву
include "/var/run/bind/named.options";
Теперь можно перезапустить BIND и он будет встраиваться в систему решения DNS-запросов таким образом, как мы этого и хотели.