Проблема
Большинство рабочих станций и серверов по умолчанию обращаются к 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 documentation и в Unbound Howto. Дополнительно сошлёмся на стандарты RFC 4033 (DNSSEC) и RFC 8106 (IPv6 Router Advertisement Options for DNS Configuration) для понимания механизмов.
Пошаговая инструкция
Шаг 1. Установка Unbound
Обновите систему и установите пакет:
bash
sudo apt update
sudo apt install unbound -y
В Debian/Ubuntu пакет сразу включает systemd-службу unbound.service. Проверьте её статус:
bash
sudo systemctl status unbound
После установки Unbound уже запущен с дефолтной конфигурацией /etc/unbound/unbound.conf, которая работает как простой кеширующий резолвер. Но нам нужно донастроить.
Шаг 2. Базовая настройка unbound.conf
Отредактируйте основной конфигурационный файл:
bash
sudo nano /etc/unbound/unbound.conf
Приведите секцию server: к следующему виду (закомментированные строки для информации о значениях по умолчанию):
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). Он должен быть актуальным. Скачайте свежую версию:
bash
sudo wget -O /usr/share/dns/root.hints https://www.internic.net/domain/named.root
Проверьте, что файл не пуст:
bash
head -n 20 /usr/share/dns/root.hints
Шаг 4. Инициализация DNSSEC и перезапуск
Unbound должен получить начальный ключ DNSSEC (trust anchor) для корневой зоны. Он сделает это автоматически при первом запуске, если указан параметр auto-trust-anchor-file. Перезапустите сервис, чтобы применить новую конфигурацию:
bash
sudo systemctl restart unbound
Убедитесь, что в логах нет ошибок:
bash
sudo journalctl -u unbound -f
Файл /var/lib/unbound/root.key будет создан автоматически.
Шаг 5. Тестирование работы Unbound
Проверьте, что резолвер работает локально:
bash
dig @127.0.0.1 google.com +short
Должен вернуться IP-адрес (или несколько). Теперь проверьте DNSSEC-валидацию с тестовым доменом:
bash
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-систем):
bash
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, добавив:
[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. |
| Клиенты из локальной сети не получают ответ от Unbound | access-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) для часто запрашиваемых записей.







