Вот появилась такая необходимость - нужен DoH в локальной сети. Накидаю туту несколько скриптов/файлов, который самому потом нужно будет “только скопировать”.

Предыстория

Так уж случилось, что не все dns серверы умеют в DoH из коробки. В моей локальной сети я решил поднять Pi-hole, а он как-раз сам в DoH не умеет. Локальный же провайдер любит у меня заниматься DNS hijacking-ом.

Можно конечно завернуть весь свой dns трафик по порту скажем в vpn, или настроить отправку через vpn всех запросов на ip выбранных dns-провайдеров. Это решит проблему с подменой, но тут возникает небольшое неудобство: иногда (хоть и редко 🙃) хочется глянуть: подменен ли конкретный адрес у провайдера. И тут приходится думать над временными правилами в файрволе для себя, или отключением отправки всего dns трафика в vpn на время. Это немного не удобно. Да и не все сети (гостевая например) могут быть направлены в свой личный VPN.

Ну а уж глянуть разницу в DNS провайдера и своего DNS, тут вообще без вариантов.

1
2
3
4
5
6
❯ diff <(dig @isp.home rutracker.org +short) <(dig rutracker.org +short)
1c1,2
< 188.186.146.207
---
> 104.21.72.173
> 172.67.187.38

И сразу видно - работает ли DoH и что придумал провайдер. Так что решено - далем DoH proxy-dns на ресолвере в сети. Делать будем на примере Cloudflared proxy-dns. Есть варианты с Unbound, BIND, PowerDNS, но так уж “исторически сложилось”.

Исходные состояние

Исходно у нас есть SBC с установленной Armbian 23.02. На него накачен Pi-hole. Это процесс мы пропустим на данный момент. Сам по себе Pi-hole не умеет отправлять и обрабатывать запросы по DoH, ему нужно помочь.

Cloudflared

У приложения Cloudflared есть свой репозиторий на гитхабе: https://github.com/cloudflare/cloudflared. Можно скачать оттуда и обновлять руками время от времени, но перейдя по нескольким ссылкам мы находим репозиторий, с инструкцией для нашего дистрибьютива (построен то он поверх Ubuntu Jammy).

Установка

Подготавливаем место для ключа-подписи репозитория:

1
sudo mkdir -p --mode=0755 /usr/share/keyrings

Скачиваем ключ:

1
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

Добавляем репозиторий:

1
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

Теперь приложение Cloudflared доступно в виде пакета, которое будет обновляться централизованно через менеджер пакетов. Ставим приложение:

1
sudo apt update && sudo apt install cloudflared

Проверить что приложение установлено можно командой:

1
cloudflared -v

Готовим конфигурацию

Создадим папку с настройками:

1
mkdir -p --mode=0755 /etc/cloudflared

Внутри папки создадим файл proxy-dns с параметрами запуска нашего proxy-dns:

1
2
# Commandline args for cloudflared, using Cloudflare DNS
CLOUDFLARED_DNS_OPTS=--port 5353 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query

Так же можно добавить параметр --address с указанием интерфейса, на котором будет доступен proxy-dns.

В апстримах указываем ссылки для DoH понравившихся нам провайдеров, вот список для примера: https://dnsprivacy.org/public_resolvers/#dns-over-https-doh.

Настраиваем запуск в виде сервиса

Первым делом создадим отдельного пользователя без возможности залогиниться в систему (но можно и от root запустить 🙃):

1
sudo useradd -s /usr/sbin/nologin -r -M cloudflared

Теперь создадим systemd unit (--force ключ нужен для создания нового файла):

1
sudo systemctl edit --force --full cloudflared-proxy-dns.service

И заполнит файл следующим содержимым:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target

[Service]
Type=simple
User=cloudflared
EnvironmentFile=/etc/cloudflared/proxy-dns
ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_DNS_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Далее включаем автозапуск сервиса при старте системы (--now запустит сервис сразу):

1
systemctl enable --now cloudflared-proxy-dns.service

Проверка работы

Проверить что сервис “жив” можно командой dig (порт 5353 был указан в конфигурационном файле /etc/cloudflared/proxy-dns, адрес по умолчанию 127.0.0.1):

1
dig @127.0.0.1 -p 5353 rutracker.org

Финал

В итоге у нас получается DoH прокси для работы в локальной сети (на локальном компьютере). Теперь на него можно " натравить" Pi-hole и радоваться жизни.