AdGuard Home в Docker + DoT

NoAdO

New Member
Всем доброго дня!

Задача:
Обрабатывать DNS запросы с устройств локальной сети с фильтрацией рекламы и трекеров
Обрабатывать DNS запросы с Android-смартфонов в глобальной сети с той же целью

Что сейчас:
Конфиг машины: Есть домен, белый IP, роутер и линукс-сервер под роутером с ограниченным контролем операционки. На линукс-сервере стоит Docker на котором и развёрнут AdGuard Home v0.106.3. Собственно причина наличия докера именно в том что я хотел бы не вмешиваться в систему, вмешательство в которую пользователя не предполагается вообще. Менеджер пакетов сервера про пакет Adguard Home не в курсе а ОС содержит ряд особенностей на которые накладывается моё не особо хорошее знание линукс.

Базовый функционал: Благодаря macvlan докер контейнер находится на отдельном IP хотя как я понял это несколько нестандартное применение докера. Возможно это лишнее, но на хосте порты 80 и 443 заняты другими сервисами. UI успешно доступен по этому IP с другого устройства в локальной сети. Сам инстанс работает корректно, обрабатывает запросы, собирает статистику. Работоспособность DNS сервера без шифрования проверялась как на локальных ПК так и на ПК соединенном через глобальную сеть - тут тоже ОК.

Шифрование: У меня есть ключевая пара (сертификат и закрытый ключ), сертификат выпущен Let's Encrypt, не включает поддомены. При импорте через интерфейс для теста я получаю ошибку "Цепочка сертификатов не валидна" и "Your certificate does not verify: x509: certificate signed by unknown authority" хотя UI принимает сертификат с ключом. Издатель: CN=R3,O=Let's Encrypt,C=US. Сертификат валиден при проверке сервисов хоста. Сертификат валиден, если пробросить порты 80 и 443 на контейнер. То есть предполагается что невалидным его считает только докер-контейнер. Роутер в целом в защиту DNS умеет, но этот функционал не включен т.е. я предполагаю что этот траффик не перехватывается и роутером не обрабатывается.

Проброс портов и что не работает: Порт 853 насколько я понял используется при DNS over TLS так что он проброшен роутер->IP контейнера. Таким же образом проброшен и работающий порт 53. Порты 80 и 443 при этом указывают, напомню, на другой хост. Портчекер сообщает что порт открыт, телнет устанавливает связь. Андроид смартфон при настройке которая кажется корректной сообщает "ошибка подключения" и ломает DNS. Идентичная ошибка будет если указать существующий но заведомо безДНСный хост или несуществующий хост. Если в качестве хоста установить что-то из публичных DoT то всё работает. Поле нельзя заполнять с указанием протокола, директорий или порта - только домен или поддомены.

Вопросы:
1. Почему UI считает корень промежуточный недоверенным если корень есть и как можно это исправить в условиях докер-контейнера?
2. Почему Android смартфон пишет на мой адрес "ошибка соединения" и как вообще диагностировать правильно ли работает DoT сервер?
3. Где в UI можно посмотреть попытки достучаться на сервер через DoT?

Upd1. Если зайти в контейнер с sh, в /etc/ssl/certs корневой сертификат от моего домееного сертификата в папке есть. Если же пытаться выполнить импорт экспортированного в винде в base64 корня получаю ошибку WARNING: Skipping duplicate certificate in file ca-cert-x3.cer.pem (при этом имя файла не такое а x3.cer) т.е. и импорт проведён не будет потому что дубль. То есть корень есть, но мой серт невалиден всё равно.
 
Last edited:

NoAdO

New Member
Нашёл решение проблемы, тему можно закрывать.
1. Порт 443 для работы не нужен если задача как у меня стоит работать с виндой в локальной сети и андроид - в глобальной. На контейнер провешены 53 и 853 и этого достаточно.
2. В качестве сертификата нужно указать ВСЕ сертификаты цепочки. Можно склеить всё в один файл или вставить из файлов сертификата и цепочки если у вас как и у меня цепочка отдельно. Если указать все, интерфейс пишет "цепочка валидна" и тогда оно заработает.
3. Первичная смена статуса в Андроид-смартфоне проходит достаточно долго, до 5 секунд. При этом первичный статус выставляется сразу "Ошибка подключения" что, конечно, вводит в заблуждение.

На Synology DSM 7.0 всё работает, делал так:
Code:
sudo docker network create -d macvlan \
  --subnet=192.168.0.0/24 \
  --gateway=192.168.0.1 \
  --ip-range=192.168.0.192/28 \
  -o parent=ovs_eth0 \
  my_macvlan
где 192.168.0.0 это локальная сеть хоста, 192.168.0.1 шлюз, 192.168.0.192/28 пул из кучки айпиадресов для всей подсети в котором будем работать, ovs_eth0 - основная сеть хоста к которой будем подсасываться.

Контейнер запускается так:
Code:
sudo docker run \
    --name adguardhome \
    -d \
    -e TZ=Europe/Moscow \
    --restart unless-stopped \
    --network my_macvlan \
    --ip 192.168.0.199 \
    -v /volume1/docker/adguardhome/work:/opt/adguardhome/work \
    -v /volume1/docker/adguardhome/conf:/opt/adguardhome/conf \
    -p 53:53/tcp -p 53:53/udp \
    -p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp \
    -p 853:853/tcp \
    -p 5443:5443/tcp -p 5443:5443/udp \
    adguard/adguardhome
где:
name adguardhome - имя
network my_macvlan - указание на сеть
192.168.0.199 -статический айпи
-v - рабочие директории которые сохранятся при пересоздании контейнера
-p - открытие портов, 53 DNS, 80 http, 443 https, 3000 первичная настройка, 853 DoT, 5443 не помню, что-то из инструкции

Ещё предстоит решить как оперативно подсовывать файлы сертификатов которые получает сам DSM в LetsEncrypt но решение рабочее!
 

NoAdO

New Member
Новый вопрос: контейнер регулярно начинает "тупить" и не отвечать на запросы через интернет по DoT. Ну, как минимум мобилньый телефон пишет об ошибке подключения. Рестарт контейнера решает проблему, но делать эту операцию находясь не дома не особо то удобно.
 
Top