Конфигурация локального DNS-резольвера с использованием BIND9 на Ubuntu 20.04/22.04

В данном руководстве вы узнаете, как установить локальный 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-серверами.

Настройка локального DNS-резолвера на Ubuntu 20.04 с использованием BIND9

Причины для запуска собственного локального 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-version-number-and-build-option-ubuntu-20.04

После установки BIND автоматически активируется по умолчанию. Вы можете проверить его состояние, используя:

systemctl status named

Если он не работает, запустите его, используя:

sudo systemctl start named

Активируйте автоматический запуск при старте системы.

sudo systemctl enable named

Сервер BIND будет функционировать под учетной записью пользователя bind, создаваемого в процессе установки, и будет прослушивать порты TCP и UDP 53. Это можно проверить, выполнив следующую команду:

sudo ss - lnptu | grep named

Настройка BIND9 на Ubuntu 20.04.

Запросы DNS, как правило, передаются через UDP-порт 53. Для ответов, превышающих 512 байт, применяется TCP-порт 53.

Читайте также:  Подгружаем субтитры к видео в Linux

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

К примеру, мы можем оценить состояние сервера имен BIND.

sudo rndc status

rndc — это утилита для управления демоном имен удаленного управления (remote name daemon controller) на Ubuntu 20.04.

Настройки для локального 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;

Включение службы рекурсии в BIND9 на Ubuntu 20.04.

Сохраните изменения и закройте документ. После этого проверьте правильность синтаксиса файла конфигурации.

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

local-dns-resolver-ubuntu-20.04

Совет: Если команда, указанная выше, не прекращает выполнение сразу, вы можете принудительно завершить её, нажав клавишу 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

привязать DNS-резолвер

Сохраните изменения в файле и закройте его. После этого перезапустите службу systemd-resolved.

Читайте также:  Как установить Zabbix Agent на CentOS/RHEL 8

sudo systemctl restart systemd-resolved

Теперь введите следующую команду для проверки DNS-резольвера, установленного по умолчанию.

systemd-resolve --status

bind9-recursive-resolver-ubuntu-20.04

Теперь осуществите 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-сервера для каждого подключения на Ubuntu.

Вы можете задать несколько 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

Установите резолвер DNS по умолчанию в Ubuntu 20.04 с помощью resolvconf.

Как видно, 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, как это показано ниже.

Читайте также:  Локальная аутентификация с использованием Рутокен MFA

сеть недоступна при разрешении '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. Как обычно, если информация вам понравилась, подписывайтесь на нашу бесплатную рассылку, чтобы получать дополнительные советы и рекомендации.