DNS over HTTPS — это безопасный DNS. Потому что в этом случае весь трафик DNS шифруется и скрывается в обширном потоке HTTPS трафика. С DNS over HTTPS повышается безопасность и конфиденциальность пользователя в сети интернет. Давайте настроим себе безопасный DNS в Linux (Debian) и Windows.
Введение
DNS
DNS (Domain Name System) преобразовывает доменные имена ресурсов сети интернет в соответствующие IP адреса. Запросы и ответы DNS отправляются открытым текстом. Вот, например, как легко с помощью обычного сетевого анализатора прочитать доменное имя (adminkin.pro) в запросе DNS и в ответе DNS:

Утечка DNS
Утечка DNS (DNS leak) — это ситуация, когда отправляются запросы DNS через незащищенные каналы, раскрывая информацию о посещаемых пользователем веб-сайтах и доменных именах. В этой ситуации третьи лица, такие как интернет-провайдеры или злоумышленники, могут получить доступ к онлайн-активности пользователя. Это нарушает приватность и безопасность пользователя в интернете.
DNS over HTTPS (DoH)
DNS over HTTPS (DoH) — это протокол для шифрования трафика DNS, чтобы третьи лица не могли интерпретировать пересылаемые данные. DoH использует порт 443, который используется и для всего остального трафика HTTPS (web трафика).
Dnscrypt-proxy
Dnscrypt-proxy — это кроссплатформенный DNS-прокси. Повышает безопасность и конфиденциальность, обмениваясь данными с вышестоящими удаленными DNS-серверами по защищенными каналам. Поддерживает, среди прочих, протокол шифрования DNS over HTTPS с использованием TLS 1.3. Ускоряет работу за счет кэширования ответов DNS. Подробнее смотрите в документации разработчиков dnscrypt-proxy на GitHub https://github.com/DNSCrypt/dnscrypt-proxy/wiki.
DNS over HTTPS в Windows
Установка dnscrypt-proxy
Скачиваем dnscrypt-proxy c GitHub разработчиков: https://github.com/DNSCrypt/dnscrypt-proxy/releases. Ищем файл вида dnscrypt-proxy-win64-*.zip, скачиваем его и распаковываем.
Запускаем Командную строку Windows от имени администратора:

Переходим в директорию, в которую распаковали dnscrypt-proxy. В моем случае это будет команда:
cd c:\dnscrypt-proxy\win64\
Создаем конфигурационный файл dnscrypt-proxy.toml:
copy example-dnscrypt-proxy.toml dnscrypt-proxy.toml
Запускаем dnscrypt-proxy:
.\dnscrypt-proxy.exe

Dnscrypt-proxy запускается на IP адресе 127.0.0.1, на порту 53 и готовится получать запросы как по протоколу TCP, так и UDP. Сортируются по задержке ответа DNS-резолверы (см. рисунок выше).
Все! Dnscrypt-proxy готов к работе:

Проверим, как выполнится запрос на разрешение доменного имени adminkin.pro на IP адрес. Для этого запускаем еще одну командную строку Windows (запуск от имени администратора не требуется), переходим в директорию dnscrypt-proxy и вводим команду:
.\dnscrypt-proxy.exe -resolve adminkin.pro
Доменное имя adminkin.pro разрешилось с помощью сервиса на 127.0.0.1:53, т.е. с помощью dnscrypt-proxy. IP адрес запрашиваемого домена успешно получен (77.222.56.16). Разрешение DNS работает!

Настройка DNS over HTTPS
Чтобы пустить весь трафик DNS: от браузеров, web приложений, от самой ОС Windows через dnscrypt-proxy, изменим DNS настройку сетевого подключения, через которое выходим в интернет. Укажем в качестве IP адреса DNS-сервера — 127.0.0.1 (IP адрес dnscrypt-proxy).
В моем случае сетевое подключение, через которое выход в интернет, — это Беспроводная сеть. Выбираю Свойства:

В окне Свойства кликаю мышью по IP версии 4 (TCP/IPv4), нажимаю кнопку Свойства, далее выбираю Использовать следующие адреса DNS-серверов и ввожу 127.0.0.1:

Проверяем, как работает просмотр веб-страниц, загрузка файлов, веб-приложения, мессенджеры — все, что может использовать DNS.
Зарегистрируем dnscrypt-proxy как системную службу Windows. Системна служба Windows запускается при загрузке операционной системы и работает в фоновом режиме.
В окне командной строки, запущенной от имени администратора, нажимаем комбинацию клавиш Ctrl + C, чтобы остановить dnscrypt-proxy.
Чтобы зарегистрировать dnscrypt-proxy как системную службу Windows, в окне командной строки, запущенной от имени администратора, набираем команду:
.\dnscrypt-proxy.exe -service install

Чтобы стартовать dnscrypt-proxy, набираем команду:
.\dnscrypt-proxy.exe -service start
Остановить dnscrypt-proxy:
.\dnscrypt-proxy.exe -service stop
Перезапустить dnscrypt-proxy, например, после изменения конфигурационного файла:
.\dnscrypt-proxy.exe -service restart
Отменить регистрацию dnscrypt-proxy в качестве системной службы Windows:
.\dnscrypt-proxy.exe -service uninstall
Чтобы проверить, работает ли разрешение DNS:
.\dnscrypt-proxy.exe -resolve example.com
Внесем минимальные правки в конфигурационный файл dnscrypt-proxy.toml. Для этого откроем этот конфигурационный файл как текстовый файл в любом текстовом редакторе Windows.
Чтобы использовать только DNS резолверы, реализующие протокол DNS over HTTPS, отключаем использование DNS резолверов, реализующих протокол DNSCrypt:
dnscrypt_servers = false
Проверить, если ли у вас подключение к IPv6, можно на сайте https://test-ipv6.com/. Даже если у вас нет подключения к IPv6, обязательно будут приложения, отправляющие DNS запросы для разрешения IPv6 адресов. Dnscrypt-proxy можно настроить на немедленный ответ: «нет IPv6 адресов», вместо отправки запроса на вышестоящий DNS резолвер и ожидания бесполезного ответа. Настройка немедленного ответа:
block_ipv6 = true
Сохраняем конфигурационный файл, перезапускаем dnscrypt-proxy.
Проверка работоспособности DNS over HTTPS
Сначала очистим кэш DNS. Запускаем командную строку от имени администратора и вводим команду:
ipconfig /flushdns
Кэш DNS очищен.
Чтобы проверить, что весь DNS трафик проходит через dnscrypt-proxy, остановим dnscrypt-proxy. И убедимся, что приложения, включая веб-браузеры, больше не могут разрешать DNS имена. Это и может означать, что весь DNS трафик проходил через dnscrypt-proxy.
Чтобы проверить работоспособность DNS over HTTPS, запустим захват трафика с помощью сетевого анализатора, например, с помощью Wireshark. И применим фильтр, чтобы нам отображались только захваченные DNS пакеты. Выждем время и убедимся в отсутствии DNS пакетов, т.е. в отсутствии исходящего незашифрованного трафика.
Вот захвачено 243 400 пакетов, а из них незашифрованных DNS пакетов — 0.

DNS over HTTPS в Linux (Debian)
Установка dnscrypt-proxy
Скачиваем dnscrypt-proxy самой свежей версии c GitHub разработчиков: https://github.com/DNSCrypt/dnscrypt-proxy/releases. Ищем файл вида dnscrypt-proxy-linux_x86_64-*.tar.gz, скачиваем его и распаковываем, например, в директорию /opt/dnscrypt-proxy/ (на момент написания статьи самая свежая версия dnscrypt-proxy была 2.1.4):
wget https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/2.1.4/dnscrypt-proxy-linux_x86_64-2.1.4.tar.gz
mkdir -p /opt/dnscrypt-proxy/ && tar -C /opt/dnscrypt-proxy -xvzf dnscrypt-proxy-linux_x86_64-2.1.4.tar.gz
Переходим в директорию, в которую распаковали dnscrypt-proxy. В моем случае это будет команда:
cd /opt/dnscrypt-proxy/linux-x86_64/
Создаем конфигурационный файл dnscrypt-proxy.toml:
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
Проверяем, не слушает ли какой сервис нужный нам порт 53:
ss -lp 'sport = :domain'
ss
— это утилита для вывода информации о сетевых сокетах.
-lp
— флаг вывода подробной информации.
'sport = :domain'
— это фильтр, который указывает на поиск сокетов с определенным исходящим портом. В нашем случае — это порт domain (порт 53), который обычно используется для DNS (Domain Name System).
Если порт 53 незанят, то вывод команды будет следующий:

Если порт 53 занят, то сервис, занявший его, нужно останавливать и убирать из автозагрузки. В случае, если порт 53 занял systemd-resolved, то команды будет следующие:
systemctl stop systemd-resolved
systemctl disable systemd-resolved
Запускаем dnscrypt-proxy:
./dnscrypt-proxy

Dnscrypt-proxy запускается на IP адресе 127.0.0.1, на порту 53 и готовится получать запросы как по протоколу TCP, так и UDP (см. рисунок выше). Загружается список DNS резолверов с поддержкой шифрования, тестируется их доступность и скорость отклика.
Dnscrypt-proxy готов к работе:

Настройка DNS over HTTPS
Открываем новое окно терминала. Изменим системные настройки DNS. Сначала делаем резервную копию файла /etc/resolv.conf:
cp /etc/resolv.conf /etc/resolv.conf.backup
/etc/resolv.conf может быть как файлом, так и символической ссылкой. Поэтому, сначала его удалим командой:
rm -f /etc/resolv.conf
Затем создадим новый файл /etc/resolv.conf со следующим содержимым:
nameserver 127.0.0.1
options edns0
Выставим атрибут «только для чтения» (immutable) у файла /etc/resolv.conf. Этот атрибут не позволяет изменить файл даже привилегированным пользователям, защищает файл от случайного или нежелательного изменения.
chattr +i /etc/resolv.conf
Чтобы убрать атрибут «только для чтения», введите команду:
chattr -i /etc/resolv.conf
Проверим, как выполнится запрос на разрешение доменного имени adminkin.pro на IP адрес. Вводим команду:
/opt/dnscrypt-proxy/linux-x86_64/dnscrypt-proxy -resolve adminkin.pro
Доменное имя adminkin.pro разрешилось с помощью сервиса на 127.0.0.1:53, т.е. с помощью dnscrypt-proxy. IP адрес запрашиваемого домена успешно получен (77.222.56.16). Разрешение DNS работает!

Проверяем, как работает просмотр веб-страниц, загрузка файлов и другое использование системы, где требуется разрешение имен DNS.
Например, получим содержимое главной страницы сайта https://adminkin.pro с помощью утилиты curl из командной строки:
apt install curl
curl https://adminkin.pro
Получили? Супер!
Теперь зарегистрируем dnscrypt-proxy как системную службу Linux. Системная служба запускается при загрузке системы и работает в фоновом режиме.
Остановим dnscrypt-proxy, нажав комбинацию клавиш Ctrl + C в окне терминала, где мы запустили dnscrypt-proxy.
Чтобы зарегистрировать dnscrypt-proxy как системную службу, вводим команду:
./dnscrypt-proxy -service install
Стартуем dnscrypt-proxy:
./dnscrypt-proxy -service start
Чтобы остановить dnscrypt-proxy:
./dnscrypt-proxy -service stop
Перезапустить dnscrypt-proxy, например, после изменения конфигурационного файла:
./dnscrypt-proxy -service restart
Отменить регистрацию dnscrypt-proxy в качестве системной службы:
./dnscrypt-proxy -service uninstall
Отредактируем конфигурационный файл dnscrypt-proxy.toml также, как мы это делали в Windows (Настройка конфигурационного файла dnscrypt-proxy.toml в Windows). И не забываем после изменения конфигурационного файла перезапустить dnscrypt-proxy.
Проверка работоспособности DNS over HTTPS
Проверим работоспособность DNS over HTTPS. Запустим захват трафика с помощью сетевого анализатора tcpdump:
apt install tcpdump
tcpdump -n dst port 53
Такая команда позволит захватывать и отображать только пакеты, проходящие через порт 53. Так мы отловим незашифрованные DNS пакеты, если они остались.
-n
указывает tcpdump не выполнять обратное разрешение DNS для IP-адресов и портов, а оставить их в числовом формате.
В новом окне терминала запустим команду на получение главной страницы сайта https://adminkin.pro с помощью утилиты curl:
curl https://adminkin.pro
Ура! Незашифрованных DNS пакетов нет:

Если остановить dnscrypt-proxy и восстановить из бекапа файл /etc/resolv.conf, то картина будет другая:

Выводы
Когда вы в адресной строке браузера набираете доменное имя сайта, ваша система отправляет запрос, что вы ищете IP адрес такого-то домена. И в этот момент, например, ваш интернет-провайдер может зарегистрировать у себя, к какому домену вы подключаетесь. DNS over HTTPS делает этот надзор невозможным, а анонимность и конфиденциальность пользователя в интернете — возможными. А благодаря данной статье настройка DNS over HTTPS тоже делается возможной.
Очень жду ваши вопросы в комментариях под статьей!
Комментарии
Самая вменяемая статья по настройке в Deb на сегодня.
Здравствуйте, спасибо за подробную и понятную инструкцию, сделал всё как у вас, но к сожалению wireshark показывает 100% пакетов, то есть они не зашифрованы как я понял..
Речь идёт о Windows, выше использовал dnscrypt-proxy 2.1.5 версии, попробовал 2.1.4 тоже самое, пакеты не шифруются…
Еще добавлю, при остановке dnscrypt-proxy и при указанном dns в свойствах IP4 «127.0.0.1», все сайты так же открываются и в wireshark ничего особенно не меняется
Привет, Александр! Первое, давайте проверим, что dnscrypt-proxy запустился. Открываем «Диспетчер задач» Windows и ищем dnscrypt-proxy. У меня, например, он в «Фоновых процессах» среди 88 штук других процессов 🙂
Второе, программу wireshark настраиваем на отлов только пакетов DNS. Для этого в строке «Применить дисплейный фильтр» набираем текст DNS и нажимаем Enter. Теперь wireshark ловит только DNS. Если все правильно настроено, то отловленных пакетов DNS не будет. Как только в свойствах IP4 убираем «127.0.0.1» — пойдут отлавливаться пакеты DNS.