Bind9

Базовая настройка

Установка

Пакет называется:

  • bind9 в Debian, Astra Linux
  • bind в CentOS Stream, ALT Linux

Синтаксис конфигов

  • блоки в {} заканчиваются точкой с запятой
  • в списках в {} элементы разделяются точкой с запятой
  • все опции в формате название значение;

Пример:

options {
    forwarders {
        1.1.1.1;
        8.8.8.8;
    };
    dnssec-validation auto;
};

Основные опции

Путь к папке с конфигами:

  • /etc/bind - обычно
  • /etc/named - если нет в прошлом
  • если нигде нет, то гуглите

В папке с конфигами обычно есть файл named.conf.options. Там по дефолту обычно есть несколько опций.

Самые нужные(не только из того, что есть по дефолту):

  • forwarders - список серверов для пересылки(через ; в фигурных скобках, все блоки фигурных скобок заканчиваются ;)
  • dnssec-validation - режим проверки DNSSEC, если что-то не пашет, то отключайте(no)
  • allow-query - список откуда можно делать запросы к серверу
  • listen-on - список адресов, на которых сервер слушает запросы

Создание своей зоны

Копируем db.local куда-нибудь. Делаем в нём некоторые изменения

Должно получиться примерное следующее:

$TTL    604800
@   IN  SOA vm.lan. root.vm.lan. (
    2       ; Serial
    604800  ; Refresh
    86400   ; Retry
    2419200 ; Expire
    604800  ; Negative Cache TTL
)
@       IN  NS      ns.vm.lan.
ns      IN  A       172.16.1.1

record1 IN  A       172.16.1.2
record2 IN  AAAA    ::1
record3 IN  CNAME   record2
record4 IN  TXT     ahahahahhahah

Тут:

  • в SOA записи vm.lan. - сам домен(ОБЯЗАТЕЛЬЯНО С ТОЧКОЙ), root.vm.lan. - указатель на адмиистратора домена(чё угодно)
  • делаем NS запись для обозначения сервера, который обслуживает домен
  • делаем A запись с именем из NS записи, A запись указывает на сервер, который обслуживает домен
  • делаем все остальные необходимые записи

Полезно: основные типы DNS записей

Теперь необходимо описать зону в конфиге bind9. Идем в named.conf.local и дописываем что-то такого вида:

zone "vm.lan" {
    type master;
    file "/путь/до/файла/зоны";
};

Тут:

  • после zone в скобках домен УЖЕ БЕЗ ТОЧКИ
  • тип master - в этой заметке все упрощено и ничего кроме мастер зоны не нужно
  • file - путь до файла зоны(с предыдущего шага)

Рестартует bind9 и проверяем

systemctl restart bind9(может быть другое название, пробуйте named, bind и прочие названия)

dig @172.16.1.1 record1.vm.lan +short

Бывает нужно, чтобы сервер отвечал для запросов из разных сетей по разному, ну например в случае, если нам необходимо обрабатывать запросы из разных филиалов, где разная адресация, или когда у нас есть внутрення сеть и внешний мир.
Для реализации данных возможностей нам необходимо описать acl списки (можно и без них) и изменить наш конфиг с учётом описания представлений (view). Пример - опишем 2 списка - eu_list и spb_list:

acl eu_list {
        100.70.2.32/27;
        };
acl spb_list {
        100.70.5.48/28;
        };

Далее опишем 3 представления (view) - europe, spb и all. Внимание описание представлений должно быть по нарастающей, т.к. обработка идёт последовательно, т.е. вначале вы описываете какие-то частные случаи, а потом добавляете всё остальное. Также не забываем, что при попадании вашего запроса в одно из представлений, в остальные он не попадёт. т.е. если вы в eu_list не добавите зоны из view all, то при запросе вы их не получите!
Примеры описания наших 3 представлений - europe, spb и all:\

view "europe" {
        match-clients {
            eu_list;
        };
        zone "jun39.wsr" {
            type master;
            file "jun39.wsr";
        };
    };

view "spb" {
        match-clients {
            spb_list;
        };
        zone "jun39.wsr" {
            type master;
            file "jun39.wsr_1";
        };

    };

view "all" {
        match-clients {
            any; #обратите внимание, что мы не стали делать ещё один список, а просто использоватли слово any - т.е. зона для запросов от любых клиентов
        };
        zone "debil.zone" {
            type master;
            file "debil.zone";
        };

    };

Теперь поясним как это будет работать:

  • Представим, что запрос идёт из сети 100.70.2.32/27 - т.е. по acl списку eu_list:
    • Если мы будем запрашивать имена из зоны jun39.wsr, то мы получим ответ, соответствующий описанию зоны в файле jun39.wsr
    • Если мы запросим что-то из зоны debil.zone то в ответ мы ничего не получим, т.к. сработает представление для спика eu_list, но в нём зона debil.zone не описана
  • Представим, что запрос идёт из сети 100.70.5.48/28 - т.е. по acl списку spb_list:
    • Если мы будем запрашивать имена из зоны jun39.wsr, то мы получим ответ, соответствующий описанию зоны в файле jun39.wsr_1
    • Если мы запросим что-то из зоны debil.zone то в ответ мы ничего не получим, т.к. сработает представление для спика spb_list, но в нём зона debil.zone не описана
  • Представим, что запрос идёт из любой сети, кроме тех, что писаны в списках доступа eu_list и spb_list:
    • Если мы будем запрашивать имена из зоны jun39.wsr, то в ответ мы ничего не получим, т.к. зона jun39.wsr для представления all не описана
    • Если мы запросим что-то из зоны debil.zone то мы получим ответ, соотвествующий описанию зоны в файле debil.zone