Google Public DNS тихо включили поддержку DNS over TLS

—

от автора

Внезапно, без предварительного анонса, на 8.8.8.8 заработал DNS over TLS. Ранее Google анонсировал только поддержку DNS over HTTPS.

Публичный резолвер от компании CloudFlare с IP-адресом 1.1.1.1 поддерживает DNS over TLS с момента запуска проекта.

Зачем это нужно

При использовании классической схемы DNS, провайдеры могут лезть своими грязными лапами в ваши DNS пакеты, просматривать какие домены вы запрашиваете и подменять ответы как угодно. Этим же занимаются мошенники, подменяя резолверы на взломанных роутерах, чтобы направить пользователя на поддельный сервер.
C DNS over TLS/HTTPS запросы посылаются внутри зашифрованного тоннеля. Так что провайдер не может подменить или просмотреть запрос.
А с приходом шифрования имени домена в X.509 сертификатах (ESNI) станут невозможны блокировки через DPI по SNI, которые сейчас применяются у некоторых крупных провайдеров.

Как это работает

На порт TCP:853 выполняется TLS подключение. При этом проверка сертификата резолвера проихсодит с использованием системных корневых сертификатов, точно так же как HTTPS в браузере. Это избавляет от необходимости добавлять какие-либо ключи вручную. Внутри тоннеля выполняется обычный DNS запрос. Это создает меньше накладных расходов по сравнению с DNS over HTTPS, который имеет собственный формат запросов и ответов.

К сожалению, на текущий момент только в Android 9 (Pie) поддержка DNS over TLS встроена в системный резолвер. Инструкция по настройке для Android 9.

Для остальных систем, пока предлагается использовать сторонний демон, а системный резолвер направлять на localhost (127.0.0.1).

Настройка на macOS

Разберем настройку DNS over TLS на последней версии macOS на примере резолвера knot

Установка

brew install knot-resolver

По умолчанию knot будет работать как обычный рекурсивный резолвер, подобно dnsmasq.

Редактируем конфиг

nano /usr/local/etc/kresd/config

И добавляем в конец файла:

 policy.add(         policy.all(                 policy.TLS_FORWARD({                         {'8.8.8.8', hostname='1.1.1.1'},                         {'8.8.4.4', hostname='8.8.4.4'}                 }))) 

В итоге мой конфиг выглядит так:

Раскрыть спойлер

-- Config file example useable for personal resolver. -- The goal is to have a validating resolver with tiny memory footprint, -- while actively tracking and refreshing frequent records to lower user latency. -- Refer to manual: https://knot-resolver.readthedocs.io/en/latest/daemon.html#configuration  -- Listen on localhost (default) -- net = { '127.0.0.1', '::1' }  -- Drop root privileges -- user('knot-resolver', 'knot-resolver')  -- Auto-maintain root TA trust_anchors.file = 'root.keys'  -- Load Useful modules modules = {         'policy',   -- Block queries to local zones/bad sites         'hints',    -- Load /etc/hosts and allow custom root hints         'stats',    -- Track internal statistics         'predict',  -- Prefetch expiring/frequent records }  -- Smaller cache size cache.size = 10 * MB  policy.add(         policy.all(                 policy.TLS_FORWARD({                         {'8.8.8.8', hostname='1.1.1.1'},                         {'8.8.4.4', hostname='8.8.4.4'}                 }))) 

Подробнее про hostname и проверку подлинности TLS сертификата

Параметр hostname в данном случае это Common Name (CN) или Subject Alt Name (SAN) сертификата. То есть доменное имя для которого выпущен сертификат. По нему проверяется подлинность сертификата сервера.

Вот какие значения SAN у сертификата который используется при подключении на 8.8.8.8:853

dns.google 8888.google 8.8.4.4 8.8.8.8  2001:4860:4860:0:0:0:0:64  2001:4860:4860:0:0:0:0:6464 2001:4860:4860:0:0:0:0:8844 2001:4860:4860:0:0:0:0:8888 

Любое из этих значений можно использовать в качестве параметра hostname. Если же вы будете разворачивать собственный публичный рекурсивный резолвер, у вас вряд ли получится выпустить x509 сертификат на IP-адрес, поэтому в параметре hostname придется указывать доменное имя.

Запуск демона

sudo brew services start knot-resolver

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

sudo lsof -i -P -n | grep kresd

процесс kresd должен слушать порт 53 на localhost.

Если что-то пошло не так, смотрим лог ошибок:

cat  /usr/local/var/log/kresd.log

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

dig @127.0.0.1 habr.com

Проверяем, что локальный резолвер отвечает корректно.

Установка в качестве системного резолвера

Если все работает правильно, можно назначить системный резолвер в свойствах сетевого адаптера:


ссылка на оригинал статьи https://habr.com/post/427639/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *