Проблема
Большинство рабочих станций и серверов по умолчанию обращаются к DNS-резолверу интернет-провайдера или публичному сервису вроде Google Public DNS (8.8.8.8). Такой подход создаёт три проблемы. Задержка (каждый запрос уходит во внешнюю сеть, даже если адрес запрашивали минуту назад). Конфиденциальность (провайдер видит все домены, которые посещает организация). Безопасность (ответы DNS могут быть подменены в ходе атаки, а провайдерские резолверы не всегда проверяют DNSSEC). Развернуть собственный DNS-сервер на Bind9 или PowerDNS для кеширования избыточно, а использовать dnsmasq не всегда удобно из-за ограниченной функциональности. Настройка Unbound DNS это идеальный компромисс. Лёгкий, быстрый, строго соответствующий стандартам DNS-резолвер, созданный специально для проверки DNSSEC и высокопроизводительного кеширования. Он работает на любой Linux-машине, включая Raspberry Pi, и может обслуживать всю локальную сеть.
Решение
Установим и настроим Unbound в качестве локального кеширующего DNS-сервера с проверкой DNSSEC. В качестве базы возьмём Debian 12 или Ubuntu 24.04. Unbound будет слушать запросы на loopback-интерфейсе (127.0.0.1) и, при необходимости, на локальной сети (192.168.1.0/24). Все обращения к внешним DNS-серверам Unbound будет выполнять через корневые серверы (root hints), что исключает зависимость от провайдера. Проверка DNSSEC защитит от спуфинга. Официальное руководство по установке доступно в документации Unbound. Дополнительно сошлёмся на стандарты RFC 4033 (DNSSEC) и RFC 8106 (IPv6 Router Advertisement Options for DNS Configuration) для понимания механизмов.
Пошаговая инструкция
Шаг 1. Установка Unbound
Обновите систему и установите пакет.
text
sudo apt update
sudo apt install unbound -y
В Debian/Ubuntu пакет сразу включает systemd-службу unbound.service. Проверьте её статус.
text
sudo systemctl status unbound
После установки Unbound уже запущен с дефолтной конфигурацией /etc/unbound/unbound.conf, которая работает как простой кеширующий резолвер. Но нам нужно донастроить.
Шаг 2. Базовая настройка unbound.conf
Отредактируйте основной конфигурационный файл.
text
sudo nano /etc/unbound/unbound.conf
Приведите секцию server: к следующему виду (закомментированные строки для информации о значениях по умолчанию).
text
server:
# Интерфейс, на котором слушает Unbound
interface: 127.0.0.1
# Разрешить запросы из локальной сети (опционально)
# interface: 192.168.1.1
# Разрешить доступ только локальным клиентам
access-control: 127.0.0.0/8 allow
# access-control: 192.168.1.0/24 allow
# Порт (по умолчанию 53)
port: 53
# Предпочтительно использовать IPv4, если IPv6 не нужен
do-ip6: no
# Корневые серверы (root hints) — путь к файлу
root-hints: /usr/share/dns/root.hints
# Включаем DNSSEC
auto-trust-anchor-file: "/var/lib/unbound/root.key"
val-log-level: 2
# Скрываем информацию о версии сервера (безопасность)
hide-version: yes
hide-identity: yes
# Кеширование
cache-min-ttl: 300
cache-max-ttl: 86400
# Производительность
num-threads: 2
msg-cache-slabs: 4
rrset-cache-slabs: 4
infra-cache-slabs: 4
key-cache-slabs: 4
Если вы хотите, чтобы Unbound слушал запросы от других машин в локальной сети, раскомментируйте строки interface: 192.168.1.1 (укажите реальный IP вашего сервера) и access-control: 192.168.1.0/24 allow.
Шаг 3. Обновление корневых подсказок (root hints)
Файл root.hints содержит IP-адреса корневых DNS-серверов (a.root-servers.net … m.root-servers.net). Он должен быть актуальным. Скачайте свежую версию.
text
sudo wget -O /usr/share/dns/root.hints https://www.internic.net/domain/named.root
Проверьте, что файл не пуст.
text
head -n 20 /usr/share/dns/root.hints
Шаг 4. Инициализация DNSSEC и перезапуск
Unbound должен получить начальный ключ DNSSEC (trust anchor) для корневой зоны. Он сделает это автоматически при первом запуске, если указан параметр auto-trust-anchor-file. Перезапустите сервис, чтобы применить новую конфигурацию.
text
sudo systemctl restart unbound
Убедитесь, что в логах нет ошибок.
text
sudo journalctl -u unbound -f
Файл /var/lib/unbound/root.key будет создан автоматически.
Шаг 5. Тестирование работы Unbound
Проверьте, что резолвер работает локально.
text
dig @127.0.0.1 google.com +short
Должен вернуться IP-адрес (или несколько). Теперь проверьте DNSSEC-валидацию с тестовым доменом.
text
dig @127.0.0.1 sigfail.verteiltesysteme.net
dig @127.0.0.1 sigok.verteiltesysteme.net
Первый запрос должен вернуть статус SERVFAIL (подпись намеренно неверна), второй NOERROR и флаг ad (authenticated data). Это означает, что DNSSEC работает.
Шаг 6. Настройка системы на использование Unbound
Чтобы сам сервер использовал свой же кеширующий DNS, замените адрес резолвера в systemd-resolved или в /etc/resolv.conf.
Способ А (рекомендуемый для systemd-систем).
text
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
Способ Б (если используется NetworkManager). В настройках подключения укажите DNS-сервер 127.0.0.1 и отключите автоматическое получение DNS. Либо отредактируйте /etc/NetworkManager/NetworkManager.conf, добавив.
text
[main]
dns=none
Затем перезапустите NetworkManager и пропишите nameserver в /etc/resolv.conf вручную.
Теперь все DNS-запросы от этой машины будут обслуживаться Unbound с кешированием.
Шаг 7. Настройка клиентов локальной сети (опционально)
Если Unbound настроен как общий резолвер для сети (интерфейс 192.168.1.1 и access-control для подсети), на клиентских машинах пропишите DNS-сервером IP вашего Unbound-сервера. Для Linux-клиентов это делается правкой /etc/resolv.conf или через NetworkManager. Для Windows в свойствах IPv4 сетевого адаптера.
После этого все клиенты получат ускоренное разрешение имён и защиту DNSSEC без дополнительных настроек на каждом устройстве.
Устранение распространённых проблем
СимптомВероятная причинаРешениеunbound не запускается, ошибка «could not open root.key»Отсутствует или недоступен файл root.key, или нет прав на записьСоздайте пустой файл: sudo touch /var/lib/unbound/root.key && sudo chown unbound:unbound /var/lib/unbound/root.key. Перезапустите.DNSSEC-запросы возвращают SERVFAIL для всех доменовСистемное время сильно расходится с реальным (валидация DNSSEC чувствительна к точному времени)Установите NTP-синхронизацию: sudo timedatectl set-ntp true. Проверьте время: date. Расхождение более 5 минут приведёт к провалу валидации.dig @127.0.0.1 работает, а из браузера имена не разрешаютсяsystemd-resolved всё ещё активен и перехватывает порт 53Остановите и отключите systemd-resolved (шаг 6). Проверьте, что ни один другой процесс не слушает порт 53: sudo ss -tulpn | grep :53.Клиенты из локальной сети не получают ответ от Unboundaccess-control не разрешает их подсетьДобавьте запись вида access-control: 192.168.1.0/24 allow в unbound.conf и перезапустите сервис. Убедитесь, что Unbound слушает интерфейс, доступный из локальной сети (interface: 192.168.1.1).Очень медленные ответы при первом запросе после перезапускаНет кеша, Unbound выполняет полную рекурсию начиная от корневых серверовЭто нормально. Убедитесь, что root-hints указывает правильный файл. Со временем кеш заполнится, и ответы ускорятся.Unbound потребляет много памятиКеш разрастается неограниченноДобавьте в server: параметры rrset-cache-size: 256m и msg-cache-size: 256m для ограничения объёма кеша. Перезапустите.
Настройка Unbound DNS в режиме кеширующего резолвера это классический способ ускорить разрешение имён, повысить приватность и обеспечить защиту от спуфинга для всей локальной сети. Сервер обслуживает сотни клиентов без значительной нагрузки на процессор и память, попутно проверяя цифровые подписи DNSSEC. После развёртывания вы можете забыть о провайдерских DNS-серверах и быть уверенным, что никакое промежуточное звено не подменяет ответы. В дальнейшем конфигурацию можно расширить добавлением локальных зон (например, для разрешения внутренних хостов домена) или настройкой агрессивного кеширования (prefetch) для часто запрашиваемых записей.