Как настроить DNS over TLS на macOS

Как настроить DNS over TLS на macOS

С приватностью в интернете в последнее время дела обстоят очень плохо, особенно если вы используете социальные сети, хотя и без них практически каждый веб-сайт нафарширован различными трекерами, отслеживающими любой ваш чих[1]. От владельцев сайтов не отстают и интернет-провайдеры: одни вынуждены следить за пользователями по закону (особенно во всяких дебильных странах с репрессивным государственным аппаратом), другие же занимаются этим ради выгоды (например, они могут продавать данные о привычках пользователей третьим лицам).

Одним из векторов слежки за пользователями является система доменных имён. Подробнее об этом можно почитать на сайте проекта DNS Privacy, я же отмечу только, что когда вы обращаетесь к любому веб-сайту или интернет-сервису (например, проверяете почту), то DNS-запрос с вашего компьютера уходит на DNS-сервер в открытом виде. Это значит, что если вы пришли поработать в заведение общепита и подключились к его беспроводной сети, то любой мамкин хакер, вооружённый Wireshark и подключённый к той же сети, сможет в режиме реального времени видеть доменные имена сайтов, на которые вы заходите.

Для борьбы с этим печальным обстоятельством умные люди придумали DNS over TLS и DNS over HTTPS, которые шифруют весь трафик между DNS-сервером и клиентом. Проблема заключается в том, что пока что ни одна коммерчески доступная операционная система, включая macOS, не поддерживает эти протоколы, поэтому придётся воспользоваться сторонним инструментарием, в качестве которого выступит stubby.

Для установки stubby воспользуемся пакетным менеджером Homebrew. В принципе, stubby можно собрать и вручную, но Homebrew нам пригодится нам не только для установки, поэтому дальше везде подразумевается, что он у вас уже установлен. Открываем терминал и пишем:

brew install stubby

Через пару минут stubby будет установлен на ваш компьютер. Теперь нам надо отредактировать конфигурационный файл /usr/local/etc/stubby/stubby.yml.

Что нас интересует в этом файле? Во-первых, надо убедиться, что параметр tls_authentication имеет значение GETDNS_AUTHENTICATION_REQUIRED. Во-вторых, stubby по умолчанию использует сразу несколько неплохих серверов, но я рекомендую добавить к ним новый сервис компании CloudFlare.

Но чтобы это сделать, сначала надо получить «отпечаток пальца» сервера. Для этого в терминале вводим следующую команду:

echo | openssl s_client -connect '1.1.1.1:853' 2>/dev/null | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

Эта команда выдаст строку вроде yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=, которая и является искомым «отпечатком пальца».

Screen-Shot-2018-04-04-at-21.11.35

Находим в файле stubby.yml секцию upstream_recursive_servers: и пишем:

# The Cloudflare server
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
    tls_pubkey_pinset:
      - digest: "sha256"
        value: yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=

Внимание: stubby очень чувствителен к синтаксису конфигурационного файла, особенно к количеству пробелов, которые используются для создания иерархической структуры. Поэтому редактировать его надо не в Microsoft Word и не в TextEdit, а в нормальном человеческом редакторе вроде vim или, на худой конец, TextWrangler.

Теперь можно запустить stubby в тестовом режиме. Для этого надо ввести команду:

sudo stubby -C /usr/local/etc/stubby/stubby.yml -l

Если вы всё сделали правильно, то stubby бодро отрапортует об успешном запуске:

[21:28:52.632348] STUBBY: Read config from file /usr/local/etc/stubby/stubby.yml
[21:28:52.633530] STUBBY: DNSSEC Validation is OFF
[21:28:52.633557] STUBBY: Transport list is:
[21:28:52.633564] STUBBY:   - TLS
[21:28:52.633572] STUBBY: Privacy Usage Profile is Strict (Authentication required)
[21:28:52.633578] STUBBY: (NOTE a Strict Profile only applies when TLS is the ONLY transport!!)
[21:28:52.633584] STUBBY: Starting DAEMON....

Убедимся, что наш локальный DNS-сервер (в роли которого выступает stubby) успешно получает ответы от вышестоящего сервера (т.е. от Cloudflare DNS или любого другого сервера, прописанного в конфигурации stubby). Для этого откроем ещё одно окно терминала и напишем в нём:

dig @127.0.0.1 pavelurusov.com

Вместо pavelurusov.com можно использовать любое доменное имя, например, google.com. В случае успеха мы увидим ответ от сервера с IP-адресом, на который ведёт указанный домен:

Screen-Shot-2018-04-04-at-22.32.10

Чтобы каждый раз не запускать stubby вручную после перезагрузки компьютера, его надо установить в качестве сервиса. Обычно эта процедура подразумевает редактирование .plist-файлов для launchd (бррр), но тут нам на помощь опять придёт Homebrew:

sudo brew services start stubby

Последний штрих — запуск специального скрипта, который устанавливает loopback-интерфейс в качестве DNS-сервера для всех сетевых подключений:

sudo /usr/local/opt/stubby/sbin/stubby-setdns-macos.sh

Хотя это описание может показаться страшным, на самом деле весь процесс не должен занять дольше 10-15 минут. ♦


  1. По крайней мере, это справедливо для сайтов, использующих рекламные сети. ↩︎

Если вам понравился этот текст, не забудьте подписаться на обновления моего блога.

Плюсануть
Поделиться