В данном руководстве мы рассмотрим, как обеспечить защиту вашей DNS-конфиденциальности на Ubuntu 20.04/18.04 с помощью технологии DNS через TLS. Для этой цели мы воспользуемся утилитой под названием stubby. Прежде чем начать, давайте обсудим, почему использование DNS может представлять угрозу безопасности.
Содержание статьи
- 1 Уязвимость системы доменных имен (DNS)
- 2 Что собой представляет DNS через TLS? Как это способствует защите вашей конфиденциальности?
- 3 Инструкция по установке и настройке Stubby на Ubuntu 20.04 и 18.04.
- 4 Переход на Stubby
- 5 Смена DNS-сервера с помощью командной строки.
- 6 Игнорировать параметры DNS, которые предоставляет DHCP-сервер.
- 7 Как интегрировать DNS CloudFlare в Stubby?
- 8 Поддержка DNS с использованием HTTPS.
- 9 Заключение
Уязвимость системы доменных имен (DNS)
DNS считается небезопасным, так как запросы по умолчанию не шифруются, что открывает возможности для вмешательства со стороны третьих лиц. Одним из популярных методов злоупотребления DNS является отравление кэша, которое применяется Великим китайским файрволом (GFW) для контроля доступа к Интернету в Китае. Этот файрвол анализирует каждый DNS-запрос, отправляемый на серверы за пределами страны. Из-за того, что протокол DNS работает на основе UDP и не требует установления соединения, GFW может изменять как IP-адреса клиентов, так и серверов. Когда GFW обнаруживает домен в своём списке блокировок, он подменяет ответ DNS. Например, если пользователь из Китая пытается зайти на google.com, файрвол предоставляет DNS-резолверу IP-адрес, находящийся в Китае, вместо фактического адреса Google, и этот поддельный адрес затем возвращается пользователю.
Что собой представляет DNS через TLS? Как это способствует защите вашей конфиденциальности?
DNS через TLS подразумевает, что запросы к DNS передаются по защищённому соединению, зашифрованному с использованием TLS, той же технологии, что и для шифрования HTTP-трафика. Это обеспечивает конфиденциальность ваших DNS-запросов от посторонних. В сочетании с HTTPS и зашифрованным SNI (индикацией имени сервера) ваша история браузера остаётся полностью защищённой от наблюдения со стороны интернет-провайдера.
Stubby — это открытый DNS-стаб резолвер, разработанный командой getdns. Он работает с библиотекой getdns и представляет собой компактный DNS-клиент, который получает запросы от приложений, таких как Firefox, и отправляет их на рекурсивные резолверы, например, 1.1.1.1 или 8.8.8.8. Уникальность Stubby заключается в поддержке DNS поверх TLS, что позволяет ему по умолчанию отправлять только зашифрованные запросы. Существуют и другие открытые резолверы, такие как cloudflared, который работает с DNS поверх HTTPS, но Stubby уже доступен в репозитории Ubuntu 20.04/18.04 и отличается простотой в использовании.
Инструкция по установке и настройке Stubby на Ubuntu 20.04 и 18.04.
Stubby доступен в репозиториях Ubuntu 20.04 и 18.04. Чтобы установить его, откройте терминал и выполните следующую команду.
sudo apt install stubby
После установки будут установлены Stubby и библиотека getdns. Stubby начинает функционировать в фоновом режиме. Для проверки его состояния воспользуйтесь следующей командой:
systemctl status stubby

Stubby отслеживает порты TCP и UDP 53 на локальном компьютере (127.0.0.1), что можно проверить с помощью следующей команды:
sudo netstat - lnptu | grep stubby

Резольвер-заглушка, которую по умолчанию предоставляет systemd-resolved, работает на TCP и UDP порту 53 по адресу 127.0.0.53.
sudo netstat - lnptu | grep systemd-resolv

Обратите внимание: если dnsmasq принимает запросы на TCP порту 53 по адресу 127.0.0.1, то Stubby будет работать только с UDP портом 53 на этом же адресе.
Основной конфигурационный файл находится по пути /etc/stubby/stubby. yml. Обычно изменения в нем не требуются, если только вы не планируете использовать альтернативный или собственный рекурсивный резолвер. Позвольте мне рассказать о некоторых настройках, установленных по умолчанию. Вы можете открыть файл следующим образом:
sudo nano /etc/stubby/stubby. yml
Эта строка настраивает stubby для работы в качестве stub-резолвера, а не полноценного рекурсивного резолвера, что и объясняет его название.
resolution_type: GETDNS_RESOLUTION_STUB
Данная настройка позволяет stubby отправлять DNS-запросы в зашифрованном виде с использованием TLS. Запросы не будут отправляться в незащищённом формате.
dns_transport_list: - GETDNS_TRANSPORT_TLS
Данная строка предполагает наличие активного TLS-сертификата на удаленном рекурсивном резолвере.
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
В приведенных ниже строках задаются адреса, на которых демон stubby будет ожидать подключения. По умолчанию активированы как IPv4, так и IPv6.
listen_addresses: - 127.0.0.1 - 0::1
В следующей строке задается возможность для Stubby запрашивать рекурсивные резолверы в циклическом режиме. Если значение установлено на 0, Stubby будет поочередно использовать каждый вышестоящий сервер, пока один из них не станет недоступен, после чего переключится на следующий.
round_robin_upstreams: 1
В стандартной конфигурации stubby активированы три рекурсивных резолвера. Эти резолверы находятся под контролем разработчиков stubby и обеспечивают поддержку DNS через TLS. Полный перечень рекомендованных серверов доступен на ресурсе DNS Privacy.
dnsovertls. sinodun.com 145.100.185.15 dnsovertls1.sinodun.com 145.100.185.16 getdnsapi.net 185.49.141.37
В разделе «Дополнительные серверы» представлены другие DNS-серверы, которые изначально неактивны.
dns. quad9.net unicast. censurfridns. dk dnsovertls3.sinodun.com (поддерживающие TLS1.2 и TLS 1.3) dnsovertls2.sinodun.com dns. cmrg.net dns. larsdebruin.net .
Существуют и DNS-серверы, которые работают на порту 443. Если в вашей сети порт 853 недоступен, вы можете активировать их, убрав комментарии.
dnsovertls. sinodun.com dnsovertls1.sinodun.com dns. cmrg.net dns. neutopia. org
Теперь, чтобы закрыть текстовый редактор nano, нажмите сочетание клавиш Ctrl+X.
Переход на Stubby
Изменение DNS-сервера путем редактирования файла /etc/resolve.conf больше не является рекомендуемой практикой. Пожалуйста, выполните приведенные ниже шаги для настройки systemd-resolved, чтобы он перенаправлял DNS-запросы в stubby.
Рабочий экран GNOME
Кликните на иконку Network Manager, расположенную в верхнем правом углу экрана. После этого выберите параметры для проводного соединения. (Если у вас Wi-Fi, выберите настройки для Wi-Fi.)

Нажмите на иконку с изображением шестерёнки.

Откройте вкладку IPv4 и в настройках DNS измените режим с Автоматически на ВЫКЛ, чтобы запретить системе Ubuntu получать адрес DNS-сервера от вашего маршрутизатора. Введите 127.0.0.1 в поле DNS. Затем нажмите на кнопку Применить, чтобы сохранить внесенные изменения.

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

Стол рабочего пространства Unity
Щелкните по иконке сетевого диспетчера в правом верхнем углу экрана, после чего выберите «Изменить подключения».

Выберите название подключения и кликните на иконку с изображением шестеренки.

Перейдите на вкладку настройки IPv4 и измените способ подключения с Автоматически (DHCP) на Автоматически (только DHCP-адреса). Это позволит вашей системе Ubuntu избежать получения DNS-адреса от роутера. Далее укажите DNS-сервер как 127.0.0.1, так как Stubby работает на этом адресе.

Сохраните внесенные изменения, после чего перезапустите NetworkManager для их применения.
sudo systemctl restart NetworkManager
После повторного подключения к сети снова нажмите на значок Network Manager и выберите информацию о текущем подключении. Вы заметите, что ваша система Ubuntu теперь настроена на использование 127.0.0.1 в качестве DNS-сервера.

Смена DNS-сервера с помощью командной строки.
Метод, представленный ниже, поможет вам изменить DNS-сервер, если вы используете NetworkManager на своем настольном компьютере.
Запустите терминал и переместитесь в папку с профилями подключений Network Manager.
cd /etc/NetworkManager/system-connections/
После этого укажите имена подключений, которые доступны в вашей системе.

У меня на системе имеется несколько подключений, среди которых есть проводное соединение. Некоторые из них работают по беспроводной технологии, а одно — это VPN-соединение. Так как настольный компьютер подключен к маршрутизатору с помощью Ethernet-кабеля, я должен внести изменения в профиль проводного подключения, используя текстовый редактор командной строки nano.
sudo nano 'Проводное соединение 1'
Если ваш компьютер использует подключение Wi-Fi, вам необходимо внести изменения в профиль беспроводной сети. В этом документе найдите настройки [ipv4]. Обычно они должны выглядеть следующим образом:
[ipv4] dns-search= method=auto
Для того чтобы ваша система могла использовать Stubby, внесите следующие изменения в настройки конфигурации.
[ipv4] dns=127.0.0.1; dns-search= ignore-auto-dns=true method=auto
Для сохранения файла в текстовом редакторе Nano, используйте комбинацию Ctrl+O, затем нажмите Enter для подтверждения. Чтобы выйти, нажмите Ctrl+X. После этого перезапустите Network Manager, чтобы изменения начали действовать.
sudo systemctl restart NetworkManager
Теперь у вас есть возможность проверить актуальный DNS-сервер, введя следующую команду:
systemd-resolve --status
Link 2 (enp5s0) Текущие области: DNS LLMNR настройка: да MulticastDNS настройка: нет DNSSEC настройка: нет DNSSEC поддерживается: нет Серверы DNS: 127.0.0.1
Если в качестве DNS-сервера указан 127.0.0.1, это означает, что ваша система функционирует с использованием Stubby.
Игнорировать параметры DNS, которые предоставляет DHCP-сервер.
Если вы работаете с версиями сервера Ubuntu, у вас есть возможность настроить systemd таким образом, чтобы он не учитывал DNS-настройки, получаемые от DHCP-сервера. Это позволит избежать ситуации, когда ваша система может случайно начать использовать неверный DNS-сервер.
Сначала убедитесь в состоянии вашего сетевого интерфейса.
networkctl status enp5s0
Это откроет для вас файл сети, связанный с данным интерфейсом. Внесите изменения в этот файл сети.
sudo nano /run/systemd/network/10-netplan-enp5s0.network
Перейдите в раздел [DHCP] и внесите следующую строку.
UseDNS=false
[DHCP] RouteMetric=100 UseMTU=true UseDNS=false
Сохраните файл и закройте его. После этого перезапустите службу systemd-netweorkd.service, чтобы изменения начали действовать.
sudo systemctl restart systemd-networkd
Используйте следующую команду для проверки DNS-серверов всех сетевых интерфейсов. Если всё настроено правильно, вы не получите отображение DNS-сервера.
Выйдите из учетной записи и снова войдите, чтобы изменения начали действовать. Затем запустите WireShark через меню приложений и выберите свой сетевой интерфейс. Например, мой Ethernet-интерфейс называется enp5s0. После этого укажите порт 853 в качестве фильтра для захвата, чтобы WireShark фиксировал только трафик на этом порту, который используется для DNS через TLS.

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

Когда DNS-запросы передаются без шифрования, компьютер обращается к DNS-серверу через порт 53. Вы можете попробовать перехватить пакеты с фильтром по этому порту, но в WireShark не отобразится ни одного пакета, что свидетельствует о том, что stubby защищает ваши DNS-запросы с помощью шифрования.
Как интегрировать DNS CloudFlare в Stubby?
Я обнаружил, что между моим компьютером и тремя обычными DNS-серверами наблюдается значительная задержка (более 200 мс), в то время как DNS-серверы CloudFlare (1.1.1.1 и 1.0.0.1) предлагают крайне низкую задержку (менее 20 мс). Кроме того, CloudFlare поддерживает DNS через TLS. Для подключения DNS-сервера CloudFlare необходимо изменить файл конфигурации stubby.
sudo nano /etc/stubby/stubby. yml
Прокрутите вниз к разделу upstream_recursive_servers и вставьте следующий текст перед остальными DNS-серверами.
#Серверы CloudFlare - address_data: 1.1.1.1 tls_auth_name: "cloudflare-dns.com" - address_data: 1.0.0.1 tls_auth_name: "cloudflare-dns.com"
После этого отыщите следующую строку:
round_robin_upstreams: 1
Измените значение 1 на 0. Это приведет к тому, что stubby всегда будет обращаться к DNS-серверу CloudFlare. В случае недоступности CloudFlare, stubby переключится на другие DNS-серверы. Не забудьте сохранить файл и перезапустить stubby для применения изменений.
sudo systemctl restart stubby
Поддержка DNS с использованием HTTPS.
Stubby начнет поддерживать DNS через HTTPS в версии 0.3. В Ubuntu 20.10 установлена версия 0.2.6. Для проверки версии Stubby выполните команду.
stubby - V
Заключение
Надеюсь, данный гайд оказался для вас полезным в обеспечении безопасности вашей конфиденциальности DNS на Ubuntu 20.04/18.04 с использованием DNS через TLS. Если вам понравилась эта статья, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций. Берегите себя.

