Перевод: Анна Давыдова
Источник: n0where.net
Протокол для обеспечения безопасности DNS коммуникации между клиентом и DNS преобразователем
dnscrypt-proxy проверяет, чтобы ответы, которые вы получаете от DNS-провайдера, фактически были отправлены этим провайдером и не были подделаны.
Это не является VPN. Он не маскирует ваш IP-адрес, и если вы используете его с общедоступной службой DNS, имейте в виду, что он будет (и должен) расшифровывать ваши запросы. Если вы используете его для обеспечения конфиденциальности, то вы можете получить абсолютно противоположные результаты. Если вы используете его для предотвращения VPN «утечки», то это также является не совсем корректной задачей. Надлежащим способом предотвращения «утечек» VPN является предотвращение отправки данных еще одной третьей стороне: используйте службу VPN, которая управляет собственными DNS-преобразователями.
Данный демон работает на последних версиях OSX, OpenBSD, Bitrig, NetBSD, Dragonfly BSD, FreeBSD, Linux, iOS (требует jailbroken устройство), Android (требует устройство с корневым доступом), и Windows (требует MingW).
Описание
dnscrypt-proxy предоставляет локальную службу, которая может быть использована напрямую как ваш локальный преобразователь или как DNS ретранслятор, аутентифицируя запросы с использованием протокола DNSCrypt и передавая их на вышестоящий сервер.
DNSCrypt протокол использует высокоскоростную, хорошо защищенную криптографию с эллиптическими кривыми, а также является очень похожим на DNSCurve, но фокусируется на обеспечении связи между клиентом и его преобразователем первого уровня.
Не обеспечивая сквозной безопасности, он защищает локальную сеть, которая часто является самым слабым звеном цепочки, от атак типа «человек посередине».
DNSCrypt
DNSCrypt является протоколом, который аутентифицирует коммуникацию между DNS клиентом и DNS преобразователем. Это предотвращает DNS спуфинг. Он использует криптографическую подпись для поверки ответов, чтобы убедиться, что они получены от выбранного DNS преобразователя и не были подделаны. DNSCrypt поддерживается на большинстве операционных систем, таких как Linux, OSX, Android, iOS, BSD и Windows. DNSCrypt не присоединен к какой-либо компании или организации, и является документированным протоколом, использующим высоконадежную криптографию, отличную от NIST, а его ссылочные реализации являются открытыми и выпущены по очень либеральной лицензии.
Загрузка и проверка целостности
dnscrypt-proxy может быть загружен отсюда.
Вычислите SHA256 дайджест:
$ openssl dgst -sha256 dnscrypt-proxy-1.6.0.tar.bz2
Проверьте дайджест:
$ drill -D TXT dnscrypt-proxy-1.6.0.tar.bz2.download.dnscrypt.org
или
$ dig +dnssec TXT dnscrypt-proxy-1.6.0.tar.bz2.download.dnscrypt.org
Если содержание TXT записи не соответствует вычисленному вами SHA256 дайджесту, пожалуйста, оставьте отчет о неполадке на Github как можно скорее, и не двигайтесь дальше в данной инструкции.
Установка
Установите libsodium. На Linux не забудьте запустить ldconfig, если вы установили его из исходного кода.
«Минимальная» сборка libsodium (–enable-minimal) работает также эффективно, как и полная сборка с этим прокси.
На Fedora, RHEL и CentOS, вам, возможно, понадобится добавить /usr/local/lib для путей, на которые будет смотреть динамический компоновщик. Перед запуском ldconfig введите:
# echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
Сейчас, скачайте последнюю версию dnscrypt-proxy и извлеките её:
$ bunzip2 -cd dnscrypt-proxy-*.tar.bz2 | tar xvf - $ cd dnscrypt-proxy-*
Скомпилируйте и установите её, используя стандартную процедуру:
$ ./configure && make -j2 # make install
Замените -j2 любым количеством ядер процессора, которые вы хотите использовать для процесса компиляции.
Прокси будет установлен как /usr/local/sbin/dnscrypt-proxy по умолчанию.
Переключатели командной строки описаны на справочной странице dnscrypt-proxy(8)
Примечание: gcc 3.4.6 (и, вероятно, другие похожие версии) создает неисправный код для Mips целей с -Os уровнем оптимизации. Используйте разные уровни (-O и -O2 хорошо подойдут) или обновите компилятор. Спасибо Adrian Kotelba за то, что сообщил об этом.
GUI для dnscrypt-proxy
Если вам нужен простой графический интерфейс для того, чтобы запустить/остановить прокси и изменить ваши настройки DNS, то вам следует ознакомиться со следующим проектом:
- DNSCrypt WinClient: С легкостью включает/выключает DNSCrypt на множестве адаптеров. Поддерживает разные порты и протоколы, IPv6, родительский контроль и прокси могут выступать в качестве шлюза. Только для Windows, написан на платформе .NET.
- DNSCrypt Windows Service Manager: Помогает в настройке DNSCrypt как службы, настраивает его и меняет настройки адаптера DNS для использования DNSCrypt. Он включает в себя возможность использовать протокол TCP / UDP, подключение IPV4 / IPV6, выбор сетевого адаптера для настройки, а также конфигурации для доступных в настоящее время провайдеров DNSCrypt.
- DNSCrypt OSXClient: Приложение Mac OSX для управления DNSCrypt прокси.
- DNSCrypt Tools for Linux: Набор инструментов для dnscrypt-proxy. Имеет кнопку запуска и остановки, а также опции для включения или отключения от запуска. Разработан для Porteus Linux.
Преобразователи, поддерживающие DNSCrypt
Для начала вы можете использовать любые общедоступные DNS преобразователи, поддерживающие DNSCrypt.
Этот файл постоянно обновляется, и его мини-подпись может быть проверена с помощью следующей команды:
minisign -VP RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3 -m dnscrypt-resolvers.csv
Если вы хотите добавить поддержку DNSCrypt к вашему собственному публичному или частному преобразователю, познакомьтесь с DNSCrypt-Wrapper, серверным dnscrypt прокси, который работает с любым преобразователем имен.
Образ DNSCrypt server Docker также доступен, чтобы ввести в действие non-logging, поддерживающий DNSSEC и DNSCrypt преобразователи без необходимости компилировать или настраивать что-либо вручную.
Использование
Настоятельно рекомендуется иметь специального системного пользователя без каких-либо привилегий и с пустым домашним каталогом. Для дополнительной безопасности, DNSCrypt будет выполнять chroot () в домашнем каталоге этого пользователя и как можно скорее сбрасывать привилегии root для uid данного пользователя.
Самым простым способом запустить этот демон является:
# dnscrypt-proxy --daemonize --resolver-name=<resolver name>
Замените <resolver name> на имя преобразователя, который вы хотите использовать (первая колонка в списке публичных преобразователей).
Прокси примет водящий запрос на 127.0.0.1, пометит их кодом аутентификации, отправит их в преобразователь и проверит каждый ответ перед передачей его клиенту.
Учитывая такую настройку, чтобы фактически начать использовать DNSCrypt, вам необходимо обновить файл /etc/resolv.conf и заменить текущий набор преобразователей на:
nameserver 127.0.0.1
Другие общие переключатели командной строки включают в себя:
- —daemonize позволяет запустить сервер как фоновый процесс.
- —local-address=<ip>[:port] позволяет локально привязать другой IP-адрес вместо 127.0.0.1;
- —logfile=<file> дает возможность записывать данные журнала в выделенный файл. По умолчанию журналы отправляются на stdout, если сервер запущен в приоритетном режиме, и в syslog, если он работает в фоновом режиме ;
- —loglevel=<level> если вам нужно меньше подробностей в файлах журналов.
- —max-active-requests=<count> для установки максимального количества активных запросов. Значение по умолчанию – 250;
- —pidfile=<file> для того, чтобы хранить PID номер в файле;
- —user=<user name> позволяет получить chroot()/drop привилегии;
- —resolvers-list=<file>: Указать путь к CSV-файлу, содержащему список доступных преобразователей, и параметры для их использования;
- —test дает возможность убедиться, что серверный прокси настроен правильно и, что можно использовать действительный сертификат. Это полезно для контроля вашего собственного dnscrypt прокси. Для получения дополнительной информации посетите справочную страницу.
—resolver-address=<ip>[:port], —provider-name=<certificate provider FQDN> и -provider-key=<provider public key> данные переключатели могут быть указаны, для того, чтобы использовать рекурсивную DNS службу, поддерживающую DNSCrypt , который не указан в файле настроек.
Запуск dnscrypt прокси с помощью systemd
На системах использующих systemd, и при компиляции с —with-systemd, Прокси может использовать активацию сокета systemd вместо создания самих сокетов. Прокси также уведомит systemd об успешном запуске.
Двум сокетам необходима настройка: UDP сокет (ListenStream) и TCP сокет (ListenDatagram) разделяют один и тот же порт.
Исходный дистрибутив включает в себя dnscrypt-proxy.socket и dnscrypt-proxy.service файлы, который могут быть использованы в качестве отправной точки.
Использование DNSCrypt вместе с DNS кэшем
DNSCrypt прокси не является DNS кэшем. Это означает, что входящие запросы не будут кэшироваться, и каждый отдельный запрос будет требовать возврата к вышестоящему преобразователю.
Для оптимальной производительности лучшим способом запуска DNSCrypt является запуск его в качестве ретранслятора для локального DNS кэша, например, unbound или powerdns-recursor.
Оба могут быть безопасно запущены на одной и той же машине, т.к. они слушают различные IP-адреса (предпочтительно) или разные порты.
Если ваш DNS кэш является unbound, все что вам нужно — это отредактировать unbound.conf файл и добавить следующую строку в конец раздела server:
do-not-query-localhost: no forward-zone: name: "." forward-addr: 127.0.0.1@40
Первая строчка вам не понадобится, если вы используете разные IP-адреса вместо различных портов.
Затем запустите dnscrypt-proxy, сообщив ему использовать определенный порт (в этом примере 40):
# dnscrypt-proxy --local-address=127.0.0.1:40 --daemonize
Поддержка IPv6
IPv6 поддерживается полностью. Адреса IPv6 с номером порта должны указываться следующим образом [ip]:port
# dnscrypt-proxy --local-address='[::1]:40' ...
Запросы, использующие нестандартные порты / через TCP
Некоторые роутеры и фаерволы могут блокировать исходящие DNS запросы или прозрачно перенаправлять их на свои собственные преобразователи. В особенности, это происходит в общественных местах Wi-Fi, таких как кафе.
В качестве обходного пути номер порта можно изменить с помощью параметра —resolver-port=<port>
По умолчанию, dnscrypt-proxy отправляет исходящие запросы на UDP порт 443.
Кроме того, DNSCrypt прокси может заставить исходящие запросы отправляться через TCP. Например, TCP-порт 443, который обычно используется для связи через HTTPS, может не фильтроваться.
—tcp-only переключатель командной строки вызывает такое поведение. Когда поступает входящий запрос, демон немедленно отвечает сообщением «response truncated» ( «усеченный ответ»), заставляя клиента повторить попытку через TCP. Демон затем аутентифицирует запрос и пересылает его через TCP к преобразователю.
—tcp-only является более медленным, чем UDP, потому что многочисленные запросы через одиночное TCP соединение пока еще не поддерживаются, и этот обходной путь не требуется, кроме тех случаев, когда требуется обход фильтра.
Аутентификация клиента с открытым ключом
По умолчанию dnscrypt-proxy генерирует недетерминированные клиентские ключи каждый раз при запуске или для каждого запроса (когда включена функция эфемерных ключей).
Однако, коммерческие DNS службы могут захотеть использовать DNSCrypt для аутентификации отправителя запросов, используя криптографию открытого ключа, т.е. узнать, что за пользователь отправил запрос без
изменения самого DNS-запроса и без использования общих секретов.
Преобразователи, которые должны быть доступны с любого IP-адреса, но которые должны использоваться только конкретными пользователями, также могут воспользоваться DNSCrypt, но только, чтобы отвечать на запросы, отправленные с использованием данного списка открытых ключей.
Для того, чтобы сделать это dnscrypt-proxy 1.6.0 представляет —client-key (или просто -K) переключатель. Он загружает секретный ключ клиента из файла вместо генерации случайного ключа:
# dnscrypt-proxy --client-key=/private/client-secret.key
Этот файл должен оставаться конфиденциальным, и его содержание не должно быть известно провайдеру DNS службы.
Версия 1 и 2 протокола DNSCrypt используют ключи Curve25519, и форматом этого файла для ключей Curve25519 является шестнадцатеричная строка и с необязательными :, [space] и — ограничителями, декодированием до 34 байт:
01 01 || 32-byte Curve25519 secret key
размер EDNS пейлоад
DNS отправляемые через UDP исторически были ограничены 512 байтами, что, в принципе, является нормальным для запроса, но иногда этого слишком мало для ответа.
Большинство современных авторитетных серверов, распознавателей и незащищенных преобразователей поддерживают механизм расширения для DNS (EDNS), который, среди прочего, позволяет клиенту указать, насколько большим может быть ответ, передаваемый через UDP.
К сожалению, это свойство заблокировано по умолчанию на большинстве операционных систем. Он должен быть явно включен, например, путем добавления options edns0 к /etc/resolv.conf файлу на большинстве операционных систем, подобных Unix.
dnscrypt-proxy может прозрачно перезаписать исходящие пакеты перед их аутентификацией для того, чтобы добавить EDNS0 механизм. По умолчанию, устоявшийся размер пейлоад является 1252 байт.
Этот размер может быть увеличен путем запуска в прокси переключателя командной строки —edns-payload-size=<bytes>. Значения до 4096 обычно безопасны.
Значение ниже или равное 512 отключит этот механизм, если клиент не отправит пакет с секцией OPT, предоставляя размер пейлоад.
Утилита hostip
DNSCrypt прокси идет с простым инструментом под названием hostip, который разрешает имя для адресов IPv4 или IPv6.
Этот инструмент может оказаться полезным для запуска некоторых служб перед dnscrypt-proxy.
Запросы сделанные hostip не аутентифицируются.
Плагины
dnscrypt-proxy можно расширить с помощью плагинов. Плагин выступает в роли фильтра, который локально инспектирует и модифицирует запросы и ответы.
Плагин API задокументирован в README-PLUGINS.markdown файле.
Любое количество плагинов можно комбинировать (сцеплять), повторяя переключатель командной строки —plugin.
Дистрибутив по умолчанию идет с несколькими плагинами для примера:
- libdcplugin_example_ldns_aaaa_blocking: Непосредственно возвращает пустой ответ на запросы AAAA
Пример использования:
# dnscrypt-proxy ... \ --plugin libdcplugin_example_ldns_aaaa_blocking.la
Если подключение IPv6 недоступно в вашей сети, этот плагин избегает ожидания ответов IPv6 от вышестоящего преобразователя. Это может улучшить ваш веб-браузер.
- libdcplugin_example_ldns_blocking: Блокирует конкретные домены и IP-адреса.
Этот плагин возвращает REFUSED ответ, если имя запроса находится в черном списке или же, если хотя бы один из возвращенных IP-адресов перечислен в черном списке IP.
Признанными переключателями являются:
--domains=<file> --ips=<file>
Файл должен содержать по одной записи в каждой строке.
Поддерживаются адреса IPv4 и IPv6. Для имен, ведение и отслеживание групповых символов (*) также поддерживается (e.g. *xxx*, *.example.com, ads.*)
# dnscrypt-proxy ... \ --plugin libdcplugin_example,--ips=/etc/blk-ips,--domains=/etc/blk-names
- libdcplugin_example-logging: Записывает клиентские запросы
Этот плагин записывает клиентские запросы в стандартный вывод (по умолчанию) или в файл.
# dnscrypt-proxy ... \ --plugin libdcplugin_example_logging,/var/log/dns.log
- Дополнительные плагины
Дополнительные плагины можно найти на Github: Masquerade plugin, GeoIP plugin.