Современные мобильные приложения, сайты и операционные системы генерируют колоссальный объем паразитного фонового трафика: рекламные сети, трекеры геолокации, сборщики телеметрии и фишинговые домены. Обычные расширения для браузеров (вроде uBlock Origin) отлично защищают веб-серфинг на компьютере, но они бессильны перед баннерами внутри мобильных приложений, рекламными блоками в Smart TV, игровыми консолями и скрытыми сетевыми маячками в смартфонах.
Фундаментальное решение этой проблемы — фильтрация на уровне DNS (Domain Name System). Когда клиент запрашивает IP-адрес трекера, ваш личный DNS-сервер блокирует запрос до того, как устройство успеет установить соединение и загрузить баннер или шпионский скрипт. В этом практическом руководстве мы развернем AdGuard Home в Docker Compose на недорогом VDS, настроим современные шифрованные протоколы DoH (DNS-over-HTTPS) и DoT (DNS-over-TLS) с доверенным сертификатом Let's Encrypt и защитим все ваши устройства от рекламы и слежки в любой точке мира.
1. Зачем нужен собственный DNS-сервер и как AdGuard Home блокирует рекламу
Принцип работы DNS-блокировщика элегантен и не требует установки тяжелых прокси-серверов или расшифровки защищенного HTTPS-трафика. Процесс происходит по следующему сценарию:
- Приложение или браузер на смартфоне решает загрузить баннер и отправляет запрос к домену, например,
an.yandex.ruилиgoogleads.g.doubleclick.net. - Запрос поступает на ваш DNS-сервер AdGuard Home.
- Сервер сверяет запрашиваемое имя с подключенными базами правил и черными списками (Blacklists).
- Если домен найден в базе блокировок, AdGuard Home мгновенно возвращает ответ
0.0.0.0или кодNXDOMAIN(«домен не существует»). - Приложение считает, что рекламный сервер отключен, и даже не пытается скачивать видеоролик, графический баннер или трекинговый скрипт.
Поскольку соединение с сервером рекламы обрывается на этапе резолвинга DNS, устройство не скачивает тяжелые рекламные медиафайлы, фоновые трекеры и телеметрию. Это заметно снижает расход мобильного интернет-трафика (особенно на новостных порталах и в приложениях со встроенными баннерами) и разгружает процессор смартфона от исполнения стороннего JavaScript.
Проверить текущее состояние любого домена, его реальные IP-адреса и публичные A/AAAA-записи перед добавлением в фильтры всегда можно с помощью нашего онлайн-инструмента DNS Lookup и Резолвер доменов.
AdGuard Home против Pi-hole: почему в 2026 году выбирают AdGuard
Долгое время стандартом домашней DNS-фильтрации оставался проект Pi-hole. Однако при развертывании на облачном VDS для использования вне дома AdGuard Home обладает рядом неоспоримых преимуществ:
| Характеристика | AdGuard Home | Pi-hole |
|---|---|---|
| Архитектура и стек | Единый скомпилированный бинарник на Go (минимальное потребление CPU и памяти 60–100 МБ). | Стек из FTL (C), Lighttpd/Nginx и PHP. |
| Поддержка DoH / DoT / DoQ | Встроена «из коробки». Поддерживает шифрование входящих и исходящих запросов DoH/DoT/DoQ без сторонних утилит в едином бинарнике. | Требует отдельной сложной настройки связки с cloudflared или unbound. |
| Клиентские профили | Встроенные клиентские профили по Client ID (DoH URL), DoT IP или подсетям прямо в интерфейсе. | Управление группами клиентов и доменов через веб-панель и базу FTL. |
| Форматы списков правил | Поддерживает синтаксис Adblock Plus, EasyList, hosts-файлы и регулярные выражения RegExp. | В основном плоские hosts-файлы и базовые RegExp. |
2. Подготовка VDS: решение конфликта порта 53 со службой systemd-resolved
Главная техническая сложность при развертывании любого DNS-сервера в Docker на дистрибутивах Ubuntu (22.04 LTS и 24.04 LTS) или Debian — конфликт сетевого порта 53.
По умолчанию в современных дистрибутивах Linux активна системная служба systemd-resolved. Она запускает локальный DNS-заглушку (stub resolver), которая жестко слушает порт 127.0.0.53:53. Когда Docker пытается пробросить внешний порт 53:53/udp на сетевом интерфейсе хоста, демон Docker выдает критическую ошибку:
Error response from daemon: driver failed programming external connectivity on endpoint adguardhome: Error starting userland proxy: listen tcp 0.0.0.0:53: bind: address already in use
Убедимся, что порт 53 действительно занят системным процессом:
# Проверяем, кто слушает 53 порт через точный синтаксис iproute2 (исключает mDNS 5353 и номера PID)
sudo ss -tulpn '( sport = :53 )'
В выводе вы увидите строку с процессом systemd-resolve. Чтобы освободить порт для контейнера Docker и при этом сохранить работоспособность резолвинга на самом сервере, выполним официальную процедуру перенастройки systemd-resolved:
Шаг 1. Отключаем DNSStubListener
Откроем файл конфигурации системного резолвера:
sudo nano /etc/systemd/resolved.conf
В секции [Resolve] раскомментируем и изменим две директивы. Укажем надежные внешние DNS-серверы для хост-системы (например, Cloudflare и Google) и отключим заглушку DNSStubListener:
[Resolve]
DNS=1.1.1.1 8.8.8.8
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=no
DNSStubListener=no
Сохраните изменения комбинацией Ctrl+O, Enter и выйдите Ctrl+X.
Шаг 2. Переключаем символическую ссылку /etc/resolv.conf
Файл /etc/resolv.conf в Ubuntu по умолчанию ссылается на локальную заглушку stub-resolv.conf. Переключим его на статическую конфигурацию, генерируемую systemd:
# Создаем правильную символическую ссылку на статический резолвер
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
# Перезапускаем службу systemd-resolved для применения настроек
sudo systemctl restart systemd-resolved
Шаг 3. Проверяем доступность порта 53
Снова выполним диагностику сетевых сокетов:
# Проверяем порт 53 — вывод команды должен быть абсолютно пустым
sudo ss -tulpn '( sport = :53 )'
# Проверяем, что сам сервер сохранил доступ в интернет и корректно резолвит домены
ping -c 2 google.com
Порт 53 свободен, а сервер уверенно получает IP-адреса из внешнего мира. Хост полностью готов к развертыванию контейнера AdGuard Home.
3. Манифест Docker Compose и первичный запуск AdGuard Home
Для надежного изолированного развертывания создадим отдельную директорию на VDS и подготовим манифест docker-compose.yml. В манифесте обязательно зафиксируем актуальный стабильный релиз образа (v0.107.79): для базовой DNS-инфраструктуры недопустимо использовать плавающий тег :latest (в свежих релизах v0.107.x закрыты уязвимости DoQ исчерпания ресурсов GHSA-w6v6-f44j-3rj2 и обновлены библиотеки Go), который при плановом перезапуске может стянуть мажорные изменения и сломать резолвинг. Также пробросим порты веб-интерфейса (80, 3000), шифрованных протоколов DoH (443) и DoT/DoQ (853).
# Создаем рабочую директорию проекта
sudo mkdir -p /opt/adguardhome/{work,conf}
cd /opt/adguardhome
# Создаем файл манифеста
sudo nano docker-compose.yml
Вставим следующий проверенный боевой манифест:
services:
adguardhome:
# Для критической DNS-инфраструктуры фиксируем стабильный релиз вместо плавающего latest
image: adguard/adguardhome:v0.107.79
container_name: adguardhome
restart: unless-stopped
volumes:
- ./work:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf
# Монтируем сертификаты Let's Encrypt в режиме только для чтения
- /etc/letsencrypt:/opt/adguardhome/certs:ro
ports:
# Стандартный DNS (UDP и TCP). Если вам нужны ТОЛЬКО шифрованные DoH/DoT,
# порты 53 наружу открывать не требуется — их можно исключить для максимальной безопасности
- "53:53/tcp"
- "53:53/udp"
# Мастер начальной настройки (после завершения мастера этот порт рекомендуется закомментировать)
- "3000:3000/tcp"
# Веб-панель управления и проверка сертификатов ACME
- "80:80/tcp"
# DNS-over-HTTPS (DoH) и HTTP/3
- "443:443/tcp"
- "443:443/udp"
# DNS-over-TLS (DoT) и DNS-over-QUIC (DoQ)
- "853:853/tcp"
- "853:853/udp"
# Лимиты ресурсов: спецификация Compose Specification (v2)
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
# Директивы обратной совместимости (в старых движках Compose v1 блок deploy вне Swarm игнорировался)
mem_limit: 512m
cpus: 1.0
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Обратите внимание на блок logging: без ограничения размера лог-файлов демон Docker при интенсивном потоке запросов со временем забьет всё свободное пространство на диске. Ограничение в 3 файла по 10 МБ гарантирует предсказуемость дискового пространства.
Запуск контейнера и мастер первоначальной настройки
Запустим контейнер в фоновом режиме:
sudo docker compose up -d
# Проверяем статус контейнера
sudo docker compose ps
Убедитесь, что все порты успешно прослушиваются хостом, воспользовавшись нашим инструментом Сканер сетевых портов онлайн (проверьте порты 53, 3000 и 80 по вашему IP).
Откройте браузер и перейдите по адресу http://IP_ВАШЕГО_СЕРВЕРА:3000. Вас встретит пошаговый мастер AdGuard Home:
До выпуска TLS-сертификата мастер на порту 3000 и веб-панель на порту 80 работают по открытому протоколу HTTP без шифрования. Чтобы пароль администратора не был перехвачен при передаче через публичные сети, рекомендуется либо задать временный пароль и сменить его сразу после настройки TLS, либо подключиться к мастеру через защищенный SSH-туннель:
# Пробрасываем порт 3000 через зашифрованный SSH-туннель на ваш локальный ПК
ssh -L 3000:localhost:3000 root@IP_ВАШЕГО_СЕРВЕРА
После этого откройте в браузере локальный адрес http://localhost:3000 — весь трафик мастера будет гарантированно зашифрован внутри SSH-соединения.
- Приветствие: Нажмите «Начать установку».
- Настройка интерфейсов:
- Веб-интерфейс: выберите «Все интерфейсы» и укажите порт
80(после завершения мастера панель будет доступна по стандартному порту 80). - DNS-сервер: выберите «Все интерфейсы» и порт
53. Мастер проверит доступность сокета и загорится зеленым цветом.
- Веб-интерфейс: выберите «Все интерфейсы» и укажите порт
- Аутентификация: задайте надежный логин администратора и сложный пароль. Для генерации криптостойкого пароля воспользуйтесь утилитой Генератор надежных паролей.
- Завершение: мастер покажет краткую инструкцию по настройке устройств и перенаправит вас в главную панель управления на порт 80 (
http://IP_ВАШЕГО_СЕРВЕРА/).
Как только первоначальная настройка завершена и веб-панель открывается на порту 80/443, порт 3000 больше не используется системой. Для сокращения поверхности сетевой атаки откройте docker-compose.yml, закомментируйте строку # - "3000:3000/tcp" и обновите контейнер командой sudo docker compose up -d.
4. Выпуск SSL-сертификата Let's Encrypt и настройка шифрования DoH, DoT и DoQ
Использование классического DNS по порту 53 через мобильный интернет или публичный Wi-Fi небезопасно. Трафик идет в открытом виде по незашифрованному UDP: интернет-провайдеры, операторы связи и злоумышленники могут перехватывать запросы, вести лог посещаемых сайтов или выполнять спуфинг (подмену DNS-ответов для фишинга).
Чтобы защитить запросы, настроим два ключевых стандарта шифрования:
- DNS-over-TLS (DoT, порт 853): легковесный протокол, использующий прямой TLS-туннель. Является нативным стандартом для функции «Частный DNS-сервер» в ОС Android.
- DNS-over-HTTPS (DoH, порт 443): инкапсулирует DNS-запросы в стандартные HTTP/2 и HTTP/3 сессии. Провайдер или брандмауэр не способен отличить DoH-запрос от обычного просмотра веб-страниц.
- DNS-over-QUIC (DoQ, порт 853 UDP): современный протокол на базе QUIC. Минимизирует задержки при возобновлении сессий, предотвращает блокировку начала очереди (Head-of-Line blocking) и устойчив к потерям пакетов при переключении клиентов между Wi-Fi и сотовой связью. Историческая справка: на этапе ранних черновиков DoQ использовал экспериментальные порты 784 и 8853 UDP, однако современный стандарт IETF и актуальные сборки AdGuard Home используют стандартизированный порт 853 UDP.
Шаг 1. Привязка доменного имени к VDS
Для выпуска доверенного TLS-сертификата вам потребуется собственный домен или поддомен (например, dns.example.com). В панели управления вашего DNS-провайдера добавьте A-запись (и AAAA-запись, если у вас есть IPv6), указывающую на внешний IP-адрес вашего VDS.
Перед выпуском сертификата убедитесь, что записи успешно обновились во всемирной сети, с помощью сервиса DNS Lookup онлайн.
Шаг 2. Выпуск бесплатного сертификата Let's Encrypt через Certbot
Установим утилиту Certbot на хост-сервер:
sudo apt update
sudo apt install -y certbot
Для выпуска TLS-сертификата есть два проверенных пути:
-
Способ А (Рекомендуется для боевых серверов — DNS-01 Challenge без простоя):
Если ваш домен обслуживается DNS-провайдером с поддержкой API (Cloudflare, Selectel, Timeweb), установите соответствующий плагин (например,sudo apt install -y python3-certbot-dns-cloudflare). Проверка владения доменом выполняется через добавление TXT-записи в DNS, не требует открытия 80 порта и обеспечивает абсолютный Zero-Downtime без остановки контейнеров. -
Способ Б (Универсальный — HTTP-01 Standalone с хуками):
Если вы не хотите настраивать API-ключи DNS, используйте стандартный режим--standaloneс автоматическими хуками остановки и запуска контейнера AdGuard Home.
Ниже приведена универсальная команда режима Standalone с автоматическими хуками:
# Выпускаем сертификат через Certbot в режиме standalone.
# Флаги --pre-hook и --post-hook автоматически освобождают 80 порт на время проверки
# и сохраняются в конфигурацию для будущего фонового автопродления!
sudo certbot certonly --standalone \
-d dns.example.com \
--pre-hook "docker compose -f /opt/adguardhome/docker-compose.yml stop adguardhome" \
--post-hook "docker compose -f /opt/adguardhome/docker-compose.yml start adguardhome" \
--non-interactive --agree-tos -m admin@example.com
Сертификаты будут сохранены в стандартной директории /etc/letsencrypt/live/dns.example.com/, которая уже проброшена внутрь контейнера по пути /opt/adguardhome/certs/.
Шаг 3. Включение шифрования в панели AdGuard Home
Перейдите в веб-интерфейс AdGuard Home: меню Настройки → Настройки шифрования (Encryption Settings).
- Установите галочку «Включить шифрование» (Enable Encryption).
- В поле «Имя сервера» (Server name) введите ваш домен:
dns.example.com. - Установите галочку «Перенаправлять на HTTPS автоматически». После этого AdGuard Home будет принудительно перенаправлять любые обращения с незащищенного порта 80 на зашифрованный HTTPS (порт 443), исключая передачу учетных данных открытым текстом.
- В блоке «Сертификаты» переключитесь на режим указания путей к файлам (или вставьте текст ключей):
- Путь к цепочке сертификатов:
/opt/adguardhome/certs/live/dns.example.com/fullchain.pem - Путь к закрытому ключу:
/opt/adguardhome/certs/live/dns.example.com/privkey.pem
- Путь к цепочке сертификатов:
- Нажмите «Сохранить конфигурацию».
Если пути указаны корректно, AdGuard Home выведет зеленое сообщение: «Сертификат действителен» с отображением срока действия и издателя Let's Encrypt. Проверить валидность параметров TLS и шифрования извне можно с помощью нашего инструмента Проверка SSL / TLS сертификата.
5. Оптимальные списки блокировок, выбор быстрых Upstream DNS и тюнинг кэша
Эффективность блокировки рекламы и скорость открытия веб-страниц напрямую зависят от двух параметров: качества подключенных списков правил и задержки (ping) до вышестоящих (Upstream) DNS-серверов.
Рекомендуемые списки правил (Blacklists)
По умолчанию в AdGuard Home активирован базовый список AdGuard DNS filter. Для комфортного серфинга в Рунете и блокировки мобильной телеметрии перейдите в раздел Фильтры → Черные списки DNS и нажмите «Добавить черный список» → «Выбрать из списка»:
- AdGuard Russian filter: ключевой фильтр для русскоязычного сегмента сети. Блокирует баннеры Яндекса, VK, рекламные сети рунета и региональные трекеры.
- OISD Blocklist (Basic или Full): один из самых качественных и сбалансированных мировых списков с околонулевым количеством ложных срабатываний (false positives).
- AdGuard Mobile Ads filter: специализированная база для блокировки навязчивой рекламы внутри бесплатных мобильных игр и приложений.
- NoCoin Filter List: предотвращает скрытый майнинг криптовалют через JavaScript в браузере.
Подключение десятков списков с миллионами доменов не сделает интернет чище, но увеличит потребление RAM и замедлит сопоставление правил. Оптимальный набор — 150 000–350 000 правил. Это отсекает подавляющее большинство типовых баннерных сетей и телеметрии, не перегружая память VDS и не создавая проблем с авторизацией в банковских приложениях или государственных сервисах.
Настройка быстрых шифрованных Upstream DNS
Когда запрашиваемый домен не является рекламным, AdGuard Home пересылает запрос вышестоящим серверам. Перейдите в Настройки → Настройки DNS. В поле «Серверы вышестоящей пересылки» укажите надежные шифрованные DoT и DoH апстримы:
# Cloudflare DNS (быстрый мировой резолвер)
tls://1.1.1.1
tls://1.0.0.1
# Quad9 (со встроенной защитой от вредоносного ПО и фишинга)
https://dns.quad9.net/dns-query
# Yandex DNS (минимальный пинг для пользователей из России)
tls://common.dot.dns.yandex.net
tls://77.88.8.8
# Google DNS
tls://dns.google
Защита от взаимной блокировки: настройка Bootstrap DNS
Обратите внимание на критический сисадминский нюанс: если в качестве апстримов указаны доменные имена (например, https://dns.quad9.net/dns-query или tls://common.dot.dns.yandex.net), сервер попадает в циклическую ловушку chicken-and-egg: чтобы отправить шифрованный запрос к апстриму, AdGuard Home должен сначала узнать его IP-адрес, но для этого ему требуется DNS-сервер!
Для разрыва этого замкнутого круга в AdGuard Home предусмотрен блок «Серверы начального разрешения» (Bootstrap DNS). Обязательно укажите в нем надежные статические IP-адреса:
# Надежные IP-адреса для первичного резолвинга самих апстримов
9.9.9.9
1.1.1.1
77.88.8.8
8.8.8.8
Bootstrap DNS используется исключительно для резолвинга хостнеймов вышестоящих шифрованных серверов, гарантируя, что при холодном старте или очистке кэша AdGuard Home мгновенно найдет координаты апстримов.
Ниже в блоке переключателей выберите режим опроса. По умолчанию рекомендуется режим «Параллельные запросы» (Parallel requests), при котором AdGuard Home отправляет запрос одновременно всем серверам и отдает ответ от первого ответившего, нивелируя сетевые просадки.
Важно понимать архитектурный компромисс: при параллельном опросе каждый ваш незакэшированный DNS-запрос одновременно рассылается всем указанным провайдерам (в нашем примере — Cloudflare, Quad9 и Яндекс). Если для вас абсолютный приоритет — строгая приватность без распыления метаданных по нескольким независимым корпорациям, выберите режим «Нагрузочное распределение» (Load balancing) либо укажите один доверенный апстрим (например, только Quad9 со встроенной защитой от фишинга или собственный локальный рекурсивный резолвер Unbound).
Выбор режима блокировки: почему NXDOMAIN быстрее 0.0.0.0
По умолчанию AdGuard Home настроен на возврат нулевого IP-адреса (0.0.0.0 для IPv4 и :: для IPv6). Однако в реальной эксплуатации многие клиенты (браузеры, мобильные приложения и Smart TV) при получении 0.0.0.0 пытаются инициировать TCP SYN-рукопожатие и замирают в ожидании таймаута соединения (SYN timeout), что вызывает визуальные задержки при загрузке страниц.
Для максимальной отзывчивости интерфейсов в меню Настройки → Настройки DNS → блок «Режим блокировки» (Blocking mode) переключите режим на NXDOMAIN («Домен не существует»).
Получив код ответа NXDOMAIN, сетевой стек операционной системы мгновенно понимает, что запрашиваемый сервер отсутствует во всемирной сети, и немедленно прекращает любые сетевые попытки. Рекламные баннеры и пустые заглушки схлопываются в браузере за доли миллисекунды без малейших подвисаний.
Оптимистичное кэширование (Optimistic Caching)
В подразделе «Конфигурация кэша DNS» задайте:
- Размер кэша:
67108864(64 МБ, достаточно для сотен тысяч записей). - Минимальный TTL:
300(секунд) — предотвратит повторные запросы для сайтов с коротким временем жизни записи. - Включить оптимистичный кэш: поставьте галочку. При включении этой опции AdGuard Home мгновенно отдает клиенту IP-адрес из кэша (даже если срок его жизни истек), а затем в фоновом режиме опрашивает апстрим и обновляет запись. Сайты открываются без малейших пауз. Нюанс эксплуатации: если сторонний сервис выполнил экстренную смену IP-адреса, клиент может кратковременно получить старый адрес до фонового обновления кэша.
6. Подключение клиентов: настройка Android, iOS/macOS, Windows и роутеров
Самое большое преимущество DoH и DoT — простота подключения без необходимости устанавливать клиентское ПО AdGuard или включать постоянный VPN, сажающий батарею смартфона.
1. Android (штатная функция «Частный DNS»)
В операционной системе Android (версии 9.0 и новее) поддержка DNS-over-TLS встроена в ядро системы:
- Откройте Настройки → Подключения (или «Сеть и интернет») → Другие настройки → Частный DNS (Private DNS).
- Выберите вариант «Имя хоста провайдера частного DNS».
- Введите ваш домен:
dns.example.comи нажмите «Сохранить».
Все DNS-запросы на телефоне (как через Wi-Fi, так и через 4G/5G) теперь надежно зашифрованы по порту 853, а реклама заблокирована во всех приложениях.
2. iOS, iPadOS и macOS (профили мобильной конфигурации)
Apple поддерживает шифрованные DoH и DoT нативно, начиная с iOS 14 и macOS 11. Чтобы активировать их без сторонних утилит, используется конфигурационный профиль .mobileconfig. В самом интерфейсе AdGuard Home в разделе «Руководство по настройке» доступна готовая ссылка на скачивание персонализированного профиля для устройств Apple.
После скачивания профиля на iPhone перейдите в Настройки → Профиль загружен → Установить. Шифрованный DNS активируется в системном меню «VPN и управление устройством».
3. Персонализация устройств с помощью Client ID
AdGuard Home позволяет настраивать индивидуальные правила для разных членов семьи или устройств с помощью идентификаторов клиентов. В DoH-адресе достаточно указать произвольный суффикс:
# Адрес для смартфона администратора (полный доступ)
https://dns.example.com/dns-query/phone-alex
# Адрес для планшета ребенка (с включенным родительским контролем и безопасным поиском)
https://dns.example.com/dns-query/kids-tablet
В разделе Настройки → Параметры клиентов создайте клиента с соответствующим ID. Вы сможете видеть раздельную статистику запросов и блокировать определенные сервисы (например, TikTok или YouTube) точечно для выбранного устройства.
4. Домашний роутер (Keenetic, OpenWrt, Mikrotik)
Чтобы защитить все устройства в квартире (включая умные телевизоры, приставки и умный дом):
- Keenetic: меню Сетевые правила → DNS → добавить сервер
dns.example.comс выбором протокола DNS-over-TLS. - OpenWrt: пакет
https-dns-proxyилиstubbyдля перенаправления локального dnsmasq в защищенный DoH/DoT upstream.
7. Безопасность публичного DNS: защита от DNS Amplification и ограничение доступа
Любой публичный DNS-сервер в интернете подвергается автоматическому сканированию ботнетами. Если оставить стандартный UDP-порт 53 открытым без защиты, злоумышленники могут использовать ваш сервер для проведения DDoS-атак типа DNS Amplification (подделывая IP жертвы и заставляя ваш сервер бомбардировать её тяжелыми ответами).
1. Включение встроенного Rate Limiting в AdGuard Home
В интерфейсе перейдите в Настройки → Настройки DNS → блок «Ограничение скорости» (Rate limit). Установите значение 20 запросов в секунду на один IP. Для обычного домашнего использования этого с запасом хватит, но попытка генерации паразитного флуда будет немедленно подавлена.
2. Защита порта 53: почему ufw deny НЕ работает с Docker и как закрыть доступ правильно
Многие администраторы ошибочно полагают, что команда sudo ufw deny 53 закроет порт DNS. Это опасное заблуждение! Демон Docker при пробросе портов через директиву ports: встраивает свои правила трансляции сетевых адресов (DNAT) напрямую в цепочки PREROUTING и FORWARD пакетного фильтра iptables в обход стандартных цепочек UFW INPUT. В результате порт 53 останется открытым для всего интернета, а сервер будет уязвим для участия в DNS Amplification атаках. Подробнее этот механизм описан в нашей статье Docker обходит UFW на Linux: как закрыть порты контейнеров.
Для надежной защиты выберите один из двух правильных инженерных подходов:
Вариант А (Рекомендуется): Не публиковать порт 53 наружу вовсе
Если вы и ваши близкие подключаетесь к AdGuard Home со смартфонов, ноутбуков и современных роутеров по зашифрованным протоколам DoT (853) и DoH (443), стандартный незашифрованный DNS вам не нужен. Просто закомментируйте или удалите строки порта 53 в манифесте docker-compose.yml:
ports:
# Порт 53 закомментирован: сервер физически не принимает внешний незашифрованный трафик
# - "53:53/tcp"
# - "53:53/udp"
- "80:80/tcp"
- "443:443/tcp"
- "443:443/udp"
- "853:853/tcp"
- "853:853/udp"
Примените изменения командой sudo docker compose up -d. Порт 53 на хосте будет мгновенно закрыт, а шифрованные DoH и DoT продолжат работать в штатном режиме.
Вариант Б: Фильтрация через цепочку DOCKER-USER в iptables
Если у вас есть оборудование без поддержки DoT/DoH (например, умный телевизор или роутер со статическим внешним IP) и порт 53 требуется открыть строго для одного адреса, настройте правила в специальной системной цепочке DOCKER-USER.
Цепочка DOCKER-USER по умолчанию завершается безусловным правилом RETURN, передающим пакеты дальше во внутренние цепочки Docker. Если добавить запрещающее правило через iptables -A в конец, оно окажется после RETURN и никогда не сработает! Чтобы фильтрация работала надежно, формируем правила в строгом порядке с явным завершающим RETURN:
# 1. Очищаем цепочку DOCKER-USER от старых правил
# Внимание: команда -F удаляет ВСЕ правила в цепочке DOCKER-USER. Если на вашем сервере
# уже работают другие контейнеры с настроенными правилами, добавляйте строки точечно через -I DOCKER-USER 1
sudo iptables -F DOCKER-USER
# 2. Разрешаем уже установленные и зависимые соединения (conntrack)
sudo iptables -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 3. Разрешаем входящий DNS (порт 53) строго с вашего домашнего IP
sudo iptables -A DOCKER-USER -p udp --dport 53 -s ВАШ_ДОМАШНИЙ_IP -j ACCEPT
sudo iptables -A DOCKER-USER -p tcp --dport 53 -s ВАШ_ДОМАШНИЙ_IP -j ACCEPT
# 4. Сбрасываем (DROP) любые другие входящие DNS-запросы к порту 53 из внешнего мира
sudo iptables -A DOCKER-USER -p udp --dport 53 -j DROP
sudo iptables -A DOCKER-USER -p tcp --dport 53 -j DROP
# 5. Весь остальной трафик Docker (веб-панель 80/443, DoT 853) пропускаем дальше штатно
sudo iptables -A DOCKER-USER -j RETURN
# Сохраняем правила для автозагрузки при рестарте ОС
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
3. Безотказное автопродление SSL-сертификата Let's Encrypt
Сертификаты Certbot выпускаются на 90 дней. Поскольку наш сертификат был выпущен с флагами --pre-hook и --post-hook, Certbot автоматически зафиксировал эти команды в файле конфигурации обновления /etc/letsencrypt/renewal/dns.example.com.conf.
Штатный системный таймер certbot.timer дважды в сутки запускает проверку. За 30 дней до окончания срока сертификата Certbot автоматически:
- Выполнит
--pre-hook: временно остановит контейнер AdGuard Home, освобождая порт 80 для прохождения проверки Let's Encrypt. - Успешно пройдет HTTP-01 валидацию и обновит файлы сертификатов в
/etc/letsencrypt/live/dns.example.com/. - Выполнит
--post-hook: мгновенно запустит контейнер AdGuard Home обратно. Время простоя составит менее 3–5 секунд.
Убедимся, что цикл автоматического продления работает без сбоев, запустив тестовый холостой прогон:
# Тестируем полный цикл продления без реального выпуска сертификата
sudo certbot renew --dry-run
Вывод команды должен завершиться сообщением «Congratulations, all simulated renewals succeeded». Это гарантирует, что через 60 или 90 дней ваши клиенты не потеряют доступ из-за просроченного TLS.
Решение с --pre-hook и --post-hook предельно простое и надежное, однако останавливает контейнер на 3–5 секунд. Если для вас критичен абсолютный Zero-Downtime:
- DNS-01 Challenge: используйте плагины Certbot для DNS API (например,
certbot-dns-cloudflare). Проверка владения доменом выполняется через добавление служебной TXT-записи, не требуя открытия 80 порта и остановки веб-панели AdGuard. - Reverse Proxy: можно вынести веб-панель за фронтенд Nginx или Caddy, где автоматический выпуск и продление SSL выполняются прокси-сервером в фоновом режиме без перезапуска внутренних контейнеров.
4. Защита от паразитного трафика: ограничение публичного доступа к DoH и DoT
После закрытия порта 53 ваши зашифрованные протоколы DoH (443) и DoT (853) по умолчанию остаются открытыми для всего интернета. Если злоумышленники или автоматические сканеры обнаружат ваш домен dns.example.com, они смогут использовать ваш VDS в качестве бесплатного открытого резолвера, забивая канал сервера и создавая паразитную нагрузку.
Для изоляции личного DNS-сервера примените следующие меры защиты:
-
Авторизация через Client ID (Секретный DoH-путь):
Не используйте для клиентов стандартный публичный адресhttps://dns.example.com/dns-query. Назначьте каждому устройству в разделе Настройки → Параметры клиентов уникальный секретный идентификатор (например,phone-x9k2m) и настройте подключение по путиhttps://dns.example.com/dns-query/phone-x9k2m. В настройках DNS активируйте блокировку неавторизованных запросов, чтобы сторонние обращения без валидного ID немедленно отбрасывались. -
Белые списки клиентов (Allowed clients):
В меню Настройки → Настройки DNS → блок «Ограничения доступа» заполните поле «Разрешенные клиенты». Вы можете указать доверенные статические IP-адреса (например, статический IP вашего домашнего роутера или рабочего офиса), диапазоны подсетей (CIDR) или конкретные идентификаторы клиентов. Любые запросы от адресов вне белого списка будут отвергнуты со статусомREFUSED. -
Изоляция веб-панели управления:
Веб-интерфейс администрирования не должен быть доступен всему интернету. Для максимальной безопасности привяжите порт 80 вdocker-compose.ymlтолько к локальной петле127.0.0.1:80:80и подключайтесь к панели исключительно через защищенный SSH-туннель или приватную оверлейную сеть (например, Headscale/Tailscale VPN).
5. Резервное копирование конфигурации
Вся база фильтров, статистика и настройки хранятся в двух путях хоста: /opt/adguardhome/conf/AdGuardHome.yaml и /opt/adguardhome/work/. Для надежного сохранения настроек настройте регулярное копирование этих файлов в облако по нашей инструкции Автоматический бэкап с VDS в S3-хранилище.
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Быстрые NVMe VDS для DNS-сервера
Низкие задержки (ping 1–5 мс) до российских и европейских апстримов, статический IPv4 и постоянный аптайм для безотказного резолвинга.
Selectel — Отказоустойчивые VDS в Tier III дата-центрах
Гарантированная сетевая связность, выделенный IPv4/IPv6 и стабильная работа под постоянным потоком UDP-запросов сотен клиентов.
Beget — Доступные облачные серверы для домашних сервисов
Быстрый запуск за 1 минуту, почасовая оплата и удобная консоль для размещения легковесных контейнеров AdGuard Home.