Развёртывание Unbound DNS на VPS для приватного и быстрого интернета
TL;DR
В этом руководстве мы шаг за шагом настроим собственный рекурсивный DNS-сервер Unbound на вашем VPS. Это позволит вам значительно повысить конфиденциальность ваших интернет-запросов, обходя публичные DNS-провайдеры, такие как Google DNS или Cloudflare, и напрямую взаимодействуя с корневыми серверами DNS. В результате вы получите более быстрый, безопасный и приватный доступ к интернету, полностью контролируя свои DNS-запросы.
- Установка и базовая настройка Unbound на операционной системе Ubuntu 24.04 LTS.
- Конфигурация Unbound для выполнения рекурсивных запросов и валидации DNSSEC.
- Повышение безопасности VPS с помощью UFW, SSH-ключей и Fail2ban.
- Оптимизация производительности Unbound для быстрого разрешения доменных имен.
- Рекомендации по резервному копированию и обслуживанию вашего DNS-сервера.
- Ответы на часто задаваемые вопросы и устранение типичных проблем.
Что мы настраиваем и зачем
Мы будем развертывать Unbound – высокопроизводительный, валидирующий, рекурсивный и кэширующий DNS-сервер – на вашем собственном VPS. Основная задача Unbound заключается в разрешении доменных имен (например, example.com в IP-адрес 93.184.216.34) без обращения к сторонним DNS-провайдерам. Вместо этого Unbound напрямую запрашивает корневые DNS-серверы, а затем авторитетные серверы для каждого домена, строя цепочку доверия и выполняя валидацию DNSSEC.
Что получит читатель в итоге:
- Повышенная приватность: Ваши DNS-запросы не будут проходить через серверы Google, Cloudflare, вашего интернет-провайдера или других компаний, которые могут собирать данные о вашей активности. Unbound напрямую общается с корневыми серверами, исключая посредников.
- Улучшенная безопасность: Unbound поддерживает DNSSEC (Domain Name System Security Extensions), что позволяет криптографически проверять подлинность DNS-ответов. Это защищает от подмены DNS (DNS spoofing) и других атак, обеспечивая, что вы всегда подключаетесь к правильному серверу.
- Увеличенная скорость: После первоначального запроса Unbound кэширует ответы. Это означает, что повторные запросы к тем же доменам будут разрешаться значительно быстрее, поскольку информация уже хранится на вашем VPS. Кроме того, прямое общение с корневыми серверами может быть быстрее, чем через перегруженные публичные DNS-серверы.
- Полный контроль: Вы полностью контролируете процесс разрешения имен, можете настраивать черные списки (ad-blocking), белые списки и другие правила, адаптируя DNS-сервер под свои нужды.
Какие альтернативы есть (cloud-managed vs self-hosted):
Существует несколько подходов к DNS. Вы можете использовать:
- Публичные DNS-серверы: Например, Google DNS (8.8.8.8), Cloudflare DNS (1.1.1.1), OpenDNS. Они просты в использовании, но вы доверяете свои запросы третьей стороне, которая может их логировать или использовать для анализа трафика. Это самый простой, но наименее приватный вариант.
- DNS-серверы вашего интернет-провайдера: Это стандартный вариант по умолчанию. Часто они медленные, не поддерживают DNSSEC и, конечно же, ваш провайдер имеет полный доступ к вашим DNS-запросам.
- Cloud-managed DNS-сервисы (для хостинга доменов): Такие как AWS Route 53, Cloudflare DNS (для хостинга домена), DigitalOcean DNS. Это сервисы для управления DNS-записями ваших собственных доменов, а не для разрешения исходящих запросов с вашего устройства.
- Self-hosted DNS-серверы (например, Unbound на VPS): Это подход, который мы будем использовать. Он требует начальной настройки, но дает максимальный контроль, приватность и безопасность. Вы сами являетесь своим DNS-провайдером.
Почему self-hosted на VPS:
Выбор self-hosted Unbound на VPS обусловлен стремлением к максимальной приватности и безопасности. VPS предоставляет вам выделенную среду, где вы можете настроить Unbound именно так, как вам нужно, без каких-либо ограничений или компромиссов со стороны сторонних провайдеров. Это идеальное решение для тех, кто ценит независимость и хочет построить свою инфраструктуру с учетом высоких стандартов безопасности и конфиденциальности. VPS обеспечивает надежность, стабильность и достаточно ресурсов для работы Unbound 24/7.
Какой VPS-конфиг нужен под эту задачу
Unbound — это достаточно легковесное программное обеспечение, поэтому для его работы не требуются мощные ресурсы. Однако, чтобы обеспечить стабильную и быструю работу, особенно если вы планируете использовать его для нескольких устройств или с высокой нагрузкой, стоит учесть несколько моментов.
Минимальные требования:
- CPU: 1 ядро. Unbound не является CPU-интенсивным приложением.
- RAM: 512 МБ. Для базовой работы и кэширования этого достаточно. Если вы планируете кэшировать очень много записей или использовать его для крупной сети, можно рассмотреть 1 ГБ.
- Диск: 10-20 ГБ NVMe/SSD. Unbound практически не использует дисковое пространство, но для операционной системы, логов и других системных файлов такой объем будет оптимален. NVMe или SSD обеспечат быструю загрузку системы и операции с файлами.
- Сеть: 100 Мбит/с или 1 Гбит/с. DNS-запросы очень легкие, поэтому даже 100 Мбит/с будет более чем достаточно. Важнее стабильность канала и низкий пинг до корневых DNS-серверов.
Конкретный VPS-план под задачу:
Для большинства пользователей, разворачивающих Unbound для личного использования или для небольшой команды, идеальным будет VPS с конфигурацией:
- 1 vCPU
- 1 ГБ RAM
- 20-40 ГБ NVMe/SSD диска
- 1 Гбит/с сетевой порт
Такой конфигурации будет достаточно для обработки тысяч DNS-запросов в секунду, обеспечения большого кэша и стабильной работы. Вы можете рассмотреть VPS с указанными характеристиками, чтобы получить надежную платформу для вашего Unbound сервера.
Когда нужен dedicated, а не VPS:
Dedicated сервер для Unbound обычно не требуется, если только вы не планируете:
- Обслуживать десятки тысяч пользователей с очень высокой нагрузкой.
- Использовать этот же сервер для других очень ресурсоемких задач, которые требуют гарантированной производительности (например, крупные игровые серверы, высоконагруженные базы данных).
- Требования к физической изоляции и максимальной безопасности, которые не может обеспечить виртуализация.
В большинстве случаев, даже для корпоративного использования, мощного VPS будет более чем достаточно.
Локация: на что влияет
Выбор локации VPS для Unbound влияет на две ключевые вещи:
- Пинг до вас: Чем ближе VPS к вашему физическому местоположению, тем ниже будет задержка при обращении к вашему Unbound серверу. Это напрямую влияет на скорость разрешения DNS-запросов.
- Пинг до корневых DNS-серверов: Unbound будет обращаться к корневым серверам DNS по всему миру. Если ваш VPS находится в регионе с хорошей связностью с глобальной интернет-инфраструктурой, это обеспечит более быстрые ответы от корневых серверов и, соответственно, более быстрое первоначальное разрешение имен.
Рекомендуется выбирать локацию, которая находится географически близко к основным потребителям вашего DNS-сервера (например, к вам или вашей команде) и имеет хорошую связность с крупными интернет-узлами.
Подготовка сервера
Перед установкой Unbound необходимо выполнить базовую настройку вашего VPS, чтобы обеспечить безопасность и стабильность работы. Мы будем использовать операционную систему Ubuntu 24.04 LTS, как одну из наиболее популярных и поддерживаемых.
1. Подключение по SSH
Сначала подключитесь к вашему новому VPS через SSH. Используйте данные, предоставленные вашим провайдером (IP-адрес, имя пользователя root и пароль).
ssh root@ВАШ_IP_АДРЕС
После первого подключения вам, вероятно, потребуется сменить пароль root.
2. Обновление системы
Всегда начинайте с обновления списка пакетов и самой системы, чтобы убедиться, что у вас установлены самые свежие версии ПО и патчи безопасности.
sudo apt update # Обновление списка пакетов
sudo apt upgrade -y # Обновление всех установленных пакетов до последних версий
sudo apt autoremove -y # Удаление ненужных пакетов, которые были установлены как зависимости и больше не требуются
3. Создание нового пользователя и настройка sudo
Работа под пользователем root небезопасна. Создадим нового пользователя с ограниченными правами и добавим его в группу sudo.
adduser ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ # Создание нового пользователя. Следуйте инструкциям для установки пароля и информации.
usermod -aG sudo ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ # Добавление пользователя в группу sudo, чтобы он мог выполнять команды с правами root.
Теперь выйдите из сессии root и войдите под новым пользователем:
exit
ssh ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ@ВАШ_IP_АДРЕС
Чтобы проверить, что sudo работает, попробуйте выполнить команду:
sudo apt update
Если запросит ваш пароль, значит все настроено правильно.
4. Настройка SSH-ключей (рекомендуется)
Для повышения безопасности отключите вход по паролю и используйте только SSH-ключи. Сначала сгенерируйте ключ на вашей локальной машине, если у вас его еще нет:
ssh-keygen -t rsa -b 4096 # На вашей локальной машине
Затем скопируйте публичный ключ на ваш VPS:
ssh-copy-id ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ@ВАШ_IP_АДРЕС # На вашей локальной машине
После успешного копирования, отредактируйте конфигурацию SSH на VPS для отключения аутентификации по паролю.
sudo nano /etc/ssh/sshd_config
Найдите и измените следующие строки (или добавьте, если отсутствуют):
# Запретить вход под root
PermitRootLogin no
# Разрешить только аутентификацию по ключу
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Сохраните изменения (Ctrl+O, Enter) и выйдите (Ctrl+X). Перезапустите службу SSH:
sudo systemctl restart sshd
Теперь вы сможете входить только с помощью вашего SSH-ключа.
5. Установка и настройка брандмауэра (UFW)
UFW (Uncomplicated Firewall) — это простой в использовании интерфейс для iptables. Он позволит ограничить доступ к вашему серверу только необходимыми портами.
sudo apt install ufw -y # Установка UFW
sudo ufw allow ssh # Разрешить SSH (порт 22 по умолчанию)
sudo ufw allow 53/udp # Разрешить DNS-трафик (порт 53 UDP)
sudo ufw allow 53/tcp # Разрешить DNS-трафик (порт 53 TCP, для больших ответов и зонных трансферов)
sudo ufw enable # Включение брандмауэра. Подтвердите 'y'.
sudo ufw status # Проверка статуса брандмауэра
Убедитесь, что SSH разрешен до включения UFW, иначе вы можете потерять доступ к серверу.
6. Установка Fail2ban
Fail2ban защищает сервер от атак методом перебора (brute-force) путем блокировки IP-адресов, с которых поступает слишком много неудачных попыток входа.
sudo apt install fail2ban -y # Установка Fail2ban
sudo systemctl enable fail2ban # Включение автоматического запуска при старте системы
sudo systemctl start fail2ban # Запуск службы
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Создание локального файла конфигурации
sudo nano /etc/fail2ban/jail.local # Редактирование файла
В файле jail.local убедитесь, что секция [sshd] активна (enabled = true) и, при желании, настройте bantime (время блокировки) и findtime (период для обнаружения неудачных попыток) по вашему усмотрению. Для Unbound можно настроить собственную "тюрьму", но это более продвинутая настройка и не является критичной для базового развертывания.
# Пример настроек в jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Сохраните изменения и перезапустите Fail2ban:
sudo systemctl restart fail2ban
Теперь ваш сервер готов к установке Unbound.
Установка ПО — пошагово
На этом этапе мы установим сам Unbound DNS-сервер. Мы будем использовать официальные репозитории Ubuntu, так как они предоставляют стабильные и проверенные версии.
Предполагается, что на момент 2026 года в репозиториях Ubuntu 24.04 LTS (Noble Numbat) будет доступна версия Unbound 1.19.x или новее. Мы ориентируемся на Unbound 1.19.0 как на актуальную стабильную версию.
1. Установка Unbound
Unbound доступен в стандартных репозиториях Ubuntu. Установим его с помощью apt.
sudo apt update # Убедимся, что список пакетов актуален
sudo apt install unbound -y # Установка пакета Unbound
После установки Unbound автоматически запускается как служба и настроен на прослушивание локального интерфейса (127.0.0.1).
2. Проверка статуса службы Unbound
Убедимся, что Unbound успешно установлен и работает.
sudo systemctl status unbound # Проверка статуса службы Unbound
Вывод должен показать active (running). Если нет, проверьте логи командой sudo journalctl -u unbound.
3. Загрузка актуальных корневых подсказок (root hints)
Unbound нуждается в актуальном списке корневых DNS-серверов для выполнения рекурсивных запросов. Этот файл называется root.hints или named.cache. Обычно он устанавливается вместе с пакетом, но его важно регулярно обновлять.
sudo unbound-anchor -a /var/lib/unbound/root.key # Инициализация и загрузка ключа DNSSEC для корневых серверов
Эта команда загружает и проверяет корневой ключ DNSSEC (DNSSEC Trust Anchor) и обновляет файл root.hints, если это необходимо. Это критически важно для валидации DNSSEC.
4. Настройка Unbound для работы в режиме рекурсивного резолвера
По умолчанию Unbound настроен на прослушивание только локального интерфейса. Чтобы он мог отвечать на запросы с других устройств в вашей сети или из интернета (если вы решите его так использовать), необходимо изменить конфигурацию.
Откройте основной конфигурационный файл Unbound:
sudo nano /etc/unbound/unbound.conf
В этом файле обычно есть секция server:. Мы будем добавлять или изменять параметры внутри этой секции. Найдите или добавьте следующие строки:
# Дополнительные настройки будут добавлены в /etc/unbound/unbound.conf.d/
# Создадим новый файл для наших настроек, чтобы не изменять основной
Лучшей практикой является создание отдельного файла конфигурации в директории /etc/unbound/unbound.conf.d/, который будет автоматически включен в основной конфигурационный файл unbound.conf. Это упрощает управление и обновление.
sudo nano /etc/unbound/unbound.conf.d/custom-settings.conf # Создание нового файла конфигурации
Добавьте следующее содержимое в /etc/unbound/unbound.conf.d/custom-settings.conf:
server:
# Указываем IP-адрес, который Unbound будет прослушивать.
# 0.0.0.0 означает все доступные сетевые интерфейсы.
# Если у вас несколько IP, можно указать конкретный: interface: ВАШ_IP_АДРЕС
interface: 0.0.0.0@53
# Разрешаем запросы только с определенных сетей.
# Замените на вашу локальную сеть или IP-адреса, которым вы доверяете.
# Например, для всей локальной сети 192.168.1.0/24: access-control: 192.168.1.0/24 allow
# Если вы хотите, чтобы Unbound был доступен из интернета (НЕ РЕКОМЕНДУЕТСЯ БЕЗ ДОПОЛНИТЕЛЬНОЙ ЗАЩИТЫ):
# access-control: 0.0.0.0/0 allow
access-control: 127.0.0.1/32 allow # Разрешаем localhost
access-control: ::1/128 allow # Разрешаем localhost IPv6
# Устанавливаем размер кэша DNS-записей. 128MB - хороший баланс для VPS.
# Может быть увеличен до 256MB или 512MB при наличии достаточного RAM.
rrset-cache-size: 128m
msg-cache-size: 64m
# Включение валидации DNSSEC. Крайне рекомендуется для безопасности.
# Unbound будет проверять подлинность DNS-ответов.
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# Включение логирования. Полезно для отладки.
# log-queries: yes # Логировать все запросы (может быть очень много)
# log-replies: yes # Логировать все ответы (может быть очень много)
# Установка минимального TTL для ответов.
# Позволяет избежать слишком коротких TTL, которые могут быть установлены злоумышленниками.
cache-min-ttl: 3600 # 1 час
# Установка максимального TTL для ответов.
# Предотвращает слишком долгое кэширование устаревших записей.
cache-max-ttl: 86400 # 24 часа
# Принудительное использование TCP для запросов к корневым серверам, если UDP не удается.
# Это может быть полезно для обхода некоторых ограничений или проблем с UDP.
harden-glue: yes
harden-dnssec-stripped: yes
harden-below-nxdomain: yes
harden-referral-path: yes
# Отключение IPv6, если не используется, для экономии ресурсов и упрощения.
# do-ip6: no
# Включение ответа с DNSSEC-информацией для клиентов.
do-daemonize: yes
do-not-query-address: 127.0.0.1/8
do-not-query-address: ::1/128
hide-version: yes # Скрыть версию Unbound
# use-syslog: yes # Отправлять логи в syslog
# verbosity: 1 # Уровень детализации логов (0-5, 1 - по умолчанию)
Сохраните изменения (Ctrl+O, Enter) и выйдите (Ctrl+X).
5. Проверка конфигурации и перезапуск Unbound
Перед перезапуском службы всегда проверяйте синтаксис конфигурационного файла, чтобы избежать ошибок.
sudo unbound-checkconf # Проверка синтаксиса конфигурационных файлов Unbound
Если команда не выдает ошибок, значит конфигурация корректна. Теперь перезапустите службу Unbound, чтобы применить изменения.
sudo systemctl restart unbound # Перезапуск службы Unbound
Убедитесь, что Unbound снова запущен и работает:
sudo systemctl status unbound
6. Тестирование Unbound
Теперь, когда Unbound настроен, протестируем его работу. Для этого можно использовать утилиты dig или drill. Сначала установите dnsutils, если они еще не установлены.
sudo apt install dnsutils -y # Установка утилиты dig
Выполните запрос к вашему Unbound серверу (который теперь прослушивает 0.0.0.0 или ваш публичный IP):
dig @127.0.0.1 example.com # Запрос к локальному Unbound
dig @ВАШ_IP_АДРЕС example.com # Запрос к Unbound через внешний IP (если вы разрешили доступ)
В ответе вы должны увидеть IP-адрес example.com. Важно, чтобы в секции ANSWER SECTION присутствовали записи, а в секции FLAGS был флаг ad (authentic data), что указывает на успешную валидацию DNSSEC.
Если вы хотите проверить, что Unbound действительно делает рекурсивный запрос, очистите его кэш и запросите домен, который вы ранее не запрашивали:
sudo unbound-control reload # Очистка кэша Unbound
dig @127.0.0.1 newdomain.com # Замените на любой домен, который вы не запрашивали
Если все работает, Unbound готов к использованию!
Конфигурация
После базовой установки Unbound мы можем углубиться в его конфигурацию для максимальной приватности, безопасности и производительности. Мы продолжим использовать файл /etc/unbound/unbound.conf.d/custom-settings.conf для наших настроек.
1. Расширение настроек приватности и безопасности
Добавьте следующие параметры в секцию server: вашего custom-settings.conf.
sudo nano /etc/unbound/unbound.conf.d/custom-settings.conf
Примеры дополнительных параметров:
server:
# ... (предыдущие настройки) ...
# Усиление приватности
# Скрыть информацию о версии Unbound (уже добавлено ранее)
hide-version: yes
# Скрыть ID сервера в ответах CH TXT ID.SERVER
hide-identity: yes
# Скрыть версию сервера в ответах CH TXT VERSION.SERVER
hide-trustanchor: yes
# Отключить ответы на запросы CH TXT hostname.bind, version.bind и т.д.
# Это предотвращает раскрытие информации о вашем сервере.
# private-address: 192.168.0.0/16 # Пример: все адреса в этой сети считаются приватными
# private-address: 10.0.0.0/8
# private-address: 172.16.0.0/12
# private-address: fd00::/8 # IPv6 частные адреса
# Отклонять запросы к приватным IP-адресам, если они не разрешены явно
# Это предотвращает атаки, когда злоумышленник пытается использовать ваш DNS для внутренних сетей.
do-not-query-address: 10.0.0.0/8
do-not-query-address: 172.16.0.0/12
do-not-query-address: 192.168.0.0/16
do-not-query-address: 169.254.0.0/16
do-not-query-address: ::1/128
do-not-query-address: fc00::/7
do-not-query-address: fe80::/10
# Отклонять запросы к локальным хостам (если вы не хотите, чтобы Unbound их разрешал)
# local-zone: "localhost." refuse
# local-zone: "127.in-addr.arpa." refuse
# Дополнительные настройки безопасности для DNSSEC
# Отклонять ответы, которые не соответствуют DNSSEC, если для домена должна быть подпись.
harden-dnssec-stripped: yes
# Отклонять ответы, которые содержат клеевые записи для доменов, находящихся ниже зоны.
harden-glue: yes
# Отклонять ответы, которые указывают на несуществующие домены (NXDOMAIN) ниже зоны.
harden-below-nxdomain: yes
# Отклонять ответы, которые указывают на корневой сервер в качестве реферера.
harden-referral-path: yes
# Установка количества потоков для обработки запросов.
# Обычно равно количеству ядер CPU вашего VPS.
num-threads: 1 # Для VPS с 1 vCPU
# Увеличение количества дескрипторов файлов.
# Важно для высоконагруженных серверов.
outgoing-range: 8192 # Максимальное количество исходящих запросов
num-queries-per-thread: 4096 # Максимальное количество запросов на поток
# Включение агрессивного кэширования NSEC.
# Позволяет Unbound кэшировать информацию об отсутствии доменов, что ускоряет ответы для несуществующих доменов.
aggressive-nsec: yes
# Предварительная выборка (prefetching) DNS-записей.
# Unbound будет обновлять записи в кэше до истечения их TTL, что улучшает производительность.
prefetch: yes
prefetch-key: yes
# Увеличение буфера для UDP-ответов.
# Полезно для DNSSEC, где ответы могут быть большими.
edns-buffer-size: 1232 # Рекомендуемое значение для предотвращения фрагментации
Сохраните изменения и проверьте конфигурацию:
sudo unbound-checkconf
sudo systemctl restart unbound
2. Настройка блокировки рекламы и вредоносных доменов (Ad-blocking)
Вы можете использовать Unbound для блокировки рекламы и вредоносных доменов, используя списки блокировки. Это делается путем добавления local-zone с типом refuse или redirect.
Создадим новый файл для списков блокировки:
sudo nano /etc/unbound/unbound.conf.d/adblock.conf
Добавьте следующее содержимое. Это пример, вам нужно будет регулярно обновлять этот список или использовать скрипт для его автоматического обновления.
server:
# Заблокировать известный рекламный домен
local-zone: "doubleclick.net" refuse
local-zone: "adservice.google.com" refuse
local-zone: "tracking.example.com" refuse
# Перенаправить на локальный IP (например, 0.0.0.0 или 127.0.0.1)
local-zone: "ads.example.com" redirect
local-data: "ads.example.com A 0.0.0.0"
# Можно использовать более обширные списки.
# Пример:
# include: "/etc/unbound/unbound.conf.d/blocklists/ads.conf"
# include: "/etc/unbound/unbound.conf.d/blocklists/malware.conf"
Для автоматизации можно создать скрипт, который будет загружать списки из публичных источников (например, AdGuard DNS filter, OISD) и форматировать их для Unbound. Пример скрипта (разместите его в /usr/local/bin/update-unbound-blocklist.sh):
#!/bin/bash
# Путь к файлу блокировки Unbound
BLOCKLIST_FILE="/etc/unbound/unbound.conf.d/adblock_generated.conf"
# URL источника списка блокировки (например, OISD Basic)
# На 2026 год этот URL может измениться, проверьте актуальность
BLOCKLIST_URL="https://raw.githubusercontent.com/oisddev/oisd/main/abp/basic.txt"
echo "server:" > "$BLOCKLIST_FILE"
echo " # Generated by update-unbound-blocklist.sh on $(date)" >> "$BLOCKLIST_FILE"
echo " # Source: $BLOCKLIST_URL" >> "$BLOCKLIST_FILE"
# Загрузка списка и преобразование в формат Unbound
# Пропускаем комментарии и пустые строки, добавляем "refuse"
curl -s "$BLOCKLIST_URL" | grep -v '^!' | grep -v '^$' | while read -r domain; do
# Удаляем префикс '||' и суффикс '^' или другие ABP-специфичные символы
domain=$(echo "$domain" | sed -e 's/^||//' -e 's/\^$//' -e 's/\$//')
# Фильтруем пустые строки после обработки
if [[ -n "$domain" ]]; then
echo " local-zone: \"$domain\" refuse" >> "$BLOCKLIST_FILE"
fi
done
echo "Generated Unbound blocklist: $BLOCKLIST_FILE"
# Проверка конфигурации Unbound
sudo unbound-checkconf
# Перезапуск Unbound для применения изменений, если проверка успешна
if [ $? -eq 0 ]; then
sudo systemctl restart unbound
echo "Unbound restarted successfully."
else
echo "Unbound configuration check failed. Not restarting."
fi
Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/update-unbound-blocklist.sh
И запустите его:
sudo /usr/local/bin/update-unbound-blocklist.sh
Затем включите этот сгенерированный файл в ваш custom-settings.conf:
server:
# ...
include: "/etc/unbound/unbound.conf.d/adblock_generated.conf"
Сохраните и перезапустите Unbound.
3. Проверка работоспособности
Для проверки работоспособности и эффективности Unbound используем dig.
Проверка DNSSEC:
dig @ВАШ_IP_АДРЕС dnssec-failed.org # Домен, который должен вызвать ошибку DNSSEC
В ответе вы должны увидеть SERVFAIL, что означает, что Unbound успешно обнаружил проблему с DNSSEC и отказался разрешать домен.
Проверка блокировки рекламы:
dig @ВАШ_IP_АДРЕС doubleclick.net # Запрос к заблокированному домену
Вы должны получить ответ NXDOMAIN (несуществующий домен) или, если вы использовали redirect, то 0.0.0.0 или 127.0.0.1.
Проверка скорости кэширования:
dig @ВАШ_IP_АДРЕС example.com # Первый запрос
dig @ВАШ_IP_АДРЕС example.com # Второй запрос
Обратите внимание на время выполнения запроса (Query time) в выводе. Второй запрос должен быть значительно быстрее первого, так как ответ будет взят из кэша.
Healthcheck:
Можно использовать простую команду ping или curl, если ваш Unbound прослушивает внешний IP, но для проверки DNS-сервера лучше всего подходят dig или nslookup.
Для более детального мониторинга можно настроить экспорт метрик Unbound в Prometheus или другой мониторинг-систему, но это выходит за рамки данного руководства.
4. Настройка системы для использования Unbound
Чтобы ваши устройства использовали Unbound, вы можете изменить настройки DNS в вашей операционной системе или на маршрутизаторе. Рекомендуется настроить маршрутизатор, чтобы все устройства в вашей сети автоматически использовали Unbound.
Настройка на Linux (пример):
sudo nano /etc/resolv.conf # Редактирование файла resolv.conf (часто перезаписывается)
Добавьте или измените строку nameserver на IP вашего VPS:
nameserver ВАШ_IP_АДРЕС
nameserver 127.0.0.1 # Если вы тестируете Unbound на том же VPS
Для более постоянной настройки используйте netplan (Ubuntu Server) или systemd-resolved:
# Пример для Netplan (Ubuntu Server 24.04)
sudo nano /etc/netplan/00-installer-config.yaml
Измените секцию nameservers:
network:
ethernets:
enp0s3: # Название вашего сетевого интерфейса
dhcp4: no
addresses:
- 192.168.1.10/24 # Ваш статический IP
routes:
- to: default
via: 192.168.1.1 # IP вашего шлюза
nameservers:
addresses: [ВАШ_IP_АДРЕС, 8.8.4.4] # Добавьте ваш Unbound и резервный DNS
version: 2
sudo netplan try
sudo netplan apply
Настройка на Windows/macOS:
В настройках сетевого адаптера измените предпочитаемый DNS-сервер на IP-адрес вашего VPS. Добавьте резервный DNS-сервер (например, 8.8.4.4), чтобы иметь запасной вариант, если ваш VPS будет недоступен.
Настройка на роутере:
Войдите в панель управления вашего роутера и в разделе настроек WAN/LAN или DHCP-сервера укажите IP-адрес вашего Unbound VPS в качестве основного DNS-сервера. Это самый удобный способ для применения Unbound ко всем устройствам в вашей домашней сети.
Бэкапы и обслуживание
Надежная работа любого сервера невозможна без регулярного резервного копирования и планового обслуживания. Unbound, хотя и не хранит критически важные данные, требует бэкапа своих конфигурационных файлов и корневых подсказок.
1. Что бэкапить
- Конфигурационные файлы Unbound:
/etc/unbound/unbound.confи все файлы в/etc/unbound/unbound.conf.d/. Это включает ваши пользовательские настройки, списки блокировки и т.д. - Корневые подсказки и DNSSEC-ключи:
/var/lib/unbound/root.keyи/var/lib/unbound/root.hints. Хотя их можно восстановить с помощьюunbound-anchor, иметь их в бэкапе не помешает.
2. Простой скрипт автобэкапа
Мы создадим простой скрипт, который будет архивировать необходимые файлы и отправлять их в безопасное место. В качестве примера используем tar для архивирования и rsync для копирования на другой сервер или в облачное хранилище (например, S3-совместимое).
Создайте директорию для бэкапов и сам скрипт:
sudo mkdir -p /var/backups/unbound
sudo nano /usr/local/bin/backup-unbound.sh
Содержимое /usr/local/bin/backup-unbound.sh:
#!/bin/bash
# Каталог для временных бэкапов
BACKUP_DIR="/var/backups/unbound"
# Имя файла бэкапа
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="$BACKUP_DIR/unbound_config_$TIMESTAMP.tar.gz"
# Каталоги и файлы для бэкапа
CONFIG_FILES="/etc/unbound /var/lib/unbound/root.key"
# Удаление старых бэкапов (например, старше 7 дней)
find "$BACKUP_DIR" -type f -name "unbound_config_.tar.gz" -mtime +7 -delete
# Создание архива
sudo tar -czvf "$BACKUP_FILE" $CONFIG_FILES
# Проверка, что архив создан
if [ $? -eq 0 ]; then
echo "Unbound backup created: $BACKUP_FILE"
# Куда складывать (внешний S3 / отдельный VPS)
# Пример для rsync на другой сервер (нужен SSH-ключ без пароля)
# Замените USER, REMOTE_HOST, REMOTE_PATH на ваши данные
# rsync -avz "$BACKUP_FILE" USER@REMOTE_HOST:REMOTE_PATH/
# Пример для AWS S3 CLI (требует установленного и настроенного AWS CLI)
# aws s3 cp "$BACKUP_FILE" s3://YOUR_S3_BUCKET_NAME/unbound-backups/
# Для демонстрации просто оставляем локально
echo "Backup stored locally at $BACKUP_FILE"
else
echo "Failed to create Unbound backup."
fi
Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/backup-unbound.sh
Проверьте его работу:
sudo /usr/local/bin/backup-unbound.sh
ls -l /var/backups/unbound/
3. Настройка Cron для автоматического запуска
Добавим скрипт в расписание cron, чтобы он запускался ежедневно, например, в 3:00 ночи.
sudo crontab -e
Добавьте следующую строку в конец файла:
0 3 * /usr/local/bin/backup-unbound.sh > /dev/null 2>&1
Эта строка означает: в 3 часа 0 минут каждый день недели и месяца запускать скрипт, перенаправляя весь вывод в /dev/null (чтобы не получать письма на почту root).
4. Куда складывать (внешний S3 / отдельный VPS)
Внешний S3-совместимый объектный сторадж: Это наиболее надежный и масштабируемый вариант. Используйте aws cli или rclone для загрузки бэкапов. Вам потребуется настроить учетные данные и права доступа.
# Пример для rclone (требует предварительной настройки rclone config)
# rclone copy "$BACKUP_FILE" remote_s3_alias:your-bucket/unbound-backups/
Отдельный VPS: Вы можете использовать rsync или scp для копирования бэкапов на другой ваш VPS. Убедитесь, что на целевом VPS есть достаточно места и настроен SSH-доступ без пароля для пользователя, от имени которого запускается скрипт бэкапа.
Важно: Никогда не храните бэкапы на том же VPS, который вы бэкапите. В случае сбоя диска или компрометации сервера вы потеряете и данные, и бэкапы.
5. Обновления: rolling vs maintenance window
Поддержание Unbound и операционной системы в актуальном состоянии критически важно для безопасности. Однако процесс обновления может временно прервать работу DNS-сервера.
- Rolling updates (непрерывные обновления): Для Unbound это означает автоматическое обновление пакетов системы без выделенного окна обслуживания. Это удобно, но есть риск, что обновление может вызвать временный сбой или потребовать ручного вмешательства. Для критически важных систем лучше избегать полностью автоматических обновлений.
- Maintenance window (окно обслуживания): Рекомендуемый подход. Запланируйте регулярное время (например, раз в месяц) для обновления системы. В это время вы можете вручную запустить обновление, проверить логи и убедиться, что Unbound корректно перезапустился.
Процедура обновления:
sudo apt update # Обновление списка пакетов
sudo apt upgrade -y # Установка обновлений. Unbound будет перезапущен автоматически, если его пакет обновится.
sudo apt autoremove -y # Удаление ненужных пакетов
sudo unbound-anchor -a /var/lib/unbound/root.key # Обновление корневых подсказок и DNSSEC-ключей
sudo systemctl status unbound # Проверка статуса Unbound после обновления
Также рекомендуется периодически проверять официальный сайт Unbound или репозиторий проекта на GitHub на предмет выхода новых версий и важных изменений в конфигурации.
Рекомендация: Если ваш Unbound является единственным DNS-сервером для ваших устройств, рассмотрите возможность использования второго, резервного DNS-сервера (например, 8.8.4.4 или 1.1.1.1) в настройках вашей системы/роутера. Это обеспечит бесперебойный доступ к интернету во время обслуживания вашего VPS.
Troubleshooting + FAQ
В этом разделе мы рассмотрим типичные проблемы, с которыми можно столкнуться при развертывании Unbound, и дадим ответы на часто задаваемые вопросы.
1. Unbound не запускается или выдает ошибку
Причина: Чаще всего это связано с ошибками в конфигурационном файле или конфликтом портов.
Что проверить:
- Конфигурация: Выполните
sudo unbound-checkconf. Эта команда проверит синтаксис ваших конфигурационных файлов. Если есть ошибки, она укажет на строку и файл. - Логи: Проверьте системные логи Unbound:
sudo journalctl -u unbound -f. Это покажет последние записи логов, связанные с Unbound, которые могут указать на причину сбоя (например, "address already in use"). - Конфликт портов: Убедитесь, что порт 53 (UDP/TCP) не занят другим процессом. Используйте
sudo lsof -i :53илиsudo netstat -tulnp | grep 53.
Как фиксить: Исправьте ошибки в конфигурации согласно выводу unbound-checkconf. Если порт занят, либо измените порт для Unbound (менее желательно), либо остановите другую службу, которая его использует.
2. DNS-запросы не разрешаются или очень медленные
Причина: Проблемы с сетевой связностью, неправильные настройки брандмауэра или проблемы с DNSSEC.
Что проверить:
- Брандмауэр: Убедитесь, что UFW (или другой брандмауэр) разрешает входящие соединения на порт 53 (UDP и TCP) с IP-адресов ваших клиентов.
sudo ufw status verbose. - Сетевая связность: Убедитесь, что ваш VPS имеет доступ к интернету и может достучаться до корневых DNS-серверов. Попробуйте
ping 1.1.1.1илиping google.comс вашего VPS. - Настройки клиента: Убедитесь, что на вашем устройстве или роутере в качестве DNS-сервера указан IP-адрес вашего VPS.
- DNSSEC: Если Unbound настроен на DNSSEC, но есть проблемы с доверенными якорями или подписями, это может вызывать
SERVFAIL. Проверьтеsudo unbound-anchor -a /var/lib/unbound/root.key.
Как фиксить: Откройте необходимые порты в брандмауэре. Проверьте настройки сети VPS. Убедитесь, что клиенты правильно настроены. Обновите корневые DNSSEC-ключи.
3. Блокировка рекламы не работает
Причина: Неправильные списки блокировки или Unbound не загрузил их.
Что проверить:
- Файл блокировки: Убедитесь, что файл
adblock_generated.conf(или ваш пользовательский файл) существует и содержит нужные записи. - Включение файла: Проверьте, что в
/etc/unbound/unbound.conf.d/custom-settings.confесть строкаinclude: "/etc/unbound/unbound.conf.d/adblock_generated.conf". - Перезапуск Unbound: Убедитесь, что Unbound был перезапущен после изменения файлов блокировки.
- TTL кэша: Возможно, домены, которые вы пытаетесь заблокировать, уже закэшированы. Попробуйте очистить кэш:
sudo unbound-control reload.
Как фиксить: Исправьте пути к файлам, перезапустите Unbound. Обновите списки блокировки и убедитесь, что они в правильном формате.
4. Какой VPS-конфиг минимально подойдёт?
Для Unbound, который является достаточно легковесным приложением, минимально подойдет VPS с 1 vCPU, 512 МБ RAM и 10-20 ГБ SSD/NVMe диска. Этой конфигурации будет достаточно для личного использования или для обслуживания небольшой домашней сети. Важнее стабильность сетевого соединения и низкий пинг до корневых DNS-серверов, чем избыточные вычислительные ресурсы.
5. Что выбрать — VPS или dedicated для этой задачи?
Для развертывания Unbound DNS в подавляющем большинстве случаев VPS является оптимальным выбором. Unbound не требует значительных ресурсов CPU или RAM, и VPS легко справляется с нагрузкой даже от нескольких сотен пользователей. Dedicated серверы обычно избыточны для этой задачи и оправданы только в случае крайне высокой нагрузки (десятки тысяч запросов в секунду), необходимости физической изоляции для соответствия строгим нормативным требованиям или если этот сервер будет использоваться для других, значительно более ресурсоемких задач.
6. Можно ли использовать Unbound для DNS-over-TLS (DoT) или DNS-over-HTTPS (DoH) для клиентов?
Unbound в базовой конфигурации, описанной в этом руководстве, работает как традиционный рекурсивный DNS-сервер по UDP/TCP на порту 53. Для предоставления DNS-over-TLS или DNS-over-HTTPS клиентам требуется дополнительная настройка. Unbound поддерживает исходящие запросы по DoT к апстрим-серверам, но для обслуживания DoT/DoH клиентов обычно требуется прокси-сервер (например, Nginx, Caddy) или специализированное ПО (например, Stubby для DoT, или специализированные DoH-серверы), которое будет слушать запросы по HTTPS/TLS и перенаправлять их на локальный Unbound. Это более сложная настройка и выходит за рамки данного базового руководства.
7. Как мониторить работу Unbound?
Для базового мониторинга используйте sudo systemctl status unbound для проверки статуса службы и sudo journalctl -u unbound -f для просмотра логов. Для более продвинутого мониторинга можно использовать unbound-control status для получения текущего состояния и статистики кэша. Для сбора метрик и визуализации можно настроить экспорт метрик Unbound в Prometheus с помощью unbound_exporter и отображать их в Grafana. Это позволит отслеживать нагрузку, количество запросов, попадания в кэш и другие важные показатели производительности.
8. Как обеспечить высокую доступность Unbound?
Для обеспечения высокой доступности одного Unbound сервера недостаточно. Вам потребуется развернуть как минимум два Unbound сервера на разных VPS в разных дата-центрах. Затем вы можете настроить их в режиме Active-Passive или Active-Active, используя Anycast DNS, или просто предоставить клиентам IP-адреса обоих серверов в качестве основного и резервного DNS. Это гарантирует, что даже если один сервер выйдет из строя, второй продолжит обрабатывать DNS-запросы.
Выводы и следующие шаги
Мы успешно развернули и настроили Unbound DNS-сервер на вашем VPS, превратив его в мощный инструмент для обеспечения приватного, безопасного и быстрого доступа к интернету. Теперь вы контролируете свои DNS-запросы, обходя сторонних посредников и защищаясь от подмены DNS с помощью DNSSEC. Это важный шаг к созданию собственной независимой и защищенной интернет-инфраструктуры.
Куда двигаться дальше для дальнейшей оптимизации и масштабирования:
- Интеграция с локальной сетью: Настройте ваш домашний маршрутизатор или DHCP-сервер так, чтобы он автоматически выдавал IP-адрес вашего Unbound VPS в качестве основного DNS-сервера для всех устройств в вашей сети. Это обеспечит централизованное использование вашего приватного DNS.
- Расширенное блокирование: Автоматизируйте обновление списков блокировки рекламы и вредоносных доменов с помощью скриптов и
cron, как было описано ранее. Изучите различные списки блокировки (например, OISD, AdGuard Home lists) и выберите те, которые наилучшим образом соответствуют вашим потребностям. - Мониторинг и логирование: Настройте более детальный мониторинг Unbound с помощью
unbound-controlдля получения статистики и рассмотрите возможность интеграции с Prometheus/Grafana для визуализации производительности и состояния сервера. Это поможет вам оперативно реагировать на любые проблемы и оптимизировать работу.