Настройка кэширующего DNS-сервера BIND в связке с resolvconf

Опять же на работе понадобилось настроить кэширующий 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-запросов таким образом, как мы этого и хотели.

Написать автору