В данном руководстве вы узнаете, как установить локальный DNS-резольвер на Ubuntu 22.04/20.04, используя популярное программное обеспечение BIND9 для DNS. DNS-резольвер имеет множество названий, некоторые из которых приведены ниже, однако все они обозначают одно и то же.
- полноценный резольвер (в отличие от упрощённого резольвера)
- DNS-рекурсор
- рекурсивный сервер DNS
- рекурсивный разрешатель
Не забудьте, что DNS-сервер может именоваться сервером имен. Примеры DNS-резольверов включают 8.8.8.8 (публичный DNS-сервер от Google) и 1.1.1.1 (публичный DNS-сервер от Cloudflare). На вашем компьютере также присутствует резольвер, который называется упрощенным из-за ограниченного функционала. Упрощенный резольвер — это компактный DNS-клиент, находящийся на конечном устройстве, который получает DNS-запросы от таких приложений, как Firefox, и пересылает их рекурсивному резольверу. Практически каждый резольвер способен кэшировать DNS-ответы для повышения скорости работы, поэтому их также называют кэширующими DNS-серверами.

Содержание статьи
- 1 Причины для запуска собственного локального DNS-резолвера.
- 2 Конфигурация локального DNS-резолвера на Ubuntu 22.04/20.04 с использованием BIND9.
- 3 Настройки для локального DNS-резольвера
- 4 Конфигурация обычного DNS-резолвера на сервере Ubuntu 22.04/20.04
- 5 Конфигурация DNS-сервера для каждой ссылки в Ubuntu 22.04/20.04.
- 6 Диагностика неисправностей
- 7 Настройка DNS-резолвера по умолчанию на клиентских устройствах.
- 8 Как деактивировать IPv6 в BIND
- 9 BIND возвращает ошибку SERVFAIL.
- 10 Ошибка DNSSEC в BIND.
- 11 Автоматическое повторное запускание Named
- 12 Наибольший объём кеша в BIND
- 13 Не удалось связаться с серверами.
- 14 Заключение
Причины для запуска собственного локального DNS-резолвера.
Чаще всего ваш компьютер или маршрутизатор обращается к DNS-резолверу вашего интернет-провайдера для обработки запросов DNS-имен. Но почему бы не установить локальный DNS-резолвер?
- Это может увеличить скорость обработки DNS-запросов, так как локальный DNS-резолвер реагирует исключительно на ваши запросы и не отвечает на запросы других пользователей. Таким образом, у вас значительно выше вероятность получения ответов DNS прямо из кэша резолвера. Сетевые задержки между вашим устройством и DNS-резолвером минимизированы (практически отсутствуют), что позволяет быстрее отправлять DNS-запросы на корневые DNS-серверы.
- При запуске почтового сервера и использовании DNS-черных списков (DNSBL) для борьбы со спамом рекомендуется создать собственный DNS-резолвер. Это необходимо, поскольку некоторые DNS-черные списки, например URIBL, не принимают запросы от общедоступных DNS-резолверов.
- При настройке собственного VPN-сервера на VPS (виртуальном частном сервере) рекомендуется установить DNS-резолвер на том же сервере.
- Возможно, вам потребуется настроить собственный DNS-резолвер, если вас беспокоит, что информация о вашем онлайн-серфинге сохраняется на внешних серверах.
Если у вас есть веб-сайт и вы хотите, чтобы разрешение имен для вашего домена обрабатывал ваш собственный DNS-сервер вместо сервера вашего регистратора, необходимо настроить авторитетный DNS-сервер. Этот сервер должен отличаться от DNS-резолвера. Программа BIND может функционировать как авторитетный DNS-сервер и DNS-резолвер одновременно, однако рекомендуется разделять эти две функции на разные сервера для повышения эффективности.
В данном руководстве объясняется процесс настройки локального DNS-резолвера. Поскольку он будет работать на localhost или в локальной сети, необходимость в шифровании (DNS через TLS или DNS через HTTPS) отсутствует. В следующей статье мы рассмотрим настройку резолвера с использованием DoT или DoH.
Подсказка: Локальный не обязательно означает ваш личный компьютер. Это скорее указывает на то, что DNS-резолвер функционирует на одном и том же устройстве с DNS-клиентом. Вы можете установить DNS-резолвер BIND на своем домашнем ПК, и он будет локальным для этого устройства. Также можно установить DNS-резолвер BIND на облачном сервере, что сделает его локальным для данного облачного сервера.
Конфигурация локального DNS-резолвера на Ubuntu 22.04/20.04 с использованием BIND9.
BIND (Berkeley Internet Name Domain) — это DNS-сервер с открытым исходным кодом, который нашел широкое применение в системах Unix/Linux благодаря своей надежности и отличным характеристикам. Первоначально его разработали в Университете Беркли.

После установки BIND автоматически активируется по умолчанию. Вы можете проверить его состояние, используя:
systemctl status named
Если он не работает, запустите его, используя:
sudo systemctl start named
Активируйте автоматический запуск при старте системы.
sudo systemctl enable named
Сервер BIND будет функционировать под учетной записью пользователя bind, создаваемого в процессе установки, и будет прослушивать порты TCP и UDP 53. Это можно проверить, выполнив следующую команду:
sudo ss - lnptu | grep named

Запросы DNS, как правило, передаются через UDP-порт 53. Для ответов, превышающих 512 байт, применяется TCP-порт 53.
Демон BIND известен как named. (Демон представляет собой программное обеспечение, функционирующее в фоновом режиме.) Исполняемый файл named устанавливается вместе с пакетом bind9, а также существует еще один ключевой исполняемый файл — rndc, который служит для удаленного управления демоном имен и устанавливается пакетом bind9utils. Файл rndc позволяет перезагружать, останавливать и контролировать различные аспекты работы демона BIND. Связь между компонентами происходит через TCP-порт 953.
К примеру, мы можем оценить состояние сервера имен BIND.
sudo rndc status

Настройки для локального DNS-резольвера
Каталог /etc/bind/ хранит конфигурационные файлы для BIND.
- named.conf — это главный файл конфигурации, который содержит настройки, заимствованные из трех других файлов.
- db.127: файл зоны обратного разрешения IPv4 для локального хоста.
- db. local: это файл зоны прямого отображения для IPv4 и IPv6, предназначенный для локального хоста.
- db. empty: файл зоны не содержит данных.
Пакет bind9 на Ubuntu 22.04 и 20.04 больше не включает файл db. root; вместо этого теперь применяется файл подсказок корня, расположенный по адресу /usr/share/dns/root. hints. Этот файл используется DNS-резольверами для обращения к корневым DNS-серверам. Существует 13 групп корневых DNS-серверов, начиная с a. root-servers.net и заканчивая m. root-servers.net.
Сервер BIND9 на Ubuntu по умолчанию предоставляет рекурсивные услуги исключительно для localhost и клиентов локальной сети. Запросы от внешних источников будут отклонены. Таким образом, нет необходимости вносить изменения в конфигурационные файлы. Чтобы познакомить вас с настройками BIND 9, я продемонстрирую, как активировать сервис рекурсии.
Главный конфигурационный файл BIND, расположенный по пути /etc/bind/named.conf, получает настройки из трёх других файлов.
- /etc/bind/named.conf.options
- /etc/bind/named.conf.local
- /etc/bind/named.conf.default-zones
Для активации функции рекурсии внесите изменения в первый файл.
sudo nano /etc/bind/named.conf.options
В разделе options внесите следующие строки. Подмените IP-адреса в команде allow-recursion на ваши собственные адреса локальной сети.
// скрыть номер версии от клиентов по соображениям безопасности. version "в настоящее время недоступен"; // необязательно - поведение по умолчанию BIND - рекурсия recursion yes; // предоставлять рекурсивный сервис только доверенным клиентам allow-recursion < 127.0.0.1; 192.168.0.0/24; 10.10.10.0/24; >; // включить журнал запросов querylog yes;

Сохраните изменения и закройте документ. После этого проверьте правильность синтаксиса файла конфигурации.
sudo named-checkconf
В случае успешного завершения теста, что свидетельствует об отсутствии ошибок, перезапустите BIND9.
sudo systemctl restart named
Если на сервере BIND установлен брандмауэр UFW, необходимо разрешить доступ к порту 53, чтобы пользователи локальной сети могли отправлять DNS-запросы.
sudo ufw allow in from 192.168.0.0/24 to any port 53
Данная операция позволит открыть порты TCP и UDP 53 для частной сети 192.168.0.0/24. После этого, с другого устройства в той же локальной сети, можно выполнить команду для запроса A-записи google.com. Не забудьте заменить 192.168.0.102 на IP-адрес вашего BIND-резолвера.
dig A google.com @192.168.0.102
Теперь выполните проверку журнала запросов на резолвере BIND с использованием следующей команды.
sudo journalctl - eu named
В этом сообщении содержится информация о последнем логе службы bind9. Я обнаружил строку, в которой говорится, что DNS-запрос A записи для google.com поступил с порта 57806 от 192.168.0.103.
named[1162]: client @0x7f4d2406f0f0 192.168.0.103#57806 (google.com): query: google.com IN A +E(0)K (192.168.0.102)
Конфигурация обычного DNS-резолвера на сервере Ubuntu 22.04/20.04
Systemd-resolved служит резолвером на Ubuntu 22.04 и 20.04. Как было сказано ранее, резолвер представляет собой компактный DNS-клиент на пользовательском устройстве, который получает DNS-запросы от таких приложений, как Firefox, и направляет их на рекурсивный резолвер.
Эту команду можно использовать для отображения стандартного рекурсивного резолвера.
resolvectl status
или на устаревшей версии Ubuntu:
systemd-resolve --status

Совет: Если команда, указанная выше, не прекращает выполнение сразу, вы можете принудительно завершить её, нажав клавишу Q.
Как видно, BIND не установлен как значение по умолчанию. Если вы выполните следующую команду на сервере BIND,
dig A facebook.com
Данный DNS-запрос не будет зарегистрирован в журнале BIND. Вам необходимо явно указать команде dig использовать BIND.
dig A facebook.com @127.0.0.1
Для того чтобы настроить BIND в качестве основного разрешателя, необходимо отредактировать файл конфигурации systemd-resolved.
sudo nano /etc/systemd/resolved.conf
В разделе [Resolve] внесите следующую запись. Это позволит установить глобальный DNS-сервер для вашего сервера.
DNS=127.0.0.1

Сохраните изменения в файле и закройте его. После этого перезапустите службу systemd-resolved.
sudo systemctl restart systemd-resolved
Теперь введите следующую команду для проверки DNS-резольвера, установленного по умолчанию.
systemd-resolve --status

Теперь осуществите DNS-запрос, не используя 127.0.0.1.
dig A facebook.com
В журнале BIND отобразится DNS-запрос, что свидетельствует о том, что BIND стал сервером рекурсивного разрешения по умолчанию. Если запросы в журнале BIND отсутствуют, возможно, потребуется настроить DNS-сервер для каждой ссылки.
Конфигурация DNS-сервера для каждой ссылки в Ubuntu 22.04/20.04.
Вы можете индивидуально настроить DNS-сервер для каждой ссылки, что позволит изменить настройки глобального DNS-сервера. Существует два метода для настройки DNS-серверов для каждой ссылки:
- с помощью systemd-resolved
- посредством netplan
systemd-resolved
Список документов в директории /etc/systemd/network/.
ls /etc/systemd/network/
05-eth0.network 99-default. link
У меня имеется два файла конфигурации для сетевых ссылок. Файл 05-eth0.network предназначен для основного сетевого интерфейса, и именно его я сейчас редактирую.
sudo nano /etc/systemd/network/05-eth0.network
Название вашего файла может отличаться. Если в данной папке отсутствуют файлы, это означает, что ваша настройка DNS для каждой ссылки не контролируется systemd-resolved.
Закомментируйте стандартную запись для DNS и домена, затем добавьте свою индивидуальную запись DNS.
DNS=127.0.0.1
Сохраните изменения в файле и закройте его. После этого перезапустите службы systemd-resolved и systemd-networkd.
sudo systemctl restart systemd-resolved systemd-networkd
netplan
Некоторые серверы Ubuntu могут применять netplan для конфигурации сетевых соединений для каждой интерфейса. В таком случае необходимо настроить DNS-сервер в. yaml файле, который находится в директории /etc/netplan/. Просмотрите файлы в этой директории.
ls /etc/netplan/
01-netcfg. yaml
Вот почему я вношу изменения в этот документ.
sudo nano /etc/netplan/01-netcfg. yaml
Настройте адрес DNS-сервера в разделе серверов имен.
nameservers: search: [ invalid ] addresses: - 127.0.0.1

Вы можете задать несколько DNS-резолверов, как показано ниже, что поможет снизить риск возникновения проблем с DNS.
nameservers: search: [ invalid ] addresses: - 127.0.0.1 - 8.8.8.8 - 1.1.1.1
Сохраните файл и закройте его. После этого внесите изменения.
sudo netplan apply
Обратите внимание: если вы получите сообщение об ошибке, это означает, что netplan не смог справиться с файлом конфигурации.
Invalid YAML at /etc/netplan/01-netcfg. yaml inconsistent indentation
Необходимо исправить несоответствующее выравнивание и повторно выполнить команду sudo netplan apply.
Диагностика неисправностей
Проверьте файл /etc/resolv.conf на наличие информации.
cat /etc/resolv.conf

Как видно, 127.0.0.1 (BIND) настроен как стандартный DNS-резолвер. Если вместо этого отображается другое значение, значит, BIND все еще не установлен в качестве вашего основного резолвера. Для того чтобы установить BIND в качестве резолвера по умолчанию, вы можете воспользоваться утилитой resolveconf.
Установите пакет под названием resolvconf.
sudo apt install resolvconf
После этого активируйте службу named-resolvconf.
sudo systemctl start named-resolvconf.service
Активируйте автозапуск при старте системы.
sudo systemctl enable named-resolvconf.service
Теперь снова проверьте файл /etc/resolv.conf.На вашем сервере Ubuntu BIND должен выступать в роли DNS-резолвера по умолчанию.
cat /etc/resolv.conf
Имейте в виду, что некоторые хостинг-провайдеры, например Linode, могут применять сетевой помощник для автоматического создания файла /etc/resolv.conf.Чтобы изменить DNS-резолвер по умолчанию, необходимо отключить данного сетевого помощника в панели управления хостингом.
Если данный метод по-прежнему не приносит результата, возможно, причина в том, что файл /etc/resolv.conf на вашем сервере Ubuntu не ссылается на /run/resolvconf/resolv.conf.В этом случае необходимо удалить файл /etc/resolv.conf и установить символическую ссылку.
sudo rm /etc/resolv.conf sudo ln - s /run/resolvconf/resolv.conf /etc/resolv.conf
Вы можете самостоятельно создать этот файл и установить для него атрибут «только для чтения», чтобы избежать его перезаписи другими приложениями на одном и том же сервере.
sudo rm /etc/resolv.conf echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf sudo chmod 444 /etc/resolv.conf
systemd-resolved не активен.
Если после выполнения команды systemd-resolve —status появляется следующая ошибка,
Не удалось получить глобальные данные: Единица dbus-org. freedesktop. resolve1.service не найдена.
Вероятно, service systemd-resolved не активен. Активируйте его, используя команду:
sudo systemctl status systemd-resolved
sudo systemctl enable systemd-resolved
Настройка DNS-резолвера по умолчанию на клиентских устройствах.
На настольном компьютере с Ubuntu вы можете воспользоваться указанными ранее рекомендациями для установки DNS-резолвера по умолчанию, однако учтите, что необходимо заменить 127.0.0.1 на IP-адрес вашего сервера BIND. Инструкции по установке DNS-резолвера по умолчанию для MacOS и Windows доступны в сети.
Как деактивировать IPv6 в BIND
Если ваша сеть не использует IPv6, рекомендуется отключить его в BIND, иначе в журналах BIND появится множество ошибок, связанных с IPv6, как это показано ниже.
сеть недоступна при разрешении 'mirrors. fedoraproject. org/A/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53 сеть недоступна при разрешении 'mirrors. fedoraproject. org/AAAA/IN': 2001:4178:2:1269:dead:beef:cafe:fed5#53 сеть недоступна при разрешении 'mirrors. fedoraproject. org/A/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53 сеть недоступна при разрешении 'mirrors. fedoraproject. org/AAAA/IN': 2610:28:3090:3001:dead:beef:cafe:fed5#53
Для отключения IPv6 в BIND на Ubuntu достаточно открыть файл /etc/default/named.
sudo nano /etc/default/named
Уменьшите параметры OPTIONS на 4.
OPTIONS="-u bind -4"
Сохраните изменения в файле и закройте его. После этого перезапустите BIND, и на этом всё.
sudo systemctl restart named
BIND возвращает ошибку SERVFAIL.
Если ваш резолвер BIND не способен обработать DNS-запросы (SERVFAIL), и в журнале BIND присутствует следующая запись.
dnssec: предупреждение: managed-keys-zone: Не удалось получить набор DNSKEY '.': время ожидания истекло
Скорее всего, проблема связана с отсутствием активного подключения IPv6 на вашем сервере. У меня была аналогичная ситуация с одним из моих серверов. Я был уверен, что соединение IPv6 функционирует нормально, но оно неожиданно перестало работать, и я не мог выяснить причину. Как только я отключил IPv6 в BIND, разрешение DNS восстановилось.
Ошибка DNSSEC в BIND.
Если в журналах BIND обнаружены указанные ошибки, это свидетельствует о наличии проблемы с доверием к ключам DNSSEC в BIND.
named[2194196]: managed-keys-zone: DNSKEY для зоны '.' не удалось проверить с текущими ключами named[2194196]: validating ./NS: не найдена действительная подпись named[2194196]: не удалось найти действительный RRSIG при разрешении './NS/IN': 192.36.148.17#53 named[2194196]: validating ./NS: не найдена действительная подпись named[2194196]: не удалось найти действительный RRSIG при разрешении './NS/IN': 198.97.190.53#53 named[2194196]: validating ./NS: не найдена действительная подпись named[2194196]: не удалось найти действительный RRSIG при разрешении './NS/IN': 199.9.14.201#53 named[2194196]: validating ./NS: не найдена действительная подпись named[2194196]: не удалось найти действительный RRSIG при разрешении './NS/IN': 192.5.5.241#53 named[2194196]: validating ./NS: не найдена действительная подпись
Для корректной работы мы можем восстановить базу данных управляемых ключей, используя следующие команды.
sudo rndc managed-keys destroy sudo rdnc reconfig
Автоматическое повторное запускание Named
В случае завершения процесса Named по любой причине, необходимо выполнить следующую команду для его перезапуска.
sudo systemctl restart named
Чтобы Named перезапускался автоматически без ручного ввода команды, можно изменить юнит службы systemd named.service. Для этого нужно создать отдельный каталог, чтобы изменить стандартную конфигурацию службы systemd.
sudo mkdir - p /etc/systemd/system/named.service.d/
Создайте файл в указанной папке.
sudo nano /etc/systemd/system/named.service.d/restart.conf
Внесите в файл следующие строки, чтобы Named автоматически перезапускался спустя 5 секунд после выявления ошибки.
[Service] Restart=always RestartSec=5s
Закройте и сохраните файл, после чего выполните перезагрузку systemd.
sudo systemctl daemon-reload
Для проверки работоспособности завершите выполнение Named с использованием:
sudo pkill named
Проверьте состояние Named. Вы заметите, что Named перезапустился автоматически.
systemctl status named
Наибольший объём кеша в BIND
BIND способен сохранять результаты DNS-запросов в кэше на сервере, что ускоряет обработку запросов для клиентов. Система предполагает использование выделенного DNS-резольвера, то есть на этом хосте не должны работать другие веб-сервисы. По этой причине объем кэша по умолчанию (определяемый параметром max-cache-size) установлен на 90% от общего объема оперативной памяти для оптимальной производительности. При запуске BIND в журнале (sudo journalctl — eu named) можно увидеть строку, похожую на указанную ниже.
none:100: 'max-cache-size 90%' - установка на 7165MB (из 7961MB)
Имейте в виду, что BIND не задействует сразу 90% вашей оперативной памяти. При наличии всего лишь нескольких DNS-запросов BIND потребляет лишь небольшую часть ОЗУ, так как количество кэшируемых DNS-результатов невелико. В случае, если запросов становится много, система начнет активно использовать оперативную память для хранения кэша DNS.
Если объем вашей оперативной памяти ограничен, возможно, вы предпочли бы, чтобы BIND не использовал 90% вашей ОЗУ для кэширования. Внесите изменения в конфигурационный файл BIND по адресу /etc/bind/named.conf.options.
sudo nano /etc/bind/named.conf.options
Включите следующую команду в раздел options. Замените 50% на желаемое вами значение.
max-cache-size 50%;
Перезапустите BIND, чтобы изменения начали действовать.
sudo systemctl restart named
Обратите внимание: при перезапуске BIND произойдет полное очищение его кэша.
Не удалось связаться с серверами.
Если вы столкнулись с указанной ошибкой при выполнении команды dig на своих клиентских устройствах
;; время соединения истекло; не удалось достучаться до серверов
Это может указывать на то, что
- Правила вашего брандмауэра некорректны. Пожалуйста, просмотрите журналы брандмауэра.
- Резольвер BIND не функционирует.
- BIND не принимает соединения на сетевом интерфейсе.
- Можете ли вы отправить ping с DNS-клиента на DNS-резольвер?
Заключение
Надеюсь, данный учебник оказался для вас полезным в процессе настройки локального DNS-резольвера на Ubuntu 22.04/20.04 с использованием BIND9. Как обычно, если информация вам понравилась, подписывайтесь на нашу бесплатную рассылку, чтобы получать дополнительные советы и рекомендации.

