В данном руководстве объясняется, как настроить DNS-резольвер с поддержкой TLS (DoT) на Ubuntu с использованием Nginx, чтобы обеспечить шифрование и защиту ваших DNS-запросов от несанкционированного доступа.
Содержание статьи
- 1 DNS через TLS (DoT) – это метод защиты запросов к системе доменных имен (DNS) с помощью шифрования. Он обеспечивает безопасность передачи данных между пользователем и сервером DNS, предотвращая их перехват и изменение. Такой подход помогает защитить конфиденциальность пользователей в интернете, скрывая информацию о посещаемых ими сайтах, и предотвращает манипуляции с ответами DNS. Важно применять DoT, чтобы повысить уровень безопасности сетевых соединений и минимизировать риски, связанные с утечкой данных и кибератаками.
- 2 Запуск собственного DoT-резолвера может принести множество преимуществ.
- 3 Необходимые условия
- 4 Установите Nginx на ваш сервер с операционной системой Ubuntu.
- 5 Получите сертификат TLS от Let’s Encrypt, который гарантирует безопасное соединение.
- 6 Конфигурация клиента Stubby DoT на настольном компьютере с Ubuntu
- 7 Конфигурирование рабочего стола Ubuntu для работы с Stubby
- 8 Способы проверки шифрования вашего DNS-трафика.
- 9 Итоговое обобщение
DNS через TLS (DoT) – это метод защиты запросов к системе доменных имен (DNS) с помощью шифрования. Он обеспечивает безопасность передачи данных между пользователем и сервером DNS, предотвращая их перехват и изменение. Такой подход помогает защитить конфиденциальность пользователей в интернете, скрывая информацию о посещаемых ими сайтах, и предотвращает манипуляции с ответами DNS. Важно применять DoT, чтобы повысить уровень безопасности сетевых соединений и минимизировать риски, связанные с утечкой данных и кибератаками.
Система доменных имен (DNS) предназначена для преобразования доменных имен в IP-адреса. Созданная в 1987 году, она не предусматривала мер безопасности и защиты конфиденциальности. По умолчанию DNS-запросы передаются в незашифрованном виде, что делает их уязвимыми для злоупотреблений со стороны третьих лиц. Например, Великий китайский файрвол (GFW) применяет метод, известный как отравление кэша DNS, для цензуры в китайском интернете. Они также используют другие подходы, которые выходят за рамки обсуждаемой темы.
GFW анализирует каждый DNS-запрос, отправляемый на DNS-серверы за пределами Китая. Поскольку протокол DNS в незашифрованном виде работает на основе UDP, который не требует установки соединения, GFW может имитировать как IP-адрес клиента, так и IP-адрес сервера. Если GFW обнаруживает доменное имя в своем списке заблокированных, он модифицирует ответ DNS. Например, когда пользователь в Китае пытается зайти на google.com, GFW отправляет DNS-резольверу IP-адрес внутри Китая вместо настоящего IP-адреса Google. В результате DNS-резольвер передает ложный IP-адрес устройству пользователя, и доступ к google.com становится невозможен.
DNS по протоколу TLS предполагает, что DNS-запросы передаются через безопасное соединение, защищенное с использованием TLS — той же технологии, которая обеспечивает шифрование HTTP-трафика.

Запуск собственного DoT-резолвера может принести множество преимуществ.
Существуют публичные DNS-резолверы, такие как 1.1.1.1 и 9.9.9.9, которые поддерживают DNS через TLS, поэтому их можно использовать, если у вас нет времени или навыков для настройки собственного решения. Однако некоторые пользователи полагают, что это все равно предоставляет крупным DNS-провайдерам возможность собирать данные о них. Такие люди склонны больше доверять своему интернет-провайдеру. Но если вы серьезно заботитесь о своей конфиденциальности, то лучшим решением будет развернуть собственный DoT-резолвер, чтобы ни крупные DNS-провайдеры, ни ваш провайдер интернета не могли отслеживать вашу активность.
На данный момент не все DNS-резолверы, такие как BIND, Unbound, Knot Resolver, PowerDNS Recursor и другие, поддерживают DNS через TLS. Вместо создания инструкции для каждого отдельного резолвера, я продемонстрирую, как настроить TLS-прокси на базе Nginx для вашего текущего DNS-резолвера. Это позволит вам предоставить сервис DoT, независимо от того, какой именно DNS-резолвер используется, следуя данному руководству.
Необходимые условия
Предполагается, что на вашем сервере Ubuntu установлен DNS-резолвер. Вы можете выбрать любой из доступных вариантов, таких как BIND, Unbound или Knot Resolver. Лично я предпочитаю BIND.
- Установка и конфигурация персонального DNS-резолвера BIND9 на Ubuntu 16.04 и 18.04.
- Настройка индивидуального DNS-резолвера BIND9 на операционной системе Ubuntu 20.04.
Необходимо иметь доменное имя, так как клиентам DNS требуется установить надежное TLS-соединение с нашим DNS-резолвером. Я выбрал регистрацию доменного имени через NameCheap из-за низкой стоимости и предоставляемой бесплатной защиты конфиденциальности whois на весь срок использования.
После того как вы выполните перечисленные условия, переходите к следующим указаниям.
Установите Nginx на ваш сервер с операционной системой Ubuntu.
Это очень легко. Просто введите следующую команду.
sudo apt install nginx
Получите сертификат TLS от Let’s Encrypt, который гарантирует безопасное соединение.
DNS через TLS подразумевает необходимость установки TLS сертификата на сервере. Мы воспользуемся сертификатом от Let’s Encrypt. Основное преимущество использования сертификата Let’s Encrypt заключается в его бесплатности, простоте настройки и доверии со стороны клиентских приложений.
Чтобы установить клиент Let’s Encrypt (certbot) из официального репозитория Ubuntu, выполните следующие команды.
sudo apt install certbot
Для получения сертификата TLS от Let’s Encrypt, необходимо создать виртуальный хост в Nginx, используя следующую команду. Замените dot. example.com на ваше собственное доменное имя. Также важно создать DNS A-запись для этого поддомена.
sudo nano /etc/nginx/conf.d/dot. example.com.conf
Перенесите приведённый ниже текст в файл виртуального хоста.
server { listen 80; server_name dot. example.comкорень /usr/share/nginx/html/; местоположение~ /.well-known/acme-challenge { allow all; }
Сохраните изменения и закройте файл.
В описанной конфигурации мы настраиваем Nginx для завершения TLS-соединения на порту 853, после чего он перенаправляет DNS-запросы на локальный DNS-резольвер, который работает на 127.0.0.1:53.
Сохраните изменения в файле и закройте его. После этого проверьте настройки Nginx и выполните перезапуск.
sudo nginx - t sudo systemctl restart nginx
В случае, если на сервере Ubuntu активирован брандмауэр, следует разрешить доступ к TCP-порту 853. К примеру, если вы применяете брандмауэр UFW, выполните следующую команду.
sudo ufw allow 853/tcp
Поскольку мы применяем DNS через TLS, вам не стоит переживать о рисках, связанных с атакой увеличения DNS.
Конфигурация клиента Stubby DoT на настольном компьютере с Ubuntu
Stubby — это маленький DNS-клиент с открытым исходным кодом от команды getdns. Он работает как промежуточный звено между приложениями, такими как Firefox, и рекурсивными DNS-серверами, например 1.1.1.1 или 8.8.8.8. Особенность Stubby в том, что он поддерживает защищенное соединение с DNS через TLS, что гарантирует, что все DNS-запросы будут отправляться в зашифрованном виде по умолчанию.
Установите Stubby на настольную версию Ubuntu через официальный репозиторий.
sudo apt install stubby
После установки Stubby начинает функционировать в фоновом режиме. Для проверки его состояния используйте:
systemctl status stubby
Stubby отслеживает TCP и UDP порты 53 на локальном хосте (127.0.0.1). По умолчанию Stubby применяет сторонние DNS-резольверы через TLS. Необходимо настроить его для использования нашего собственного резольвера.
sudo nano /etc/stubby/stubby. yml
Прокрутите вниз к разделу upstream_recursive_servers и вставьте указанный текст перед другими DNS-серверами. Подмените 12.34.56.78 на IP-адрес вашего DoT-резольвера.
# Мой собственный DNS через TLS резольвер - address_data: 12.34.56.78tls_auth_name: "dot. example.com"

После этого отыщите следующую строку:
round_robin_upstreams: 1
Замените 1 на 0. Это приведет к тому, что stubby будет постоянно применять ваш собственный резольвер DNS over TLS. В случае его недоступности stubby будет обращаться к другим DNS-серверам. Сохраните изменения в файле и перезапустите stubby, чтобы они вступили в силу.
sudo systemctl restart stubby
Конфигурирование рабочего стола Ubuntu для работы с Stubby
Несмотря на то что Stubby функционирует, операционная система его не использует. Нажмите на значок Network Manager в верхнем правом углу вашего экрана. Далее выберите параметры для проводного подключения. (Если вы подключены по Wi-Fi, выберите настройки для Wi-Fi.)

Нажмите на иконку в виде шестеренки.

Выберите раздел IPv4 и измените настройки DNS, отключив автоматическое получение. Это предотвратит получение адреса DNS-сервера от вашего маршрутизатора в системе Ubuntu. Введите в поле DNS значение 127.0.0.1. Нажмите на кнопку «Применить», чтобы сохранить внесенные изменения.

После этого перезапустите NetworkManager, чтобы изменения начали действовать.
sudo systemctl restart NetworkManager
После повторного подключения вы заметите, что в вашей системе Ubuntu в разделе «Подробности» теперь установлен DNS-сервер 127.0.0.1.

Способы проверки шифрования вашего DNS-трафика.
WireShark можно применять для отслеживания DNS-трафика. Установите WireShark на компьютер под управлением Ubuntu.
sudo apt install wireshark
Если вам зададут вопрос: «Могут ли пользователи без административных прав перехватывать пакеты?», смело отвечайте «Да». После завершения установки выполните следующую команду, чтобы включить свою учетную запись в группу wireshark, что позволит вам перехватывать пакеты.
sudo adduser ваше-имя-пользователя wireshark
Выйдите из учетной записи и выполните вход снова, чтобы изменения начали действовать. После этого запустите WireShark через меню приложений и выберите ваш сетевой интерфейс в WireShark. Например, имя моего Ethernet-интерфейса — enp5s0. Затем укажите порт 853 в качестве фильтра захвата. Это позволит WireShark захватывать только трафик на порту 853, который предназначен для DNS через TLS.

Нажмите на кнопку в верхнем левом углу для начала захвата. Затем в окне терминала введите следующую команду, чтобы получить доменное имя с помощью утилиты dig. Например, я могу запросить A-запись своего домена.
dig A linux16.ru
Теперь у вас есть возможность просматривать захваченный DNS-трафик в WireShark. Соединения были установлены по протоколу TCP и зашифрованы с использованием TLS, что соответствует требованиям. Рекомендуется проверить, содержит ли столбец назначения IP-адрес вашего DoT-резолвера.

Когда DNS-запросы отправляются в незашифрованном виде, компьютер соединяется с DNS-сервером через порт 53. Вы можете снова попытаться захватить пакеты, установив фильтр на порт 53, но в WireShark не будет видно никаких пакетов, что свидетельствует о том, что stubby шифрует ваши DNS-запросы.
Итоговое обобщение
Надеюсь, этот учебник был полезен для настройки DNS-разрешателя через TLS с помощью Nginx на Ubuntu. Возможно, вас также заинтересует:
- Создайте собственный DNS-разрешатель с поддержкой HTTPS (DoH) на Ubuntu, используя DNSdist.
Если вам понравился этот пост, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать больше полезных советов и рекомендаций.

