AdGuard Home в Docker: блокировка рекламы для всей сети
DNS-фильтрация на уровне роутера вместо расширения в одном браузере — с честным разбором того, что произойдёт с интернетом дома, если контейнер упадёт.
- Зачем блокировка на уровне DNS, а не в браузере
- Почему нужен свой IP, а не bridge с проброшенным портом
- Что понадобится перед стартом
- Шаг 1 — подготовка каталогов
- Шаг 2 — docker-compose.yml
- Шаг 3 — мастер первичной настройки
- Шаг 4 — переключаем сеть на AdGuard
- Списки фильтров и собственные правила
- HTTPS для веб-панели — и что нельзя выставлять наружу
- Бэкапы
- Безопасность
- Частые проблемы
Зачем блокировка на уровне DNS, а не в браузере
AdGuard Home блокирует рекламу и трекеры не в конкретном браузере на конкретном устройстве, а на уровне DNS-запросов для всей локальной сети сразу: умный телевизор, приложения на телефоне, консоль — всё, что делает DNS-запрос через ваш роутер, получает тот же эффект, что расширение в браузере даёт только вкладке Chrome. Работает это через простой принцип: домены из списков блокировки резолвятся в "пустой" ответ вместо реального IP рекламного сервера, и запрос за баннером никуда не уходит.
Почему нужен свой IP, а не bridge с проброшенным портом
В отличие от веб-сервисов вроде Vaultwarden, AdGuard Home — это DNS-сервер, которому важно видеть реальный IP клиента, а не адрес шлюза Docker: только так работает поклиентская статистика и разные правила фильтрации для разных устройств (например, отдельный, более строгий список блокировки для детского планшета). При обычном bridge-режиме все запросы приходят от внутреннего IP хоста Docker, и AdGuard просто не может их различить.
Решение то же, что и в статье про сетевой high-load: выделенный macvlan-адрес, на котором AdGuard живёт как самостоятельное устройство в сети, а не как процесс за NAT хоста.
address already in use.
Что понадобится перед стартом
- Уже настроенная macvlan-сеть с зарезервированным диапазоном IP (см. статью про сетевой high-load).
- Доступ к настройкам DHCP на роутере — придётся сменить DNS-сервер, который роутер раздаёт клиентам.
- Понимание, что при падении контейнера AdGuard интернет для всей сети остановится, если не настроен резервный DNS (шаг 4).
Шаг 1 — подготовка каталогов
mkdir -p /volume1/docker/adguard/{work,conf}
Каталог conf хранит AdGuardHome.yaml — единственный файл, в котором лежат все настройки, включая захэшированный пароль администратора и списки фильтров. Каталог work — статистика запросов и журнал блокировок.
Шаг 2 — docker-compose.yml
services:
adguardhome:
image: adguard/adguardhome:latest
container_name: adguardhome
restart: unless-stopped
networks:
macvlan_lan:
ipv4_address: 192.168.1.243
volumes:
- /volume1/docker/adguard/work:/opt/adguardhome/work
- /volume1/docker/adguard/conf:/opt/adguardhome/conf
mem_limit: 256m
networks:
macvlan_lan:
external: true
Порты здесь не пробрасываются вообще — при macvlan-адресе контейнер слушает 53/udp, 53/tcp и веб-интерфейс напрямую на своём собственном IP, без секции ports. Это ещё одно отличие от привычной схемы bridge-сервисов на этом сайте.
Шаг 3 — мастер первичной настройки
После запуска откройте http://192.168.1.243:3000 — это временный порт мастера установки, который работает только до завершения первичной настройки. После неё веб-интерфейс переезжает на порт 80 того же адреса.
В качестве upstream-серверов используйте DNS-over-TLS (адреса вида tls://1.1.1.1) вместо обычного незашифрованного DNS — иначе весь смысл приватности теряется на последнем шаге цепочки: ваш собственный AdGuard просто перекладывает нешифрованные запросы дальше вашему интернет-провайдеру.
Шаг 4 — переключаем сеть на AdGuard
В настройках DHCP роутера (не в самом AdGuard — встроенный DHCP-сервер AdGuard стоит включать только если вы полностью заменяете им DHCP роутера, что усложняет откат) замените DNS-сервер, который раздаётся клиентам, на адрес контейнера — 192.168.1.243.
Списки фильтров и собственные правила
По умолчанию AdGuard Home включает базовый список (AdGuard DNS filter). Стоит добавить ещё несколько бесплатных списков через Фильтры → Списки блокировки → Добавить:
| Список | Что закрывает |
|---|---|
| OISD Big | широкий агрегированный список рекламы и трекеров |
| AdGuard DNS filter | базовая блокировка, включена по умолчанию |
| Список фишинговых доменов (например, от Phishing Army) | защита от известных фишинговых доменов на уровне DNS |
Для точечных исключений (сайт, который сломался из-за блокировки одного из доменов) используйте вкладку Пользовательские правила с синтаксисом, похожим на uBlock Origin: строка вида @@||example.com^ разрешает домен вопреки спискам блокировки.
HTTPS для веб-панели — и что нельзя выставлять наружу
Веб-интерфейс администратора можно закрыть HTTPS через Nginx Proxy Manager точно так же, как и остальные сервисы — прокси нацеливается на 192.168.1.243:80.
Бэкапы
#!/bin/bash STAMP=$(date +%Y%m%d-%H%M) DEST=/volume1/docker/adguard/backups mkdir -p "$DEST" tar -czf "$DEST/adguard-$STAMP.tar.gz" -C /volume1/docker/adguard conf find "$DEST" -name "adguard-*.tar.gz" -mtime +14 -delete
Каталог work со статистикой в бэкап можно не включать — это исторические данные для дашборда, без них AdGuard продолжит работать как ни в чём не бывало, просто со сброшенными графиками.
Безопасность
- Смените логин и пароль администратора сразу в мастере установки — панель управления DNS для всей сети не место для дефолтных значений.
- DNS-over-HTTPS/TLS на upstream — уже включено в шаге 3, но стоит перепроверить после любого сброса настроек.
- Не открывайте порт 53 наружу — отдельно вынесено выше, но это самая частая и самая опасная ошибка в этом гайде.
- Отдельные клиенты с собственными настройками — для гостевой сети или IoT-устройств можно задать более строгий список блокировки прямо в разделе Clients, не трогая правила для остальной сети.
Частые проблемы
| Симптом | Вероятная причина |
|---|---|
| Контейнер не стартует, «address already in use» на 53 порту | на DSM всё ещё включён пакет DNS Server |
| Часть устройств не видит блокировку рекламы | у них зашит собственный DNS (например, встроенный DoH в Chrome/Android) в обход роутера |
| После смены DNS на роутере старые устройства продолжают резолвить по-старому | у них не обновилась DHCP-аренда — помогает перезапуск сетевого адаптера устройства |
| Статистика показывает все запросы от одного IP | контейнер запущен в bridge вместо macvlan — реальные IP клиентов не видны |
| Сайт не открывается после включения нового списка блокировки | нужное исключение не добавлено в пользовательские правила (@@||domain^) |
После того как весь трафик DNS в доме проходит через AdGuard, upstream зашифрован, а резервный DNS на роутере подстрахует на случай падения контейнера — реклама пропадает не в одном браузере, а сразу во всех приложениях на всех устройствах в сети, включая те, где расширения ставить попросту некуда.