Добавить в корзинуПозвонить
Найти в Дзене

Настройка кеширующего DNS-сервера Unbound для ускорения и безопасности

Проблема Большинство рабочих станций и серверов по умолчанию обращаются к DNS-резолверу интернет-провайдера или публичному сервису вроде Google Public DNS (8.8.8.8). Такой подход создаёт три проблемы. Задержка (каждый запрос уходит во внешнюю сеть, даже если адрес запрашивали минуту назад). Конфиденциальность (провайдер видит все домены, которые посещает организация). Безопасность (ответы DNS могут быть подменены в ходе атаки, а провайдерские резолверы не всегда проверяют DNSSEC). Развернуть собственный DNS-сервер на Bind9 или PowerDNS для кеширования избыточно, а использовать dnsmasq не всегда удобно из-за ограниченной функциональности. Настройка Unbound DNS это идеальный компромисс. Лёгкий, быстрый, строго соответствующий стандартам DNS-резолвер, созданный специально для проверки DNSSEC и высокопроизводительного кеширования. Он работает на любой Linux-машине, включая Raspberry Pi, и может обслуживать всю локальную сеть. Решение Установим и настроим Unbound в качестве локального кешир

Проблема

Большинство рабочих станций и серверов по умолчанию обращаются к 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.netm.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) для часто запрашиваемых записей.

Настройка кеширующего DNS-сервера Unbound для ускорения и безопасности | Андрей Коровин | Сисадмин | IT-инженер