
Настройка DNS over HTTPS (DoH) на OpenWrt
Приветствую!
В этой короткой инструкции расскажу, как на роутере под управлением OpenWrt настроить разрешение имен (DNS) по зашифрованному протоколу HTTPS, он же DNS over HTTPS (DoH).
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике — заглядывайте в Вороний чат @r4ven_me_chat🧐. |
Использование данной технологии позволяет повысить уровень конфиденциальности, а также защититься от «подмены» ответов снижая риск атак типа DNS spoofing.
Предисловие
DNS over HTTPS (DoH) — как понятно из названия, это технология, при которой DNS-запросы (для получения IP-адреса по доменному имени) передаются через зашифрованный HTTPS-протокол вместо обычного незашифрованного DNS.
В прошивке OpenWrt работа DoH реализуется с помощью специального сервиса-прокси — https-dns-proxy
. Принцип работы прост: DNS запросы от клиентов как обычно принимает локальный DNS сервер роутера — dnsmasq
, после чего они перенаправляются в https-dns-proxy
, который шифрует их и уже далее передает на внешний сервер с поддержкой DoH, например Google.
Ниже представлена упрощенная визуальная схема работы DoH в OpenWrt:
При настройке DoH на роутере все подключённые устройства автоматически начинают использовать его, за исключением случаев, когда на самих устройствах явно указаны собственные настройки DNS.
Перед началом любой работы с OpenWrt необходимо сделать резервную копию текущей конфигурации роутера и знать, как из нее восстановиться: (инструкция под спойлером):
Как и множество других операций, бэкап в OpenWrt можно сделать двумя способами: с помощью консоли (SSH)🖥️ и веб интерфейса (LUCI)🌐.
Очевидно, что хранить бэкапы нужно не на самом роутере. Ниже представлена команда бэкапа конфига OpenWrt с помощью консоли:
☝️Подключение к консоли роутера по SSH выполняется под учетной записью root и паролем, с которым вы подключаетесь к Web GUI.
ssh root@openwrt.lan 'sysupgrade --create-backup -' | cat > ./backup.tar.gz
💡Данная команда с помощью
sysupgrade
создает архивtar
и передает его содержимое через механизм перенапрвления потоков локальной командеcat
, которая в свою очередь сохраняет полученный вывод в файл с именем./backup.tar.gz
в текущей директории на вашем компьютере.
Восстановление из бэкапа рекомендуется выполнять с последующим перезапуском роутера.
В случае такой необходимости выполните команды:
cat ./backup.tar.gz | ssh root@openwrt.lan 'sysupgrade --restore-backup -'
ssh root@openwrt.lan reboot
💡Тут аналогичным образом команда
cat
передает содержимое архиваbackup.tar.gz
на ввод удаленной командеsysupgrade
, которая выполняет восстановление конфигурации.
Также удобно делать и восстанавливать бэкап через графический интерфейс роутера. Раздел: System — Backup / FLash firmware — [Generate archive | Upload archive]
Хорошо, с бэкапом и восстановлением разобрались. Приступаем к внесению изменений в конфигурацию.
Настройка DoH в консоли
Подключаемся к роутеру по SSH:
ssh root@openwrt.lan
Устанавливаем прокси:
opkg update
opkg install https-dns-proxy
После установки сервис готов и уже работает. Проверяем:
netstat -uln
pgrep -af https-dns-proxy
Вывод должен быть примерно такой:
udp 0 0 127.0.0.1:53 0.0.0.0:*
udp 0 0 127.0.0.1:5053 0.0.0.0:*
6542 /usr/sbin/https-dns-proxy -r https://dns.google/dns-query -a 127.0.0.1 -p 5053 -b 8.8.8.8,8.8.4.4 -4 -u nobody -g nogroup
💡Конфиг прокси хранится по пути
/etc/config/https-dns-proxy
.
Из коробки https-dns-proxy
уже настроен на использование DNS серверов Cloudflare и Google.
Ниже покажу, как изменить дефолтные настройки на свои, возможно у вас есть свой локальный DNS сервер с поддержкой DoH. Но сперва вам необходимо определиться с DNS провайдерами. В своём примере я буду использовать адрес гугла.
Список публичных можете посмотреть на википедии: DoH provider.
Очищаем текущую конфигурацию сервиса https-dns-proxy
:
while uci -q delete https-dns-proxy.@https-dns-proxy[0]; do :; done
И заново наполняем своими значениями:
uci set https-dns-proxy.dns="https-dns-proxy"
uci set https-dns-proxy.dns.bootstrap_dns="8.8.8.8,8.8.4.4"
uci set https-dns-proxy.dns.resolver_url="https://dns.google/dns-query"
uci set https-dns-proxy.dns.listen_addr="127.0.0.1"
uci set https-dns-proxy.dns.listen_port="5053"
uci set https-dns-proxy.dns.user="nobody"
uci set https-dns-proxy.dns.group="nogroup"
Сохраняем изменения и перезапускаем прокси:
uci commit https-dns-proxy
service https-dns-proxy restart
Готово. Можете переходить к пункту проверки работы DoH.
Настройка DoH в веб интерфейсе
Установить и настроить DoH в OpenWrt можно и с помощью веб GUI.
Переходим по адресу роутера в браузере, чаще всего это 192.168.1.1
.
Далее идём в раздел System — Software
и устанавливаем пакет luci-app-https-dns-proxy
:
Сервис имеет рабочие настройки из коробки. При необходимости их изменения переходим в раздел Services — HTTPS DNS Proxy
и настраиваем его в соответствии со своими предпочтениями:
После чего не забудьте сохранить и применить изменения.
Проверки работы DNS over HTTPS
На роутере устанавливаем утилиту tcpdump
:
opkg install tcpdump
Запускаем с ее помощью прослушивание трафика, например, для хоста 8.8.8.8
и HTTPS порта 443
:
tcpdump -i any host 8.8.8.8 and port 443
Параллельно в терминале клиента, подключенного к роутеру, например Linux, резолвим любой домен:
nslookup r4ven.me
В выводе tcpdump
на роутере вы должны увидеть подобное:
15:47:32.414726 eth0 Out IP 12.34.56.78.58458 > dns.google.443: Flags [P.], seq 452:562, ack 1107, win 1002, options [nop,nop,TS val 2274319017 ecr 2648832844], length 110
15:47:32.456023 wan In IP dns.google.443 > 12.34.56.78.58458: Flags [P.], seq 1312:1350, ack 562, win 1050, options [nop,nop,TS val 2648832889 ecr 2274319017], length 38
Ну и т.к. передача данных шифруется с помощью HTTPS сами DNS запросы/ответы в выводе вы не увидите, в отличие от обычного DNS.
В используемых источниках в конце статьи есть ссылки на онлайн ресурсы для публичной проверки работы вашего DNS.
