AdGuard Home в контейнере на MikroTik — DNS-фильтрация
AdGuard Home — мощная альтернатива Pi-hole с встроенной поддержкой DNS-over-HTTPS (DoH), DNS-over-TLS (DoT), DNS-over-QUIC, родительским контролем и современным веб-интерфейсом. Запуск AdGuard Home на маршрутизаторе MikroTik через контейнер позволяет фильтровать рекламу, трекеры и вредоносные домены для всей сети без дополнительного оборудования. В этом руководстве подробно разберём установку, сравнение с Pi-hole, настройку зашифрованного DNS и эксплуатацию на RouterOS 7.20+.
Описание
AdGuard Home vs Pi-hole — детальное сравнение
Оба продукта решают одну задачу — DNS-фильтрацию. Но подходы и возможности различаются:
| Параметр | AdGuard Home | Pi-hole |
|---|---|---|
| DNS-over-HTTPS (DoH) | Встроенный сервер и клиент | Только через cloudflared (доп. контейнер) |
| DNS-over-TLS (DoT) | Встроенный | Нет |
| DNS-over-QUIC (DoQ) | Встроенный | Нет |
| Веб-интерфейс | Современный, responsive | Функциональный, но устаревший дизайн |
| Язык интерфейса | Русский, English и др. | English (русский через community) |
| Потребление RAM | 50–100 МБ | 80–150 МБ |
| Фильтры | Собственные + сторонние | Gravity lists |
| Родительский контроль | Встроенный (по клиентам) | Нет (только через списки) |
| Safe Search | Встроенный (Google, YouTube, Bing) | Нет |
| Индивидуальные настройки клиентов | Да (per-client rules) | Ограниченно (group management) |
| API | REST API | REST API |
| Кодовая база | Go (один бинарник) | PHP + Python + dnsmasq |
| Docker-образ | ~50 МБ (ARM64) | ~200 МБ (ARM64) |
| Лицензия | GPL v3 | EUPL |
Вывод: AdGuard Home предпочтительнее для MikroTik из-за меньшего потребления ресурсов, встроенного DoH/DoT и русскоязычного интерфейса. Pi-hole имеет более зрелое сообщество и больше документации.
Как работает AdGuard Home
AdGuard Home выступает DNS-сервером для всех клиентов сети. При получении DNS-запроса:
- Проверяет запрос по фильтрам и чёрным спискам.
- Если домен заблокирован — возвращает NXDOMAIN или 0.0.0.0.
- Если разрешён — пересылает на upstream DNS (можно через DoH/DoT).
- Кэширует ответ для ускорения повторных запросов.
- Записывает статистику по клиентам и доменам.
Требования
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| RouterOS | 7.4+ | 7.20+ |
| Устройство | RB5009, CCR2004, CHR | RB5009UPr+S+ |
| Архитектура | ARM64 или x86 | ARM64 |
| Свободная RAM | 128 МБ | 256 МБ+ |
| Хранилище | 512 МБ на USB | 2 ГБ+ USB |
| Container mode | Включён | — |
AdGuard Home значительно легче Pi-hole: один бинарник на Go потребляет 50–100 МБ RAM. Это делает его лучшим выбором для устройств с ограниченными ресурсами.
Настройка
Шаг 1: Включение container mode
[admin@MikroTik] ># Если container mode ещё не включён /system/device-mode/update container=yes # Нажмите кнопку reset на устройстве или перезагрузите CHR
Настройка хранилища:
[admin@MikroTik] >/container/config/set registry-url=https://registry-1.docker.io tmpdir=usb1/tmp ram-high=512M
Шаг 2: Создание сетевой инфраструктуры
Bridge для контейнеров
[admin@MikroTik] ># Bridge (если ещё не создан) /interface/bridge/add name=bridge-containers comment="Container network" # IP-адрес шлюза /ip/address/add address=172.17.0.1/24 interface=bridge-containers comment="Container gateway"
veth-интерфейс для AdGuard Home
[admin@MikroTik] ># veth с фиксированным IP /interface/veth/add name=veth-adguard address=172.17.0.3/24 gateway=172.17.0.1 comment="AdGuard Home container" # Добавляем в bridge /interface/bridge/port/add bridge=bridge-containers interface=veth-adguard
NAT для контейнеров
[admin@MikroTik] ># Masquerade для контейнерной подсети (если ещё не создано) /ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24 out-interface-list=WAN comment="Container NAT"
Шаг 3: Подготовка хранилища и переменных окружения
[admin@MikroTik] ># Создание директорий /file/mkdir usb1/adguard /file/mkdir usb1/adguard/work /file/mkdir usb1/adguard/conf # Точки монтирования /container/mounts/add name=adguard-work src=usb1/adguard/work dst=/opt/adguardhome/work /container/mounts/add name=adguard-conf src=usb1/adguard/conf dst=/opt/adguardhome/conf # Переменные окружения /container/envs/add name=adguard-env key=TZ value="Europe/Moscow"
AdGuard Home хранит конфигурацию в /opt/adguardhome/conf/AdGuardHome.yaml и данные (статистику, логи запросов) в /opt/adguardhome/work/. Монтирование этих директорий гарантирует сохранение настроек при обновлении контейнера.
Шаг 4: Создание и запуск контейнера
[admin@MikroTik] ># Создание контейнера AdGuard Home /container/add remote-image=adguard/adguardhome:latest interface=veth-adguard root-dir=usb1/adguard/root envlist=adguard-env mounts=adguard-work,adguard-conf start-on-boot=yes hostname=adguard logging=yes comment="AdGuard Home DNS filter"
Дождитесь скачивания образа:
[admin@MikroTik] ># Проверяем статус /container/print
Запуск:
[admin@MikroTik] >/container/start 0
Шаг 5: Первоначальная настройка AdGuard Home
При первом запуске AdGuard Home запускает мастер настройки на порту 3000. Откройте в браузере:
codehttp://172.17.0.3:3000
Мастер настройки:
- Приветствие — нажмите «Начать».
- Веб-интерфейс — оставьте порт 80 (по умолчанию), слушать на всех интерфейсах (0.0.0.0).
- DNS-сервер — порт 53, слушать на всех интерфейсах (0.0.0.0).
- Логин и пароль — задайте учётные данные администратора.
- Готово — мастер перенаправит на основной интерфейс.
После завершения мастера веб-интерфейс доступен по адресу:
codehttp://172.17.0.3
Шаг 6: Настройка DNS-фильтров
В веб-интерфейсе AdGuard Home перейдите в Фильтры → DNS-чёрные списки и добавьте списки:
Рекомендуемые фильтры:
- AdGuard DNS filter — включён по умолчанию;
- AdAway Default Blocklist — популярный мобильный список;
- OISD Big — комплексный список (
https://big.oisd.nl); - Steven Black — классический hosts-файл (
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts).
Не добавляйте слишком много списков — каждый увеличивает потребление RAM. Для MikroTik оптимально 2–4 списка.
Шаг 7: Настройка upstream DNS с шифрованием
Ключевое преимущество AdGuard Home — встроенная поддержка зашифрованного DNS. Перейдите в Настройки → Настройки DNS:
Upstream DNS-серверы
Укажите DoH или DoT серверы:
[admin@MikroTik] ># DNS-over-HTTPS https://dns.cloudflare.com/dns-query https://dns.google/dns-query # DNS-over-TLS tls://1dot1dot1dot1.cloudflare-dns.com tls://dns.google # DNS-over-QUIC (самый быстрый) quic://dns.adguard-dns.com
Рекомендуется использовать 2 upstream-сервера для отказоустойчивости. Выберите режим «Параллельные запросы» для максимальной скорости.
Bootstrap DNS
Bootstrap DNS нужен для разрешения доменных имён upstream-серверов (замкнутый цикл: DoH-сервер указан по имени, но для резолва имени нужен DNS):
code1.1.1.1 8.8.8.8
Шаг 8: Перенаправление DNS на AdGuard Home
Подход 1: MikroTik DNS -> AdGuard Home (рекомендуется)
[admin@MikroTik] ># MikroTik пересылает DNS-запросы в AdGuard Home /ip/dns/set servers=172.17.0.3 allow-remote-requests=yes cache-size=2048KiB # DHCP раздаёт IP маршрутизатора как DNS /ip/dhcp-server/network/set [find] dns-server=192.168.88.1
Подход 2: Клиенты -> AdGuard Home напрямую
[admin@MikroTik] ># DHCP раздаёт адрес AdGuard Home /ip/dhcp-server/network/set [find] dns-server=172.17.0.3
При подходе 2 AdGuard Home видит реальные IP клиентов, что позволяет использовать per-client настройки и подробную статистику.
Принудительное перенаправление DNS
[admin@MikroTik] ># Перехват всех DNS-запросов /ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.3 to-ports=53 protocol=udp dst-port=53 src-address=!172.17.0.3 dst-address=!172.17.0.3 comment="Force DNS through AdGuard Home" /ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.3 to-ports=53 protocol=tcp dst-port=53 src-address=!172.17.0.3 dst-address=!172.17.0.3 comment="Force DNS through AdGuard Home TCP"
Шаг 9: Настройка per-client правил
AdGuard Home позволяет создавать индивидуальные правила для каждого клиента. В веб-интерфейсе перейдите в Настройки → Настройки клиентов:
- Нажмите «Добавить клиента».
- Укажите имя (например, «Детский планшет»).
- Укажите IP-адрес или MAC-адрес.
- Настройте:
- Использовать глобальные фильтры или индивидуальные;
- Включить/отключить родительский контроль;
- Включить/отключить безопасный поиск (Safe Search);
- Заблокировать определённые сервисы (YouTube, TikTok, Instagram и т.д.).
Это особенно полезно для семей с детьми: взрослые устройства получают стандартную фильтрацию, а детские — дополнительные ограничения.
Шаг 10: Родительский контроль и Safe Search
Включение Safe Search
В Настройки → Общие настройки:
- Безопасный поиск — принудительно включает SafeSearch в Google, YouTube, Bing, Yandex;
- Родительский контроль — блокирует контент для взрослых на уровне DNS.
Эти настройки работают для всех клиентов или для конкретных (через per-client rules).
Блокировка сервисов
В Фильтры → Заблокированные сервисы можно одним кликом заблокировать:
- Социальные сети (Facebook, Instagram, TikTok, VK);
- Мессенджеры (Telegram, WhatsApp);
- Видеосервисы (YouTube, Twitch);
- Игры (Steam, Epic Games);
- И другие категории.
Шаг 11: Статистика и мониторинг
Dashboard AdGuard Home показывает:
- общее количество DNS-запросов за период;
- процент заблокированных запросов;
- топ заблокированных доменов;
- топ клиентов;
- графики по времени суток;
- среднее время ответа DNS.
Для доступа к API (интеграция с Grafana и другими системами мониторинга):
[admin@MikroTik] ># REST API AdGuard Home GET http://172.17.0.3/control/stats GET http://172.17.0.3/control/status GET http://172.17.0.3/control/querylog
API защищён Basic Auth (логин/пароль из мастера настройки).
Проверка
Полная проверка работоспособности
[admin@MikroTik] ># 1. Контейнер запущен /container/print # status: running # 2. AdGuard Home отвечает на DNS /tool/dns-query name=google.com server=172.17.0.3 # Должен вернуть IP-адрес # 3. Блокировка работает /tool/dns-query name=ads.doubleclick.net server=172.17.0.3 # Должен вернуть 0.0.0.0 или NXDOMAIN # 4. MikroTik DNS использует AdGuard Home /ip/dns/print # servers: 172.17.0.3 # 5. Пинг контейнера /ping 172.17.0.3 count=4 # 6. HTTP-доступ к веб-интерфейсу /tool/fetch url="http://172.17.0.3" mode=http dst-path=adguard-test.html
Проверка зашифрованного DNS
В веб-интерфейсе AdGuard Home перейдите в Настройки → Настройки DNS. Нажмите «Проверить upstream» — AdGuard Home проверит доступность всех указанных DoH/DoT серверов.
Также проверьте на клиентском устройстве:
- Откройте https://www.dnsleaktest.com/;
- Запустите Extended test;
- Убедитесь, что DNS-серверы соответствуют выбранным upstream (Cloudflare, Google и т.д.), а не провайдерским.
Типичные ошибки
Ошибка 1: Конфликт порта 53 с MikroTik DNS
Симптом: AdGuard Home запускается, но не отвечает на DNS-запросы на порту 53.
Причина: встроенный DNS MikroTik тоже слушает порт 53. Хотя они на разных IP, иногда возникают конфликты.
Решение:
[admin@MikroTik] ># Вариант 1: Отключить MikroTik DNS (если все запросы через AdGuard) /ip/dns/set allow-remote-requests=no # Вариант 2: Изменить порт DNS MikroTik (RouterOS 7.15+) # В RouterOS нет прямой настройки порта DNS, но можно через firewall: /ip/firewall/filter/add chain=input action=drop protocol=udp dst-port=53 in-interface=bridge-containers comment="Block MikroTik DNS on container bridge" /ip/firewall/filter/add chain=input action=drop protocol=tcp dst-port=53 in-interface=bridge-containers comment="Block MikroTik DNS on container bridge TCP"
Ошибка 2: Мастер настройки недоступен (порт 3000)
Симптом: при первом запуске не открывается http://172.17.0.3:3000.
Причина: контейнер ещё загружается, сетевая связность не настроена, или firewall блокирует.
Решение:
[admin@MikroTik] ># Проверяем статус контейнера /container/print # Подождите, пока status станет "running" # Проверяем сетевую связность /ping 172.17.0.3 count=4 # Если пинг не проходит — проверяем veth и bridge /interface/veth/print /interface/bridge/port/print where bridge=bridge-containers # Проверяем логи /log/print where topics~"container"
Если проблема в firewall — убедитесь, что правила не блокируют трафик к 172.17.0.3.
Ошибка 3: AdGuard Home потребляет много RAM
Симптом: после добавления большого количества фильтров потребление RAM растёт до 200+ МБ.
Причина: слишком много списков фильтров загружено в память.
Решение:
Оптимизируйте списки фильтров:
[admin@MikroTik] ># Проверяем потребление ресурсов /system/resource/print
Рекомендации:
- Используйте не более 3–4 списков фильтров;
- Предпочитайте OISD (один комплексный список) вместо множества мелких;
- Отключите Query Log, если он не нужен (экономит RAM и дисковое пространство);
- Установите лимит хранения статистики: 7 дней вместо 90.
Ошибка 4: Медленный DNS после установки AdGuard Home
Симптом: DNS-запросы обрабатываются 200–500 мс вместо обычных 10–50 мс.
Причина: upstream DoH/DoT серверы добавляют задержку из-за TLS-handshake, или upstream-сервер далеко географически.
Решение:
-
Используйте ближайшие upstream-серверы:
- Для России:
tls://dns.adguard-dns.com,https://common.dot.dns.yandex.net/dns-query; - Для Европы:
tls://1dot1dot1dot1.cloudflare-dns.com.
- Для России:
-
Включите кэширование в AdGuard Home (включено по умолчанию).
-
Увеличьте DNS-кэш MikroTik:
[admin@MikroTik] >/ip/dns/set cache-size=4096KiB
- Используйте режим «Параллельные запросы» для upstream — AdGuard Home отправит запрос всем upstream одновременно и вернёт первый ответ.
Ошибка 5: После обновления RouterOS контейнер не работает
Симптом: после обновления RouterOS контейнер AdGuard Home перестаёт работать.
Причина: обновление RouterOS могло сбросить container mode или изменить сетевые настройки.
Решение:
[admin@MikroTik] ># Проверяем container mode /system/device-mode/print # Если container: no — включите заново # Проверяем сетевую конфигурацию /interface/veth/print /interface/bridge/port/print where bridge=bridge-containers /ip/address/print where interface=bridge-containers # Проверяем контейнер /container/print # Если status: error — пересоздайте контейнер (данные в mounts сохранятся)
Обновление AdGuard Home
[admin@MikroTik] ># 1. Остановка /container/stop [/container/find where comment~"AdGuard"] # 2. Удаление контейнера (конфигурация сохранится в mounts) /container/remove [/container/find where comment~"AdGuard"] # 3. Пересоздание /container/add remote-image=adguard/adguardhome:latest interface=veth-adguard root-dir=usb1/adguard/root envlist=adguard-env mounts=adguard-work,adguard-conf start-on-boot=yes hostname=adguard logging=yes comment="AdGuard Home DNS filter" # 4. Ожидание и запуск /container/print /container/start 0
Все настройки (фильтры, клиенты, upstream DNS, логин/пароль) сохраняются в /opt/adguardhome/conf/AdGuardHome.yaml, который хранится в точке монтирования adguard-conf.
# Если container mode ещё не включён /system/device-mode/update container=yes # Нажмите кнопку reset на устройстве или перезагрузите CHR /container/config/set registry-url=https://registry-1.docker.io tmpdir=usb1/tmp ram-high=512M # Bridge (если ещё не создан) /interface/bridge/add name=bridge-containers comment="Container network" # IP-адрес шлюза /ip/address/add address=172.17.0.1/24 interface=bridge-containers comment="Container gateway" # veth с фиксированным IP /interface/veth/add name=veth-adguard address=172.17.0.3/24 gateway=172.17.0.1 comment="AdGuard Home container" # Добавляем в bridge /interface/bridge/port/add bridge=bridge-containers interface=veth-adguard # Masquerade для контейнерной подсети (если ещё не создано) /ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24 out-interface-list=WAN comment="Container NAT" # Создание директорий /file/mkdir usb1/adguard /file/mkdir usb1/adguard/work /file/mkdir usb1/adguard/conf # Точки монтирования /container/mounts/add name=adguard-work src=usb1/adguard/work dst=/opt/adguardhome/work /container/mounts/add name=adguard-conf src=usb1/adguard/conf dst=/opt/adguardhome/conf # Переменные окружения /container/envs/add name=adguard-env key=TZ value="Europe/Moscow" # Создание контейнера AdGuard Home /container/add remote-image=adguard/adguardhome:latest interface=veth-adguard root-dir=usb1/adguard/root envlist=adguard-env mounts=adguard-work,adguard-conf start-on-boot=yes hostname=adguard logging=yes comment="AdGuard Home DNS filter" # Проверяем статус /container/print /container/start 0 http://172.17.0.3:3000 http://172.17.0.3 # DNS-over-HTTPS https://dns.cloudflare.com/dns-query https://dns.google/dns-query # DNS-over-TLS tls://1dot1dot1dot1.cloudflare-dns.com tls://dns.google # DNS-over-QUIC (самый быстрый) quic://dns.adguard-dns.com 1.1.1.1 8.8.8.8 # MikroTik пересылает DNS-запросы в AdGuard Home /ip/dns/set servers=172.17.0.3 allow-remote-requests=yes cache-size=2048KiB # DHCP раздаёт IP маршрутизатора как DNS /ip/dhcp-server/network/set [find] dns-server=192.168.88.1 # DHCP раздаёт адрес AdGuard Home /ip/dhcp-server/network/set [find] dns-server=172.17.0.3 # Перехват всех DNS-запросов /ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.3 to-ports=53 protocol=udp dst-port=53 src-address=!172.17.0.3 dst-address=!172.17.0.3 comment="Force DNS through AdGuard Home" /ip/firewall/nat/add chain=dstnat action=dst-nat to-addresses=172.17.0.3 to-ports=53 protocol=tcp dst-port=53 src-address=!172.17.0.3 dst-address=!172.17.0.3 comment="Force DNS through AdGuard Home TCP" # REST API AdGuard Home GET http://172.17.0.3/control/stats GET http://172.17.0.3/control/status GET http://172.17.0.3/control/querylog # 1. Контейнер запущен /container/print # status: running # 2. AdGuard Home отвечает на DNS /tool/dns-query name=google.com server=172.17.0.3 # Должен вернуть IP-адрес # 3. Блокировка работает /tool/dns-query name=ads.doubleclick.net server=172.17.0.3 # Должен вернуть 0.0.0.0 или NXDOMAIN # 4. MikroTik DNS использует AdGuard Home /ip/dns/print # servers: 172.17.0.3 # 5. Пинг контейнера /ping 172.17.0.3 count=4 # 6. HTTP-доступ к веб-интерфейсу /tool/fetch url="http://172.17.0.3" mode=http dst-path=adguard-test.html # Вариант 1: Отключить MikroTik DNS (если все запросы через AdGuard) /ip/dns/set allow-remote-requests=no # Вариант 2: Изменить порт DNS MikroTik (RouterOS 7.15+) # В RouterOS нет прямой настройки порта DNS, но можно через firewall: /ip/firewall/filter/add chain=input action=drop protocol=udp dst-port=53 in-interface=bridge-containers comment="Block MikroTik DNS on container bridge" /ip/firewall/filter/add chain=input action=drop protocol=tcp dst-port=53 in-interface=bridge-containers comment="Block MikroTik DNS on container bridge TCP" # Проверяем статус контейнера /container/print # Подождите, пока status станет "running" # Проверяем сетевую связность /ping 172.17.0.3 count=4 # Если пинг не проходит — проверяем veth и bridge /interface/veth/print /interface/bridge/port/print where bridge=bridge-containers # Проверяем логи /log/print where topics~"container" # Проверяем потребление ресурсов /system/resource/print /ip/dns/set cache-size=4096KiB # Проверяем container mode /system/device-mode/print # Если container: no — включите заново # Проверяем сетевую конфигурацию /interface/veth/print /interface/bridge/port/print where bridge=bridge-containers /ip/address/print where interface=bridge-containers # Проверяем контейнер /container/print # Если status: error — пересоздайте контейнер (данные в mounts сохранятся) # 1. Остановка /container/stop [/container/find where comment~"AdGuard"] # 2. Удаление контейнера (конфигурация сохранится в mounts) /container/remove [/container/find where comment~"AdGuard"] # 3. Пересоздание /container/add remote-image=adguard/adguardhome:latest interface=veth-adguard root-dir=usb1/adguard/root envlist=adguard-env mounts=adguard-work,adguard-conf start-on-boot=yes hostname=adguard logging=yes comment="AdGuard Home DNS filter" # 4. Ожидание и запуск /container/print /container/start 0