Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Создание локального домена при помощи BIND9

Александр Бархатов
Александр Бархатов
Технический писатель
19 января 2024 г.
712
7 минут чтения
Средний рейтинг статьи: 5

DNS (расшифровывается как Domain Name System) представляет собой систему доменных имен, которая предназначена для преобразования IP-адреса в доменные имена и наоборот. При использовании DNS нет необходимости запоминать IP-адреса необходимых вам ресурсов, достаточно знать доменное имя. 

Организовать DNS можно в локальной сети путем создания локального домена, который будет доступен только в пределах данной сети и не будет доступен извне. В данной статье мы создадим локальный домен с именем class.local при помощи программы BIND — популярной и бесплатной реализации DNS-сервера.

Предварительные требования

Для создания локального домена нам потребуется:

  • Сервер или виртуальная машина с предустановленной ОС Ubuntu 22.04 для установки DNS-сервера BIND9. На этом же сервере будет осуществляться проверка работоспособности созданного домена.

  • Созданная и настроенная приватная сеть для сервера. Создание приватной сети описано в нашей инструкции: Управление приватными сетями.

Установка сервера BIND9

Все последующие шаги будут выполняться под учетной записью root.

Обновляем индексы репозиториев и устанавливаем необходимые пакеты DNS-сервера BIND. Также дополнительно установим пакет dnsutils, который содержит в себе клиентские утилиты для диагностики работы DNS:

apt update && apt -y install bind9 bind9utils dnsutils

Image10

На этом установка завершена. Далее мы перейдем к редактированию конфигурационных файлов.

Создание доменной зоны

  1. Открываем при помощи любого текстового редактора конфигурационный файл с именем named.conf.local, в котором прописываются создаваемые DNS-зоны:
vi /etc/bind/named.conf.local

Создадим доменную зону с именем class.local, вписав следующий блок:

zone "class.local" {
   type master;
   file "/etc/bind/db.class.local";
};

Где:

  • zone "class.local" — название создаваемой DNS-зоны;
  • type master — тип DNS-сервера. В нашем примере DNS-сервер будет выступать в роли мастера. Основная задача мастер-сервера состоит в хранении ресурсных записей и управлении ими. Также DNS-сервер может выступать в роли ведомого (slave) сервера. Роль slave позволяет получать и хранить информацию о доменных зонах с главного сервера (master). Также позволяет снижать нагрузку с главного DNS-сервера.
  • file "/etc/bind/db.class.local — указывается полный путь до файла, в котором хранятся настройки создаваемой доменной зоны.

Также создадим второй блок, который будет отвечать за так называемый Reverse DNS lookup — обратный просмотр DNS, который позволяет определять доменное имя, используя IP-адрес:

zone "192.168.126.in-addr.arpa" {
   type master;
   file "/etc/bind/db.10";
};

В итоге файл named.conf.local должен выглядеть как на скриншоте ниже:

Image8

Сохраняем и выходим из файла.

  1. Создаем конфигурационный файл для ранее созданной зоны class.local, взяв за основу шаблон файла db.local:
cp /etc/bind/db.local /etc/bind/db.class.local

Открываем на редактирование файл db.class.local:

vi /etc/bind/db.class.local

Приводим содержимое файла к следующему виду:

;
; BIND data file for class.local
;
$TTL    604800
@       IN      SOA     class.local. root.class.local. (
                              7           ; Serial
                        86400       ; Refresh
                        7200          ; Retry
                        3600000   ; Expire
                        172800 )       ; Negative Cache TTL
;
@       IN      NS      srv1.class.local.
@       IN      A       192.168.126.130
@       IN      AAAA    ::1
srv1    IN      A       192.168.126.130

Image7

Где:

  • $TTL 604800 — время жизни, которое указывает, как долго будут храниться настройки DNS в кэше, прежде чем они будут автоматически обновлены. Указывается в секундах;
  • @ IN SOA class.local. root.class.local. — SOA запись домена. В SOA указываются базовые сведения о домене. В данной записи используются следующие сведения:
    • 7 ; Serial — серийный номер, предназначенный для маркирования файла зоны. Представлен 32-разрядным числом;
    • 86400 ; Refresh — время ожидания ответа от вторичного DNS-сервера для отправки запроса на получение SOA-записи с первичных серверов. По истечении указанного времени вторичный DNS-сервер посылает запрос к первичному DNS-серверу для получения текущей копии SOA-записи. Обозначается в секундах.
    • 7200 ; Retry — определяет время между попытками, если вторичный сервер не может связаться с первичным сервером, когда время обновления истекло. Обозначается в секундах.
    • 3600000 ; Expire — временный промежуток, сообщающий серверу необходимость повторной попытки синхронизации информации с главным DNS-серверов. Обозначается в секундах.
    • 172800 ) ; Negative Cache TTL — временный интервал который должен пройти прежде чем информация о запрашиваемом домене не будет найдена. Обозначается в секундах.
  • @ IN NS srv1.class.local, @ IN A 192.168.126.130, @ IN AAAA ::1, srv1 IN A 192.168.126.130 — ресурсные записи DNS. 

Сохраняем и выходим из файла.

  1. Создаем конфигурационный файл для ранее созданной обратной зоны, взяв за основу шаблон файла db.127:
cp /etc/bind/db.127 /etc/bind/db.10

Открываем на редактирование файл db.10:

vi /etc/bind/db.10

И приводим его к следующему виду:

;
; BIND reverse data file for local 192.168.126.xxx network
;
$TTL    604800
@       IN      SOA     srv1.class.local. root.class.local. (
                              7               ; Serial
                          86400           ; Refresh
                          7200             ; Retry
                          3600000      ; Expire
                          172800 )       ; Negative Cache TTL
;
@       IN      NS      srv1.
10      IN      PTR     srv1.class.local.

Сохраняем и выходим из файла.

Итоговая структура должна выглядеть следующим образом представленная на скриншоте ниже:

Image3

Перезагрузка и добавление в автозагрузку сервиса bind9

После того как все необходимые конфигурационные файлы были отредактированы, необходимо перезагрузить сервис bind9, чтобы он смог применить новые изменения. Перезагружаем сервис bind9 и добавляем его в автозагрузку с помощью команд:

systemctl restart bind9 && systemctl enable bind9

Для проверки статуса DNS-сервера выполним команду:

systemctl status bind9

Image5

Если в разделе Active отображается статус active (running), значит, bind9 успешно запущен и работает.

Разрешение трафика bind9 в UFW/Iptables

Если используется firewall, например, ufw или Iptables, то необходимо открыть 53 порт (порт по умолчанию для DNS). 

При использовании UFW (Uncomplicated Firewall) можно воспользоваться несколькими способами:

sudo ufw allow dns

Или, для протокола TCP:

sudo ufw allow 53/tcp

Или, для протокола UDP: 

sudo ufw allow 53/udp

При использовании Iptables синтаксис правил будет следующим:

  • Для протокола TCP:
sudo iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
  • Для протокола UDP:
sudo iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT

Проверка работоспособности DNS 

Для того чтобы проверить работоспособность DNS, необходимо прописать адрес DNS-сервера В Linux-системах адреса DNS-серверов прописываются в файле /etc/resolv.conf. Однако стоит учесть, что при перезагрузке системы файл /etc/resolv.conf автоматически пересоздается. Если прописать в файле необходимые DNS-адреса вручную, то изменения после перезагрузки хоста будут удалены. Для решения данной проблемы воспользуемся сторонним пакетом — resolvconf, который предназначен для управления информацией о серверах имен. Устанавливаем пакет при помощи команды:

apt -y install resolvconf

Проверяем статус службы resolvconf:

systemctl status resolvconf.service

Image9

Если в разделе Active отображается статус active (running), то resolvconf успешно запущен и работает. Если статус будет другой, то необходимо запустить resolvconf вручную, выполнив команду:

systemctl start resolvconf.service

Далее добавляем сервис resolvconf в автозагрузку:

systemctl enable resolvconf.service

Открываем на редактирование файл head:

vi /etc/resolvconf/resolv.conf.d/head

И прописываем в нем IP-адрес сервера, где находится DNS-сервер. В данном примере DNS установлен на сервере с адресом 192.168.126.130:

nameserver 192.168.126.130

Image1

Сохраняем изменения и выходим из файла.

Чтобы внесенные изменения были перенесены в файл resolv.conf, необходимо выполнить две команды:

resolvconf --enable-updates
resolvconf -u

После этого проверяем файл resolv.conf:

cat /etc/resolv.conf

Image2

Как можно заметить, наш ранее созданный DNS-сервер с адресом 192.168.126.130 успешно был добавлен.

Проверяем, что ранее созданный домен srv1.class.local успешно пингуется:

ping srv1.class.local

Image4

Также воспользуемся утилитой nslookup, чтобы запросить IP-адрес, используя доменное имя:

nslookup srv1.class.local

Image6

В ответе вернулся IP-адрес нашего DNS-сервера.

Заключение

Систему DNS можно использовать как для общедоступных имен, так и в частных сетях. При помощи DNS отпадает необходимость использования IP-адресов для сервисов в вашей локальной сети, и вы можете задавать понятные имена.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону