dnscrypt-proxy (Русский)
dnscrypt-proxy — это DNS-прокси с поддержкой зашифрованных протоколов DNS over HTTPS и DNSCrypt, что позволяет предотвратить атаки «человек посередине» и подслушивание. dnscrypt-proxy также совместим с DNSSEC.
Установка
Установите пакет dnscrypt-proxy.
Настройка
Запуск
Служба может быть запущена одним из двух взаимоисключающих способов (т.е. только один из этих двух юнитов может быть включен):
- С помощью systemd-службы
dnscrypt-proxy.service
.- Тогда должна быть настроена опция
listen_addresses
(напр.listen_addresses = ['127.0.0.1:53', '[::1]:53']
) в файле конфигурации.
- Тогда должна быть настроена опция
- Или с помощью сокетной активации через
dnscrypt-proxy.socket
.- Тогда опция
listen_addresses
должна быть пустой (напр.listen_addresses = [ ]
) в файле конфигурации, так как systemd сам позаботится о настройке сокета.
- Тогда опция
Выберите распознаватели
Если оставить опцию server_names
закомментированной в файле /etc/dnscrypt-proxy/dnscrypt-proxy.toml
, то dnscrypt-proxy выберет самый быстрый сервер из источников, прописанных в секции [sources]
[3]. Эти списки скачиваются, проверяются и автоматически обновляются [4]. Таким образом, ручная настройка определённого набора серверов необязательна.
Чтобы вручную задать набор используемых серверов, раскомментируйте опцию server_names
в файле /etc/dnscrypt-proxy/dnscrypt-proxy.toml
и пропишите в ней один или несколько серверов. Например, чтобы использовать серверы Cloudflare:
server_names = ['cloudflare', 'cloudflare-ipv6']
Полный список распознавателей (resolvers) расположен на странице апстрима или Github. Если dnscrypt-proxy успешно запускался ранее в системе, список также будет расположен в файле /var/cache/dnscrypt-proxy/public-resolvers.md
. Посмотрите описание серверов, которые проверяют DNSSEC, не ведут логи и не занимаются цензурой. Эти требования могут быть настроены глобально с помощью опций require_dnssec
, require_nolog
и require_nofilter
.
Отключите любые службы, слушающие порт 53
Чтобы проверить наличие программ, использующих порт 53, выполните:
$ ss -lp 'sport = :domain'
Если вывод содержит что-то помимо строки с названием столбцов, вам нужно отключить все службы, использующие порт 53. Один из распространённых виновников — systemd-resolved.service
(NetworkManager#Unit dbus-org.freedesktop.resolve1.service not found), но другие менеджеры сети также могут иметь аналогичные компоненты. Можно продолжать, если приведённая выше команда не выводит ничего кроме этой строки:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
Измените resolv.conf
Измените файл resolv.conf и замените ваш текущий адрес распознавателя на localhost с опциями [5]:
nameserver ::1 nameserver 127.0.0.1 options edns0 single-request-reopen
Другие программы могут перезаписывать этот файл; подробнее см. Domain name resolution (Русский)#Перезапись файла /etc/resolv.conf.
Запустите systemd-службу
Наконец, запустите/включите юнит dnscrypt-proxy.service
или dnscrypt-proxy.socket
в зависимости от выбранного вами ранее способа запуска.
Проверьте работоспособность dnscrypt-proxy
Откройте в браузере DnsLeakTest и выполните «Extended test». Если результат отображает серверы, которые вы выбрали в файле конфигурации, это означает, что dnscrypt-proxy работает; в противном случае что-то пошло не так.
Советы и рекомендации
Настройка локального кэша DNS
cache = true
в файле конфигурации dnscrypt-proxy.Если встроенная возможность кэширования не используется, рекомендуется запускать dnscrypt-proxy как сервер пересылки (forwarder) для локального кэша DNS; иначе любой запрос будет приводить к его отправке на вышестоящий распознаватель. Должна работать любая кэширующая программа. В таком случае вам нужно настроить её в дополнение к dnscrypt-proxy.
Изменение порта
В случае пересылки запросов из локального кеша DNS dnscrypt-proxy должен слушать порт отличный от стандартного 53
, так как DNS-кэш сам будет слушать этот порт и обращаться к dnscrypt-proxy на другом порту. В этом разделе для примера используется порт 53000
(так как порт больше 1024, dnscrypt-proxy необязательно запускать от имени root).
Есть два метода изменения порта в зависимости от того, каким способом вы запускаете службу:
Сокет
Измените dnscrypt-proxy.socket
, добавив следующее:
[Socket] ListenStream= ListenDatagram= ListenStream=127.0.0.1:53000 ListenStream=[::1]:53000 ListenDatagram=127.0.0.1:53000 ListenDatagram=[::1]:53000
Когда запрос перенаправляется из DNS-кэша на порт 53000
, dnscrypt-proxy.socket
автоматически запустит dnscrypt-proxy.service
.
Служба
Измените опцию listen_addresses
в файле /etc/dnscrypt-proxy/dnscrypt-proxy.toml
:
listen_addresses = ['127.0.0.1:53000', '[::1]:53000']
Примеры настройки локального кэша DNS
Приведённые настройки должны работать с dnscrypt-proxy, предполагая, что он слушает порт 53000
.
Unbound
Настройте Unbound как вам нужно (см. Unbound (Русский)#Локальный DNS сервер) и добавьте следующие строки в конце секции server
в файле /etc/unbound/unbound.conf
:
do-not-query-localhost: no forward-zone: name: "." forward-addr: ::1@53000 forward-addr: 127.0.0.1@53000
interface: 0.0.0.0@53
и access-control: ваша-сеть/маска-подсети allow
в секции server:
, чтобы другие устройства могли подключиться к этому серверу. Клиенты должны настраиваться опцией nameserver адрес-вашего-сервера
в файле /etc/resolv.conf
.Перезапустите unbound.service
для применения изменений.
dnsmasq
Настройте dnsmasq как локальный кэш DNS. Базовая конфигурация для работы с dnscrypt-proxy:
/etc/dnsmasq.conf
no-resolv server=::1#53000 server=127.0.0.1#53000 listen-address=::1,127.0.0.1
Если вы настроили dnscrypt-proxy на использование распознавателя с включенной проверкой DNSSEC, включите её и в dnsmasq тоже:
/etc/dnsmasq.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf dnssec
Перезапустите dnsmasq.service
для применения изменений.
pdnsd
Установите pdnsd. Базовая конфигурация для работы с dnscrypt-proxy:
/etc/pdnsd.conf
global { perm_cache = 1024; cache_dir = "/var/cache/pdnsd"; run_as = "pdnsd"; server_ip = 127.0.0.1; status_ctl = on; query_method = udp_tcp; min_ttl = 15m; # Хранить кэшированные записи не менее 15 минут. max_ttl = 1w; # Не более 1 недели. timeout = 10; # Глобальный таймаут (10 секунд). neg_domain_pol = on; udpbufsize = 1024; # Повышение лимита размера UDP-сообщений. } server { label = "dnscrypt-proxy"; ip = 127.0.0.1; port = 53000; timeout = 4; proxy_only = on; } source { owner = localhost; file = "/etc/hosts"; }
Перезапустите pdnsd.service
для применения изменений.
Включение EDNS0
EDNS позволяет, помимо других вещей, разрешить указать клиенту, насколько большим может быть UDP-ответ.
Добавьте следующую строку в /etc/resolv.conf
:
options edns0
Проверка EDNS0
Используйте DNS Reply Size Test Server, запустите утилиту drill для отправки TXT-запроса для адреса rs.dns-oarc.net:
$ drill rs.dns-oarc.net TXT
Если EDNS0 поддерживается, «answer section» будет содержать примерно такой вывод:
rst.x3827.rs.dns-oarc.net. rst.x4049.x3827.rs.dns-oarc.net. rst.x4055.x4049.x3827.rs.dns-oarc.net. "2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes" "2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096"