Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Предварительные требования
Для работы нам понадобятся:
- Два облачных (виртуальных) сервера с предустановленным дистрибутивом Linux Ubuntu 22.04 или 24.04. Первый будет играть роль сервера, на который мы установим BIND. Второй будет выступать в роли клиента.
Два облачных (виртуальных) сервера с предустановленным дистрибутивом Linux Ubuntu 22.04 или 24.04. Первый будет играть роль сервера, на который мы установим BIND. Второй будет выступать в роли клиента.
Для серверов выберите конфигурацию с одноядерным процессором, 2 ГБ оперативной памяти и публичным IPv4-адресом, который можно заказать при создании сервера или в разделе «Сеть».
Дополнительно для каждого сервера необходимо:
-
создать приватную сеть (можно сделать на этапе создания сервера или во вкладке «Сеть» в панели управления);
-
настроить приватный IP-адрес по инструкции.
создать приватную сеть (можно сделать на этапе создания сервера или во вкладке «Сеть» в панели управления);
настроить приватный IP-адрес по инструкции.
Сервер будет установлен в течение пары минут. Публичный и приватный IPv4-адреса, логин и пароль для подключения по протоколу SSH будут доступны в разделе «Дашборд».
Для чего может потребоваться свой DNS-сервер?
Система доменных имен (DNS) выполняет роль фундаментального навигатора во всемирной паутине, преобразуя удобные для человека адреса (например, google.com) в IP-адреса, подобно тому, как контакты в телефоне связывают имена с номерами. Хотя сегодня пользователям доступно множество популярных публичных DNS-сервисов от таких гигантов, как Google или Яндекс, развертывание собственного DNS-сервера открывает ряд стратегических преимуществ. Собственный DNS-сервер можно использовать для:
-
Локальной сети : быстрое разрешение имен компьютеров в домашней или офисной сети.
-
Кэширования : сохранение запросов для ускорения загрузки сайтов.
-
Безопасности : блокировка рекламы, вредоносных сайтов или установка родительского контроля с помощью фильтров.
-
Тестирования : для разработчиков — проверка доменов без влияния на глобальный DNS..
Локальной сети : быстрое разрешение имен компьютеров в домашней или офисной сети.
Кэширования : сохранение запросов для ускорения загрузки сайтов.
Безопасности : блокировка рекламы, вредоносных сайтов или установка родительского контроля с помощью фильтров.
Тестирования : для разработчиков — проверка доменов без влияния на глобальный DNS..
Команды ниже, необходимо выполнять от имени пользователя root или пользователя с правами sudo.
- Обновляем индекс репозиториев и устанавливаем необходимые пакеты:
apt update && apt -y install bind9 bind9utils- Проверим статус демона
bind:
Если в статусе отображается active (running), то сервис успешно запущен.
BIND хранит свои конфигурационные файлы в директории /etc/bind/. Основной файл называется /etc/bind/named.conf.options. Он указывает, где искать зоны (области DNS, например, ваш домен), указывает путь до логов и т.д.
Мы будем использовать следующие приватные IP-адреса:
- 192.168.0.4 — адрес сервера DNS
- 192.168.0.5. — адрес клиентского сервера.
Замените адреса выше на свои. IP-адреса должны находиться в одной подсети.
- Прежде чем приступать к редактированию файла, сделаем его резервную копию:
cp /etc/bind/named.conf.options /etc/bind/named.conf.options.backup- Откроем файл на редактирование:
nano /etc/bind/named.conf.optionsПриводим конфигурацию к следующему виду:
options {
directory "/var/cache/bind";
recursion yes;
allow-recursion { 192.168.0.0/24; 127.0.0.1; ::1; };
allow-query { 192.168.0.0/24; 127.0.0.1; ::1; localhost; };
listen-on port 53 { 127.0.0.1; 192.168.0.4; };
listen-on-v6 port 53 { ::1; };
dnssec-validation auto;
version "not revealed";
empty-zones-enable yes;
forwarders {
8.8.8.8;
8.8.4.4;
};
};- directory "/var/cache/bind";
Задает рабочий каталог сервера, где хранятся временные файлы, кэш DNS-записей и файлы зон. - recursion yes;
Разрешает серверу выполнять рекурсивные запросы. Когда клиент запрашивает доменное имя, сервер сам обращается к другим DNS-серверам для поиска ответа, если не имеет информации в кэше. - allow-recursion { 192.168.0.0/24; 127.0.0.1; ::1; };
Определяется список IP-адресов и сетей, которым разрешено выполнять рекурсивные запросы. В данном случае разрешено только локальным хостам и подсети с адресом 192.168.0.0/24. Не забудьте поменять на свою подсеть. - allow-query { 192.168.0.0/24; 127.0.0.1; ::1; localhost; };
Ограничивает круг клиентов, которые могут отправлять любые DNS-запросы к серверу. Доступ разрешен только доверенным сетям и локальным адресам. Не забудьте поменять на свою подсеть. - listen-on port 53 { 127.0.0.1; 192.168.0.4; };
Определяет IPv4-интерфейсы и порт, на котором сервер будет принимать соединения. Сервер слушает локальный интерфейс и конкретный IP-адрес 192.168.0.4 на стандартном порту 53. - listen-on-v6 port 53 { ::1; };
Аналогично предыдущему параметру, но только для соединений по протоколу IPv6. Сервер настроен принимать запросы только на локальном IPv6-адресе ::1. - dnssec-validation auto;
Включает автоматическую проверку подлинности DNS-данных с использованием технологии DNSSEC. Защищает от поддельных DNS-ответов и спуфинга. - version "not revealed";
Скрывает версию BIND в ответа от сервера. Это мера безопасности, затрудняет злоумышленникам поиск уязвимостей в конкретной версии программного обеспечения. - empty-zones-enable yes;
Разрешает обслуживание пустых зон, которые возвращают отрицательные ответы для запросов в несуществующих доменах. Уменьшает бесполезный интернет-трафик. - forwarders { 8.8.8.8; 8.8.4.4; };
Задает список внешних DNS-серверов, на которые перенаправляются запросы, когда данный сервер не является авторитативным для запрашиваемой зоны. В данном случае используются публичные DNS от компании Google.
Настройка локальной DNS зоны
Теперь настроим зоны DNS, которые наш сервер будет обслуживать.
Зоны DNS настраиваются в файле /etc/bind/named.conf.local.
Мы добавим локальную зону с именем local, но также можно использовать другое имя, например, home.lan.
- Открываем файл на редактирование при помощи текстового редактора nano:
nano /etc/bind/named.conf.localИспользуем следующую конфигурацию:
zone "local" {
type master;
file "/etc/bind/db.local";
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192";
};- zone "local"
Объявляет прямую зону DNS для доменаlocal. Ее задача — преобразовывать имена (например,server.local) в IP-адреса. Сервер ищет ответ на запрос в записях этой зоны. - type master
Указывает, что данный сервер BIND является основным (первичным) для зоны. Он хранит главную копию данных и именно на нем вносятся все изменения. - file "/etc/bind/db.local"
Определяет путь к файлу с DNS-записями для прямой зоны. Внутри этого файла прописываются все соответствия имен и адресов (записи A, AAAA, CNAME и т.д.). - zone "0.168.192.in-addr.arpa"
Создает обратную зону для подсети 192.168.0.0. Имя зоны записывается в обратном порядке, как этого требует стандарт. Эта зона отвечает за преобразование IP-адресов в доменные имена. - file "/etc/bind/db.192"
Задает файл с PTR-записями для обратной зоны. Эти записи связывают IP-адреса (вроде 192.168.0.10) с доменными именами, позволяя выполнять обратные DNS-запросы.
Настройка прямой DNS зоны
На следующем этапе нам необходимо создать и настроить прямую DNS-зону, которая содержит все записи о соответствии доменных имен IP-адресам в нашей локальной сети. Настройка прямой зоны осуществляется в файле /etc/bind/db.local.
- Делаем резервную копию перед редактированием основного файла:
cp /etc/bind/db.local /etc/bind/db.local.backup- Открываем файл
db.local:
Приводим файл к следующему виду:
$TTL 604800
@ IN SOA ns.local. root.local. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Minimum
@ IN NS ns.local.
ns IN A 192.168.0.4
dns IN A 192.168.0.4
client IN A 192.168.0.5
server IN A 192.168.0.4- $TTL 604800
Устанавливает время жизни DNS-записей. Значение 604800 указано в секундах и равно 7 дням. Это период, в течение которого кэширующие DNS-серверы могут хранить полученные записи перед повторным запросом. - Запись SOA
Основная административная запись зоны. Содержит в себе следующие записи:
* **ns.local.** — основной DNS-сервер для зоны.
* **root.local.** — email администратора (`root@local`).
* **Serial** — версия зоны.
* **Refresh** — как часто вторичные серверы проверяют обновления.
* **Retry** — интервал повтора при неудачном обновлении.
* **Expire** — время, после которого данные считаются устаревшими.
* **Minimum** — определяет, как долго DNS-сервер будет хранить информацию о записи в своем кеше, прежде чем запросить ее снова у авторитативного сервера.- Запись NS
@ IN NS ns.local. — Указывает, что серверns.localявляется авторитативным для этой зоны. - Записи A
Сопоставляют доменные имена с IP-адресами:
* `ns.local` → 192.168.0.4 (основной DNS-сервер)
* `dns.local` → 192.168.0.4 (альтернативное имя для DNS-сервера)
* `client.local` → 192.168.0.5 (клиентский компьютер)
* `server.local` → 192.168.0.4 (серверный хост)-
ns.local. — основной DNS-сервер для зоны.
-
root.local. — email администратора (
root@local). -
Serial — версия зоны.
-
Refresh — как часто вторичные серверы проверяют обновления.
-
Retry — интервал повтора при неудачном обновлении.
-
Expire — время, после которого данные считаются устаревшими.
-
Minimum — определяет, как долго DNS-сервер будет хранить информацию о записи в своем кеше, прежде чем запросить ее снова у авторитативного сервера.
-
ns.local→ 192.168.0.4 (основной DNS-сервер) -
dns.local→ 192.168.0.4 (альтернативное имя для DNS-сервера) -
client.local→ 192.168.0.5 (клиентский компьютер) -
server.local→ 192.168.0.4 (серверный хост)
Значения 192.168.0.4 (адрес сервера bind) и 192.168.0.5 (адрес клиентского сервера) необходимо поменять на свои IP адреса.
Настройка обратной DNS-зоны
На финальном этапе настроим файл обратной DNS-зоны, которая отвечает за преобразование IP-адресов в доменные имена. В файле /etc/bind/db.127 содержится шаблон обратной DNS-зоны, который уже содержит правильную структуру и все необходимые базовые записи. Копируем его в новый файл, который мы назовем db.192:
cp /etc/bind/db.127 /etc/bind/db.192Открываем файл на редактирование:
Используем следующую конфигурацию:
$TTL 604800
@ IN SOA ns.local. root.local. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Minimum
@ IN NS ns.local.
4 IN PTR ns.local.
5 IN PTR client.local.- $TTL 604800
Данная директива устанавливает стандартное значение Time To Live (время жизни) для всех записей в зоне, указанное в секундах. Период в 604800 секунд, что эквивалентно одной неделе, определяет срок хранения информации о записях на кэширующих резолверах до момента обязательного обращения к авторитативному серверу для верификации данных. Это ключевой механизм для оптимизации нагрузки и повышения отзывчивости DNS-инфраструктуры. - @ IN SOA ns.local. root.local.
Запись SOA является заголовочной для любой DNS-зоны и содержит критически важные метаданные:
* **ns.local.** : Определяет каноническое имя первичного (мастер) DNS-сервера, управляющего этой зоной.
* **root.local.** : Адрес электронной почты администратора зоны (символ `@` заменяется на точку).-
Serial 1
Уникальный идентификатор версии зоны. При внесении любых правок этот номер должен быть вручную увеличен. Вторичные серверы используют его для определения необходимости запроса обновленной копии зоны (процесс AXFR/IXFR). -
Refresh 604800
Период (в секундах), с которым вторичные (слейв) серверы будут опрашивать первичный на предмет наличия новой версии зоны (сравнивая Serial). -
Retry 86400
Интервал ожидания (в секундах) перед следующей попыткой соединения, если вторичному серверу не удалось связаться с первичным по истечении времени Refresh. -
Expire 2419200
Максимальный срок (в секундах), в течение которого вторичный сервер может продолжать отвечать на запросы данными из своей устаревшей копии, если соединение с мастер-сервером не восстановлено. По его истечении данные признаются недействительными. -
Minimum 604800
Значение TTL по умолчанию для отрицательных ответов (NXDOMAIN), которое указывает кэширующим серверам, как долго сохранять информацию об отсутствии запрашиваемой записи. -
@ IN NS ns.local.
Запись типа NS (Name Server) декларирует авторитативный сервер имен для данной доменной зоны. Символ @ является сокращением для текущего origin-домена. -
4 IN PTR ns.local.
PTR-запись используется для обратного DNS-поиска, устанавливая соответствие IP-адреса доменному имени. В контексте зоны обратного просмотра0.168.192.in-addr.arpaзапись связывает октет 4 (формируя полный адрес 192.168.0.4) с именемns.local.. -
ns.local. : Определяет каноническое имя первичного (мастер) DNS-сервера, управляющего этой зоной.
-
root.local. : Адрес электронной почты администратора зоны (символ
@заменяется на точку).
Валидация конфигурации и запуск службы
Перед применением изменений необходимо удостовериться в синтаксической корректности конфигурационных файлов.
Проверка общего синтаксиса главного файла конфигурации:
named-checkconf /etc/bind/named.confВалидация файла прямой зоны local:
named-checkzone local /etc/bind/db.localВалидация файла обратной зоны для сети 192.168.0.0/24:
named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192Успешное выполнение этих команд должно завершиться без выводов ошибок (или с сообщением "OK" для named-checkzone).
После успешной проверки необходимо применить конфигурацию:
Убедиться в корректности запуска службы можно командой:
Ожидаемый статус — active (running).
Далее мы проверим работоспособность нашего DNS сервера.
Проверка работоспособности BIND
После успешного перезапуска BIND рекомендуется провести серию диагностических запросов.**
**
- Выполним запрос к локальному серверу для разрешения имени
ns.local:
Ожидаемый результат: В секции ANSWER будет возвращен IP-адрес 192.168.0.4.
- Проверим работоспособность обратного DNS-поиска.
Запрос на преобразование IP-адреса 192.168.0.4 в доменное имя:
dig @localhost -x 192.168.0.4Ожидаемый результат: В ответе будет указано доменное имя ns.local..
- Проверим разрешения имени для второго хоста.
Используем утилиту nslookup для проверки записи клиентского хоста, зарегистрированного в зоне:
nslookup client.local 127.0.0.1Ожидаемый результат: Утилита вернет IP-адрес, ассоциированный с именем client.local, подтверждая корректную работу как прямой, так и обратной зон.
Настройка клиентов для работы с DNS-сервером
Что клиентские устройства могли использовать наш DNS-сервер, необходимо прописать соответствующие настройки. Подключаемся по протоколу SSH к клиентскому серверу.
- Открываем на редактирование файл
resolved.conf:
nano /etc/systemd/resolved.confПриводим файл к следующему виду:
[Resolve]
DNS=192.168.0.4 8.8.8.8
Domains=localВ конфигурации указаны два сервера доменных имен (DNS):
- Предпочитаемый DNS: 192.168.0.4
- Альтернативный DNS: 8.8.8.8
Сервер с адресом 192.168.168.0.4 является локальным, на котором функционирует служба BIND. Он обрабатывает все DNS-запросы в первую очередь, что позволяет эффективно разрешать внутренние имена и кэшировать внешние запросы для ускорения доступа.
Публичный DNS-сервер Google 8.8.8.8 выступает в роли резервного (fallback). Его использование активируется в двух основных сценариях: если основной сервер 192.168.0.4 не отвечает, или когда он не может найти запись (например, для доменов в глобальной сети Интернет). Это обеспечивает отказоустойчивость и гарантирует, что доступ к внешним ресурсам будет сохранен даже при проблемах с локальной инфраструктурой.
Директива search указывает систему доменных суффиксов для автоматического дополнения имен хостов. Когда вы вводите короткое имя (например, client), система автоматически попробует разрешить его как client.local. Это упрощает работу в локальной сети — вместо полного имени client.local можно использовать просто client.
Сохраняем изменения и выходим из файла.
-
Проверим, что символьная ссылка
/etc/resolv.confуказывает на../run/systemd/resolve/stub-resolv.conf: -
Перезапускаем службу
systemd-resolved:
systemctl restart systemd-resolvedВ выводе должны отображаться ранее добавленные DNS-серверы.
- Выполним команду
pingна доменное имя нашего DNS-сервера:
Пинг успешно проходит. На этом полная настройка собственного DNS-сервера успешно завершена.
В рамках данной статьи была реализована задача по развертыванию и конфигурированию полнофункционального DNS-сервера, использующего программное обеспечение BIND, в среде операционной системы Ubuntu. Описанный процесс охватывает полный цикл работ: от инсталляции требуемых пакетов до детальной настройки основных конфигурационных файлов, с последующей процедурой верификации корректности функционирования развернутого сервера.
В результате у нас есть собственный DNS-сервер, который:
- Повышает эффективность : Локальное разрешение имен происходит мгновенно, что ускоряет взаимодействие между серверами и устройствами в вашей сети.
- Предоставляет полный контроль : Вы можете самостоятельно создавать, изменять и управлять доменными именами и записями, адаптируя сеть под свои конкретные задачи.
- Служит основой для расширения : Настроенный сервер можно развивать — добавлять новые зоны, реализовывать политики безопасности, настраивать репликацию для отказоустойчивости или интегрировать с другими сетевыми службами.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.