Сеть · :53

AdGuard Home в Docker: блокировка рекламы для всей сети

DNS-фильтрация на уровне роутера вместо расширения в одном браузере — с честным разбором того, что произойдёт с интернетом дома, если контейнер упадёт.

Зачем блокировка на уровне DNS, а не в браузере

AdGuard Home блокирует рекламу и трекеры не в конкретном браузере на конкретном устройстве, а на уровне DNS-запросов для всей локальной сети сразу: умный телевизор, приложения на телефоне, консоль — всё, что делает DNS-запрос через ваш роутер, получает тот же эффект, что расширение в браузере даёт только вкладке Chrome. Работает это через простой принцип: домены из списков блокировки резолвятся в "пустой" ответ вместо реального IP рекламного сервера, и запрос за баннером никуда не уходит.

Почему нужен свой IP, а не bridge с проброшенным портом

В отличие от веб-сервисов вроде Vaultwarden, AdGuard Home — это DNS-сервер, которому важно видеть реальный IP клиента, а не адрес шлюза Docker: только так работает поклиентская статистика и разные правила фильтрации для разных устройств (например, отдельный, более строгий список блокировки для детского планшета). При обычном bridge-режиме все запросы приходят от внутреннего IP хоста Docker, и AdGuard просто не может их различить.

Решение то же, что и в статье про сетевой high-load: выделенный macvlan-адрес, на котором AdGuard живёт как самостоятельное устройство в сети, а не как процесс за NAT хоста.

⚠ проверьте порт 53 на самом DSM заранее
Если на NAS когда-либо включался пакет DNS Server из Package Center, порт 53 уже занят системной службой named. Отключите или удалите этот пакет до запуска AdGuard — иначе контейнер не сможет забиндиться на порт с ошибкой address already in use.

Что понадобится перед стартом

Шаг 1 — подготовка каталогов

ssh · admin@nas
mkdir -p /volume1/docker/adguard/{work,conf}

Каталог conf хранит AdGuardHome.yaml — единственный файл, в котором лежат все настройки, включая захэшированный пароль администратора и списки фильтров. Каталог work — статистика запросов и журнал блокировок.

Шаг 2 — docker-compose.yml

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 того же адреса.

мастер установки adguard home интерфейс dns-сервера 0.0.0.0 : 53 upstream dns-серверы tls://1.1.1.1 tls://9.9.9.9 bootstrap dns (только для upstream) 9.9.9.9, 1.1.1.1

В качестве upstream-серверов используйте DNS-over-TLS (адреса вида tls://1.1.1.1) вместо обычного незашифрованного DNS — иначе весь смысл приватности теряется на последнем шаге цепочки: ваш собственный AdGuard просто перекладывает нешифрованные запросы дальше вашему интернет-провайдеру.

Шаг 4 — переключаем сеть на AdGuard

В настройках DHCP роутера (не в самом AdGuard — встроенный DHCP-сервер AdGuard стоит включать только если вы полностью заменяете им DHCP роутера, что усложняет откат) замените DNS-сервер, который раздаётся клиентам, на адрес контейнера — 192.168.1.243.

⚠ единая точка отказа
С этого момента весь интернет в доме зависит от одного контейнера: если AdGuard упадёт, а резервный DNS не настроен, ни одно устройство не сможет резолвить домены — то есть выглядеть это будет как "интернет не работает" целиком, хотя сам канал в порядке. Пропишите в настройках DHCP вторичный DNS (например, публичный 1.1.1.1) как резервный — большинство операционных систем при недоступности первого DNS переключаются на второй автоматически.

Списки фильтров и собственные правила

По умолчанию 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.

⚠ порт 53 — не для интернета
Ни в коем случае не пробрасывайте порт 53/udp на роутере наружу в интернет. Открытый DNS-резолвер, доступный откуда угодно, — классический вектор для DNS amplification атак: чужой трафик начинает использовать ваш сервер как усилитель для DDoS третьих лиц, даже если ваша собственная сеть при этом не пострадает напрямую. Для доступа с телефона вне дома используйте VPN до домашней сети, а не открытый наружу DNS.

Бэкапы

adguard-backup.sh
#!/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 продолжит работать как ни в чём не бывало, просто со сброшенными графиками.

Безопасность

Частые проблемы

СимптомВероятная причина
Контейнер не стартует, «address already in use» на 53 портуна DSM всё ещё включён пакет DNS Server
Часть устройств не видит блокировку рекламыу них зашит собственный DNS (например, встроенный DoH в Chrome/Android) в обход роутера
После смены DNS на роутере старые устройства продолжают резолвить по-старомуу них не обновилась DHCP-аренда — помогает перезапуск сетевого адаптера устройства
Статистика показывает все запросы от одного IPконтейнер запущен в bridge вместо macvlan — реальные IP клиентов не видны
Сайт не открывается после включения нового списка блокировкинужное исключение не добавлено в пользовательские правила (@@||domain^)

После того как весь трафик DNS в доме проходит через AdGuard, upstream зашифрован, а резервный DNS на роутере подстрахует на случай падения контейнера — реклама пропадает не в одном браузере, а сразу во всех приложениях на всех устройствах в сети, включая те, где расширения ставить попросту некуда.