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

Утечка 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 от имени администратора:

DNS over HTTPS. Windows. Запуск командной строки

Переходим в директорию, в которую распаковали dnscrypt-proxy. В моем случае это будет команда:

cd c:\dnscrypt-proxy\win64\

Создаем конфигурационный файл dnscrypt-proxy.toml:

copy example-dnscrypt-proxy.toml dnscrypt-proxy.toml

Запускаем dnscrypt-proxy:

.\dnscrypt-proxy.exe
DNS over HTTPS. Запуск dnscrypt-proxy

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

Все! Dnscrypt-proxy готов к работе:

DNS over HTTPS. 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 работает!

Dnscrypt-proxy. Разрешение доменного имени

Настройка DNS over HTTPS

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

В моем случае сетевое подключение, через которое выход в интернет, — это Беспроводная сеть. Выбираю Свойства:

DNS over HTTPS. Меняем DNS настройки сетевого подключения

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

DNS over HTTPS. IP адрес DNS сервера 127.0.0.1

Проверяем, как работает просмотр веб-страниц, загрузка файлов, веб-приложения, мессенджеры — все, что может использовать DNS.

Зарегистрируем dnscrypt-proxy как системную службу Windows. Системна служба Windows запускается при загрузке операционной системы и работает в фоновом режиме.

В окне командной строки, запущенной от имени администратора, нажимаем комбинацию клавиш Ctrl + C, чтобы остановить dnscrypt-proxy.

Чтобы зарегистрировать dnscrypt-proxy как системную службу Windows, в окне командной строки, запущенной от имени администратора, набираем команду:

.\dnscrypt-proxy.exe -service install
DNS over HTTPS. Регистрируем dnscrypt-proxy как системную службу Windows

Чтобы стартовать 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 трафик

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 занят, то сервис, занявший его, нужно останавливать и убирать из автозагрузки. В случае, если порт 53 занял systemd-resolved, то команды будет следующие:

systemctl stop systemd-resolved
systemctl disable systemd-resolved

Запускаем dnscrypt-proxy:

./dnscrypt-proxy
DNS over HTTPS. Запуск dnscrypt-proxy в Linux (Debian)

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

Dnscrypt-proxy готов к работе:

DNS over HTTPS. Dnscrypt-proxy готов к работе в Linux (Debian)

Настройка 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 работает!

Dnscrypt-proxy. Разрешение DNS имени в Linux

Проверяем, как работает просмотр веб-страниц, загрузка файлов и другое использование системы, где требуется разрешение имен 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 пакетов нет:

DNS over HTTPS работает. Незашифрованных DNS пакетов нет

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

Незашифрованные DNS пакеты

Выводы

Когда вы в адресной строке браузера набираете доменное имя сайта, ваша система отправляет запрос, что вы ищете 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.

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

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.