Unbound — рекурсивный DNS-резолвер с открытым кодом, который умеет кэшировать ответы и проверять подписи DNSSEC. В небольшой сети он заменяет DNS-сервер провайдера: запросы уходят напрямую к корневым и авторитативным серверам, ответы проверяются по цепочке доверия, а повторные обращения обслуживаются из памяти за доли миллисекунды. Настройка требует аккуратности: резолвер занимает порт 53 и конфликтует с systemd-resolved, а ошибка в якоре доверия ломает разрешение имён во всей сети.
Зачем свой резолвер
Домашний роутер обычно пересылает все запросы одному провайдеру и не проверяет DNSSEC. Локальный Unbound работает иначе: он сам проходит цепочку от корня до авторитативного сервера и кэширует каждый шаг. Это даёт несколько практических плюсов.
- Повторные запросы к популярным доменам отвечают почти мгновенно.
- Подмена ответа по пути обнаруживается, если зона подписана.
- В журнале видно, какие имена запрашиваются и какие зоны не проходят проверку.
- Можно добавить собственные локальные записи для домашних сервисов.
- Меньше зависимости от одного upstream-сервера и его политики.
Резолвер не шифрует трафик между вами и авторитативными серверами, но и не отправляет все запросы одному посреднику. Для шифрования существуют отдельные механизмы, однако в локальной сети кэш и валидация уже дают ощутимый эффект. Отдельный резолвер удобен и для отладки: видно, какой домен не разрешается и на каком шаге цепочки возникает ошибка.
Установка и конфликт с systemd-resolved
В Debian и Ubuntu пакет ставится вместе с утилитами проверки. Главная сложность — порт 53: его уже слушает systemd-resolved. Есть два пути: отключить resolved и отдать порт Unbound либо оставить resolved и направить его на Unbound, слушающий нестандартный порт. Первый вариант проще и даёт один кэш вместо двух.
sudo apt install unbound unbound-anchor dnsutils
sudo systemctl disable --now systemd-resolved
sudo rm -f /etc/resolv.conf
printf 'nameserver 127.0.0.1\noptions edns0 trust-ad\n' | sudo tee /etc/resolv.conf
Если адресом DNS управляет NetworkManager, добавьте в его конфигурацию dns=none, иначе файл перезапишется после переподключения. На сервере без графики достаточно прописать адрес в /etc/network/interfaces или в netplan. Перед отключением resolved убедитесь, что у вас есть доступ к консоли или второй канал управления.
Базовый конфигурационный файл
Основные параметры собраны в /etc/unbound/unbound.conf, а дополнительные файлы удобно класть в /etc/unbound/unbound.conf.d/. Ниже минимальная рабочая конфигурация для localhost и домашней подсети.
server:
interface: 127.0.0.1
interface: 192.168.1.10
port: 53
access-control: 127.0.0.0/8 allow
access-control: 192.168.1.0/24 allow
do-ip6: no
hide-identity: yes
hide-version: yes
qname-minimisation: yes
harden-dnssec-stripped: yes
harden-glue: yes
prefetch: yes
serve-expired: yes
msg-cache-size: 64m
rrset-cache-size: 128m
key-cache-size: 32m
neg-cache-size: 8m
auto-trust-anchor-file: "/var/lib/unbound/root.key"
username: "unbound"
directory: "/etc/unbound"
logfile: "/var/log/unbound/unbound.log"
verbosity: 1
access-control ограничивает, кому разрешены рекурсивные запросы. Открытый резолвер в интернете — это риск амплификации, поэтому список должен содержать только доверенные сети. prefetch обновляет популярные записи до истечения TTL, а serve-expired отдаёт просроченный ответ, если авторитативный сервер недоступен.
DNSSEC и якорь доверия
Проверка подписей включается автоматически, когда указан файл якоря. Пакет создаёт его при установке, но содержимое нужно поддерживать актуальным: корневой KSK меняется, и старый якорь со временем перестанет проходить проверку. Команда unbound-anchor обновляет файл, если это возможно.
sudo unbound-anchor -a /var/lib/unbound/root.key
sudo unbound-checkconf
sudo systemctl restart unbound
dig @127.0.0.1 example.com A +dnssec
В ответе на подписанную зону должен появиться флаг ad — значит, цепочка проверена. Для контроля полезно запросить заведомо сломанный домен dnssec-failed.org: корректно настроенный резолвер вернёт SERVFAIL. Если проверка не работает, проверьте системное время: расхождение часов ломает валидацию.
Кэш, управление и локальная зона
Для управления во время работы включите удалённую консоль. Она слушает только localhost и не требует сертификата — этого достаточно на домашнем сервере.
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8953
control-use-cert: no
После перезапуска доступны команды статистики и сброса кэша. stats_noreset показывает накопленные счётчики без обнуления, flush удаляет конкретное имя, а flush_zone — всю зону. Локальные имена задаются блоками local-data, например для домашнего сервера или принтера.
sudo unbound-control stats_noreset | grep -E "total.num.queries|mem.cache"
sudo unbound-control flush example.com
sudo unbound-control dump_cache > /tmp/unbound-cache.txt
Размеры кэша подбираются по нагрузке: для квартиры хватает 64 МБ под сообщения и 128 МБ под RRset, для офиса значения удваивают. Следите за попаданиями через статистику: если доля попаданий низкая, кэш не виноват — просто запросы слишком разнообразны.
Доступ из локальной сети и диагностика
Клиентам нужно разрешить порт 53 в файрволе и прописать адрес сервера в настройках DHCP. Не открывайте порт наружу: рекурсивный резолвер не предназначен для публичного доступа.
sudo ufw allow from 192.168.1.0/24 to any port 53 proto udp
sudo ufw allow from 192.168.1.0/24 to any port 53 proto tcp
sudo ss -lunp | grep :53
sudo journalctl -u unbound -n 50 --no-pager
Если журнал пуст, проверьте, что служба запущена и параметр logfile указывает на существующий каталог. Если клиенты получают SERVFAIL, проверьте три вещи: свободен ли порт, совпадает ли время и проходит ли запрос с самого сервера. Команда unbound-host -v показывает всю цепочку проверки и помогает найти проблемную зону. Ошибки конфигурации видны в unbound-checkconf ещё до перезапуска. Это экономит время и исключает лишние перезапуски службы.
Чек-лист
- Порт 53 свободен, systemd-resolved отключён или перенастроен.
unbound-checkconfпроходит без предупреждений.- Якорь доверия обновлён, время синхронизировано.
access-controlограничен доверенными сетями.- Клиенты получают адрес резолвера по DHCP.
- Ведётся ротация журнала, диск не переполняется.
Итог
Unbound даёт локальной сети собственный кэширующий DNS с проверкой DNSSEC и понятной диагностикой. Настройка занимает полчаса, но требует внимания к порту 53, якорю доверия и списку разрешённых клиентов. Взамен вы получаете быстрые повторные запросы, независимость от одного провайдера и прозрачные журналы, по которым легко понять, что происходит с именами.