Dnscrypt-proxy — Проксирование dns-трафика.

Установка, настройка, эксплуатация.
Ответить
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Dnscrypt-proxy — Проксирование dns-трафика.

Сообщение root »

Оглавление
Темы
Dnscrypt-proxy функциональность
В чем разница между DNSCrypt, DNSSEC, DNS over TLS/HTTPS?
Установка Dnscrypt-proxy
Исключение из проксирования запросов к локальному DNS-серверу
Выбор серверов и параметров для Dnscrypt-proxy
Дополнительные материалы
TOR
Wake on Lan: Удалённое включение компьютера
Синхронизация времени
OpenVPN: Открытая виртуальная частная сеть
BIND — DNS-сервер
ISCSI — Транспортный протокол для SCSI
QUAGGA — Протоколы динамической маршрутизации
  • шифрования dns-трафика,
  • проксирование dns-запросов,
  • Направление запросов для определенных доменов (по правилам) на определённый список DNS-серверов (forwarding),
  • Кэширование dns-запросов,
  • Блокировка на основе шаблонов (черные списки),
  • Белый список на основе шаблона (обход черных списков),
  • Ограничение доступа по времени,
  • Поддержка передачи своего трафика через прокси (SOCKS, HTTP/HTTPS proxy)
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


  • DNSCrypt может работать по UDP и TCP. Подключение на порт 443. Для шифрования используется собственный протокол, который отличается от HTTPS. Может быть легко выделен с помощью DPI. Это скорее черновик, который тестировали до внедрения DNS over TLS/HTTPS, так как он не имеет RFC, то есть не является официальным стандартом интернета. Вероятнее всего, в скором, времени он будет полностью вытеснен последними.
  • DNS over TLS (DoT) — TCP-подключение происходит на порт 853, внутри тоннеля передается обычный DNS-запрос. Провайдер видит, что это DNS запрос но не может в него вмешаться. При прочих равных, в DNS over TLS должно быть чуть меньше накладных расходов на каждый запрос, чем в over HTTPS.
  • DNS over HTTP (DoH) — TCP-подключение на порт 443, подобно обычному HTTPS. Внутри другой формат запроса, с HTTP-заголовками. Однако для провайдера такой запрос будет виден как обычное HTTPS-подключение. Полагаю, этот протокол был придуман на случай, когда DNS-запросы к чужим серверам будут заблокированы, чтобы маскировать под обычный веб трафик. А также, чтобы браузеры могли сами резолвить домены и не создавать при этом аномальный трафик.

    По сути, DNS over HTTPS и over TLS — одно и то же, с немного отличающемся форматом запросов. Оба эти протокола приняты в качестве стандартов и имеют RFC. Вероятнее всего, в ближайшее время мы увидим массовое распространение их обоих.
  • DNSSEC — протокол цифровой подписи DNS-записей. Не имеет отношения к шифрованию, так как все запросы передаются в открытом виде. Может работать как по старому классическому протоколу DNS, то есть UDP/TCP на порту 53, так и внутри DNS over TLS/HTTPS. Целью DNSSEC является подтверждение подлинности DNS-записи. Владелец домена может добавить публичный ключ на корневые сервера своей доменной зоны и подписывать все записи на мастер NS-серверах. По сути, к каждой DNS записи, например, A-записи или MX-записи, добавляется еще одна запись типа RRSIG, содержащая подпись. Процедура валидации DNSSEC на рекурсивном резолвере позволяет установить, действительно эта запись была создана владельцем домена.
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


  1. Устанавливаем dnscrypt

    Код: Выделить всё

    dnf install dnscrypt-proxy
  2. Модифицируем сервис
    Файлы сервиса и сокета написаны немного не правильно изначально и при смене интерфейса с loopback на любой иной socket отказывается запускаться при запуске системы. Во избежание проблем с запуском нужно править файлы

    Код: Выделить всё

    cp /usr/lib/systemd/system/dnscrypt-proxy.service /etc/systemd/system/
    Чтобы при обновлении пакета не заменялся модифицированный нами файл нужно скопировать или создать dnscrypt-proxy.service в каталог /etc/systemd/system/.
    cat /etc/systemd/system/dnscrypt-proxy.service

    Код: Выделить всё

    [Unit]
    Description=DNSCrypt-proxy client
    Documentation=https://github.com/jedisct1/dnscrypt-proxy/wiki
    ## Commenting 1 line
    #Requires=dnscrypt-proxy.socket
    After=network-online.target
    Wants=network-online.target
    Before=nss-lookup.target
    Wants=nss-lookup.target
    
    [Service]
    NonBlocking=true
    ExecStart=/usr/bin/dnscrypt-proxy --config /etc/dnscrypt-proxy/dnscrypt-proxy.toml
    
    DynamicUser=yes
    ProtectControlGroups=yes
    ProtectKernelModules=yes
    ProtectKernelTunables=yes
    
    CacheDirectory=dnscrypt-proxy
    ConfigurationDirectory=dnscrypt-proxy
    LogsDirectory=dnscrypt-proxy
    RuntimeDirectory=dnscrypt-proxy
    
    ## Add 2 lines. Allow binding to IP_ADDRESS:53 as non-root user without the .socket unit
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    
    [Install]
    ## Commenting 1 line
    #Also=dnscrypt-proxy.socket
    WantedBy=multi-user.target
  3. Перечитываем конфигурацию служб systemd после внесения изменений на предыдущем шаге

    Код: Выделить всё

    systemctl daemon-reload
  4. Меняем в файле /etc/dnscrypt-proxy/dnscrypt-proxy.toml директиву:

    Код: Выделить всё

    listen_addresses = []
    указывая там IP интерфейса и порт

    Код: Выделить всё

    listen_addresses = ['195.0.1.33:53']
  5. Стартуем dnscrypt-proxy и разрешаем автоматический запуск службы

    Код: Выделить всё

    systemctl enable --now dnscrypt-proxy.service
  6. Проверяем статус службы dnscrypt-proxy

    Код: Выделить всё

    systemctl status dnscrypt-proxy.service
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Данная ситуация возможна при наличии собственного DNS-сервера, который обслуживает локальную сеть. В этом случае IP dnscrypt-proxy используется в качестве DNS-сервера, а все запросы к локальному домену перенаправляются на DNS-сервер обслуживающий локальную сеть. Для пересылки запросов нужно раскомментировать строку

Код: Выделить всё

forwarding_rules = '/etc/dnscrypt-proxy/forwarding-rules.txt'
и отредактировать файл forwarding-rules.txt под параметры локальных DNS-зон

Код: Выделить всё

## Перенаправляем запросы для free-adm.ru и *.free-adm.ru на DNS-сервер 127.0.0.1
free-adm.ru     127.0.0.1
## Перенаправляем запросы для обратной зоны 1.0.195.in-addr.arpa на DNS-сервер 127.0.0.1
1.0.195.in-addr.arpa 127.0.0.1
test.ru         127.0.0.1
10.in-addr.arpa 127.0.0.1
==============
Включаем передачу трафика на петлевой интерфейс

Код: Выделить всё

$EDITOR /etc/sysctl.d/network.conf
# включаем пересылку пакетов на LOCALHOST
net.ipv4.conf.enp5s0.route_localnet=1
Применение внесённых изменений

Код: Выделить всё

sysctl -p /etc/sysctl.d/network.conf
Настраиваем перенаправление 53 порта tcp/udp на адрес 127.0.0.1 и порт 5353

Код: Выделить всё

firewall-cmd --list-forward-ports
port=53:proto=tcp:toport=5353:toaddr=127.0.0.1
port=53:proto=udp:toport=5353:toaddr=127.0.0.1
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Для подбора параметров и типа соединений можно использовать сайт dnscrypt.info, который предоставляет подробную информацию по публичным DNS-серверам.

Код: Выделить всё

quad9-doh-ip4-port443-nofilter-pri
Quad9 (anycast) no-dnssec/no-log/no-filter 9.9.9.10 - 149.112.112.10
Protocol	DoH
Addresses	[ "dns10.quad9.net", "149.112.112.10" ]
Ports	[ 443 ]
DNSSEC	false
No filters	true
No logs	true
Stamp	sdns://AgYAAAAAAAAADjE0OS4xMTIuMTEyLjEwILAZIHRLu3bJqwU-AeB7fgUORz0g95976kNfr-Q8nSQvE2RuczEwLnF1YWQ5Lm5ldDo0NDMKL2Rucy1xdWVyeQ
Этих данных более чем достаточно для внесения изменений в конфигурацию Dnscrypt-proxy. Из этого набора параметров нам потребуются лишь два - имя и протокол:

Код: Выделить всё

quad9-doh-ip6-port443-nofilter-pri
Protocol	DoH
Имя вносится в параметр server_names

Код: Выделить всё

server_names = ['quad9-doh-ip6-port443-nofilter-pri']
А протокол служит для выбора протокола. Dnscrypt-proxy поддерживает несколько протоколов для связи с вышестоящими серверами:

Код: Выделить всё

dnscrypt_servers = false
doh_servers = true
odoh_servers = false
В данный момент активен протокол DNS over HTTPS (DoH). Параметр выбора протокола напрямую завязан на выбранное имя сервера. Если допустить ошибку и выбрать не тот протокол, то запустить Dnscrypt-proxy будет невозможно
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Итоговая конфигурация Dnscrypt-proxy

Код: Выделить всё

server_names = ['quad9-doh-ip6-port443-nofilter-pri']
listen_addresses = [
    '195.0.1.3:53',
    '[2000:2cc0:13b1:3333::3]:53'
]
max_clients = 250
ipv4_servers = true
ipv6_servers = true
dnscrypt_servers = true
doh_servers = true
odoh_servers = false
require_dnssec = true
require_nolog = true
require_nofilter = false
disabled_server_names = []
force_tcp = false
http3 = false
timeout = 20000
keepalive = 15
log_level = 2
log_file = '/var/log/dnscrypt-proxy/dnscrypt-proxy.log'
log_file_latest = true
use_syslog = true
cert_refresh_delay = 240
bootstrap_resolvers = ['2606:4700:4700::1111:53', '[2606:4700:4700::1001]:53']
ignore_system_dns = true
netprobe_timeout = 60
netprobe_address = '8.8.8.8:53'
log_files_max_size = 10
log_files_max_age = 7
log_files_max_backups = 1
block_ipv6 = false
block_unqualified = true
block_undelegated = true
reject_ttl = 10
forwarding_rules = '/etc/dnscrypt-proxy/forwarding-rules.txt'
cache = true
cache_size = 8192
cache_min_ttl = 300  # Минимальное время хранения 5 минут
cache_max_ttl = 86400  # Максимальное время хранения 1 день
cache_neg_min_ttl = 0
cache_neg_max_ttl = 0
[captive_portals]
[local_doh]
[query_log]
format = 'tsv'
[nx_log]
format = 'tsv'
[blocked_names]
[blocked_ips]
[allowed_names]
[allowed_ips]
[schedules]
[sources]
  [sources.public-resolvers]
    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md', 'https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md']
    cache_file = '/var/cache/dnscrypt-proxy/public-resolvers.md'
    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
    refresh_delay = 72
    prefix = ''
  [sources.relays]
    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/relays.md', 'https://download.dnscrypt.info/resolvers-list/v3/relays.md']
    cache_file = '/var/cache/dnscrypt-proxy/relays.md'
    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
    refresh_delay = 72
    prefix = ''
[broken_implementations]
fragments_blocked = ['cisco', 'cisco-ipv6', 'cisco-familyshield', 'cisco-familyshield-ipv6', 'cleanbrowsing-adult', 'cleanbrowsing-adult-ipv6', 'cleanbrowsing-family', 'cleanbrowsing-family-ipv6', 'cleanbrowsing-security', 'cleanbrowsing-security-ipv6']
[doh_client_x509_auth]
[anonymized_dns]
skip_incompatible = true
Ответить