DNSCrypt - это протокол, используемый для повышения безопасности DNS путем шифрования соединений между DNS-клиентом и DNS-резольвером. Он помогает пользователям общаться в Интернете в частном порядке, не беспокоясь о безопасности, предотвращая подмену DNS с помощью аутентификации. DNSCrypt использует криптографические подписи для проверки того, что ответы исходят от выбранного DNS-резольвера, и гарантирует, что они не были подделаны при передаче. DNSCrypt доступен для нескольких платформ, таких как macOS, Android, Linux и Windows, а также для маршрутизаторов.

Основными особенностями и преимуществами DNSCrypt являются:

  • Снижение задержки за счет кэширования ответов и отказа от запроса IPv6-адресов в сетях, использующих только IPv4.
  • Заставляет трафик использовать TCP, чтобы направить его через туннели только с TCP или Tor.
  • Локально блокирует рекламу, трекеры, вредоносное ПО, спам и любые сайты, чьи доменные имена или IP-адреса соответствуют заданному вами набору правил.
  • Позволяет просматривать DNS-трафик, исходящий из вашей сети, в режиме реального времени и обнаруживать скомпрометированные узлы и приложения, звонящие домой.
  • Предотвращает утечку запросов к локальным зонам.
  • Поддерживаются протоколы пересылки DNSCrypt v2, Anonymized DNSCrypt и DNS-over-HTTP (DoH), которые могут обслуживаться на одном и том же порту, обычно порту 443.

1. Установка зашифрованного DNS-сервера (DNSCrypt)

Существует несколько способов установки зашифрованного DNS-сервера (DNSCrypt). К ним относятся:

  • Использование предварительно скомпилированных двоичных файлов
  • компиляция из исходных текстов
  • Использование Docker

В этом руководстве мы узнаем, как установить зашифрованный DNS-сервер (DNSCrypt), используя предварительно скомпилированный двоичный файл x86_64. К сожалению, существуют двоичные файлы для систем Linux и Windows.

Для Linux вам нужна 64-битная система Debian/Ubuntu, тогда действуйте.

Сначала создайте каталог для DNSCrypt.

sudo mkdir -p /opt/encrypted-dns

В каталоге загрузите последнюю версию прекомпилированного пакета. На момент создания этой документации последней версией была 0.9.13.

Загрузите двоичный файл командой:

VER=$(curl -s https://api.github.com/repos/DNSCrypt/encrypted-dns-server/releases/latest|grep tag_name|cut -d '"' -f 4)
wget https://github.com/DNSCrypt/encrypted-dns-server/releases/download/$VER/encrypted-dns_${VER}_amd64.deb

После загрузки установите пакет:

sudo apt install -f ./encrypted-dns_*_amd64.deb

Образец вывода:

Selecting previously unselected package encrypted-dns.
(Reading database ... 187584 files and directories currently installed.)
Preparing to unpack encrypted-dns_0.9.13_amd64.deb ...
Unpacking encrypted-dns (0.9.13) ...
Setting up encrypted-dns (0.9.13) ...

2. Настройка зашифрованного DNS-сервера (DNSCrypt)

После установки Encrypted DNS Server(DNSCrypt) имеет пример конфигурационного файла, хранящегося по адресу /usr/share/doc/encrypted-dns/. Мы скопируем этот файл конфигурации в созданную нами директорию:

sudo cp /usr/share/doc/encrypted-dns/example-encrypted-dns.toml /opt/encrypted-dns/encrypted-dns.toml

Теперь мы можем соответствующим образом изменить этот файл конфигурации.

sudo nano /opt/encrypted-dns/encrypted-dns.toml

Здесь измените параметр listen_addrs на ваш IP-адрес, который доступен клиентам (это может быть публичный IP, если вы запускаете сервер в облаке).

listen_addrs = [
   { local = "0.0.0.0:443", external = "Your_ipv4_address:443" },
##   { local = "[::]:443", external = "[Your_ipv6_address]:443" }
]

Вам также может потребоваться изменить параметр upstream_addr, чтобы он указывал на ваш внутренний рекурсивный DNS-сервер, или оставить его как есть. Установите provider_name

## Upstream DNS server and port
upstream_addr = "1.1.1.1:53"

dnscrypt]
## Provider name (with or without the `2.dnscrypt-cert.` prefix)
provider_name = "example.com"

## Does the server support DNSSEC?
dnssec = true

## Does the server always returns correct answers (no filtering, including ad-blocking)?
no_filters = true

## Set to `true` if the server doesn't keep any information that can be used to identify users
no_logs = true

3. Запустите DNSCrypt в качестве системной службы

После того как конфигурация выполнена, нам необходимо создать файл службы systemd для DNSCrypt. Это можно сделать с помощью команды:

sudo bash -c 'cat << EOF > /etc/systemd/system/encrypted-dns.service
# /etc/systemd/system/dnscrypt-server.service
[Unit]
Description=DNSCrypt v2 server
ConditionFileIsExecutable=/usr/bin/encrypted-dns
After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/encrypted-dns -c /opt/encrypted-dns/encrypted-dns.toml
WorkingDirectory=/opt/encrypted-dns/
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF'

Запустите и включите службу:

sudo systemctl daemon-reload
sudo systemctl enable --now encrypted-dns

Проверьте, запущена ли служба:

$ systemctl status encrypted-dns
● encrypted-dns.service - DNSCrypt v2 server
     Loaded: loaded (/etc/systemd/system/encrypted-dns.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-11-27 13:34:33 EAT; 5s ago
   Main PID: 376198 (encrypted-dns)
      Tasks: 6 (limit: 4575)
     Memory: 16.6M
     CGroup: /system.slice/encrypted-dns.service
             └─376198 /usr/bin/encrypted-dns -c /opt/encrypted-dns/encrypted-dns.toml

Sad 27 13:34:33 dnscrypt.example.com systemd[1]: Started DNSCrypt v2 server.
Sad 27 13:34:33 dnscrypt.example.com encrypted-dns[376198]: [WARN  encrypted_dns] No state file found... creating a new provider key
....
Sad 27 13:34:33 dnscrypt.example.com encrypted-dns[376198]: [INFO  encrypted_dns] DNS Stamp: sdns://AQcAAAAAAAAADzg4Ljk5LjkyLjgxOjQ0MyBvFka8viUkAT9gkYMioJ5XjB>

Из приведенного выше результата можно сделать вывод, что сервер DNSCrypt установлен. В конце статуса службы мы видим DNS-штамп сервера DNSCrypt. Это кодирует все параметры, необходимые для подключения к безопасному DNS-серверу, в виде одной строки.

Теперь разрешите необходимые порты через брандмауэр:

sudo ufw allow 443
sudo ufw allow 53

4. Включите безопасный DNS на локальном устройстве

После запуска сервера DNSCrypt нам нужно использовать его для запросов DNS. В этом случае нам необходимо установить DNSCrypt-клиент. Существует длинный список реализаций клиента DNSCrypt. В этом руководстве мы установим DNSCrypt Proxy, который может находиться как на локальной, так и на удаленной системе.

Загрузите последнюю версию клиента:

VER=$(curl -s https://api.github.com/repos/DNSCrypt/dnscrypt-proxy/releases/latest|grep tag_name|cut -d '"' -f 4)
wget https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/$VER/dnscrypt-proxy-linux_x86_64-${VER}.tar.gz

После завершения извлеките архив:

tar xvf dnscrypt-proxy-linux_x86_64-${VER}.tar.gz
cd linux-x86_64

Создайте файл конфигурации и откройте его для редактирования:

cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
nano dnscrypt-proxy.toml

В этом файле сделайте следующие настройки и задайте имена ваших серверов.

server_names = ['myserver']

В списке публичных резолверов включено несколько провайдеров. В данном случае мы проигнорируем их и будем использовать пользовательский.

Далее удалите ‘#’ в начале следующих строк и укажите DNS-штамп вашего сервера DNSCrypt

[static]

   [static.'myserver']
   stamp = 'sdns://AQcAAAAAAAAAAAAQMi5kbnNjcnlwdC1jZXJ0Lg'

Не беспокойтесь о штампе DNS, поскольку его можно получить с помощью команды sudo systemctl status encrypted-dns на вашем сервере DNSCrypt.

Вы также можете задать список доменов, которые будут заблокированы:

[blocked_names]

## Path to the file of blocking rules (absolute, or relative to the same directory as the config file)

blocked_names_file = 'blocked-names.txt'
....

В каталоге находится файл-образец, который можно скопировать и отредактировать по своему усмотрению:

sudo cp example-blocked-names.txt blocked-names.txt

После внесения изменений сохраните конфигурацию и запустите прокси-службу DNSCrypt:

sudo ./dnscrypt-proxy --config dnscrypt-proxy.toml

Образец вывода:

[2023-10-31 14:16:36] [NOTICE] dnscrypt-proxy 2.1.5
[2023-10-31 14:16:36] [NOTICE] Network connectivity detected
[2023-10-31 14:16:36] [NOTICE] Now listening to 127.0.0.1:53 [UDP]
[2023-10-31 14:16:36] [NOTICE] Now listening to 127.0.0.1:53 [TCP]
[2023-10-31 14:16:36] [NOTICE] Service is not usable yet
[2023-10-31 14:16:36] [NOTICE] Resolving server host [raw.githubusercontent.com] using bootstrap resolvers over udp
[2023-10-31 14:16:36] [NOTICE] Source [public-resolvers] loaded
[2023-10-31 14:16:36] [NOTICE] Service is not usable yet
[2023-10-31 14:16:36] [NOTICE] Resolving server host [download.dnscrypt.info] using bootstrap resolvers over udp
[2023-10-31 14:16:36] [NOTICE] Source [relays] loaded
[2023-10-31 14:16:36] [NOTICE] Firefox workaround initialized
[2023-10-31 14:16:36] [NOTICE] [myserver] OK (DNSCrypt) - rtt: 0ms
[2023-10-31 14:16:36] [NOTICE] Server with the lowest initial latency: myserver (rtt: 0ms)
[2023-10-31 14:16:36] [NOTICE] dnscrypt-proxy is ready - live servers: 1

Теперь вы готовы отправлять безопасные DNS-запросы с клиента на сервер DNSCrypt. Чтобы проверить, проходят ли все DNS-запросы через 127.0.0.1:53, вам нужно открыть отдельный терминал и отредактировать файл /etc/resolv.conf, как показано на рисунке:

$ sudo nano /etc/resolv.conf
nameserver 127.0.0.1
#options edns0 trust-ad
search .

Выполните следующую команду, чтобы проверить, обрабатываются ли DNS-запросы с помощью DNSCrypt так, как ожидалось.

$ nslookup example.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	example.com
Address: 93.184.216.34
Name:	example.com
Address: 2606:2800:220:1:248:1893:25c8:1946

Это свидетельствует о том, что трафик обрабатывается сервером DNSCrypt безопасно.

Запустите dnscrypt-proxy Client в качестве службы systemd

Мы также можем настроить эту службу на запуск в качестве системной службы:

sudo bash -c 'cat << EOF > /etc/systemd/system/encrypted-dns.service
# /etc/systemd/system/dnscrypt-server.service
[Unit]
Description=DNSCrypt v2 server
ConditionFileIsExecutable=/usr/bin/encrypted-dns
After=syslog.target network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/encrypted-dns -c /opt/encrypted-dns/encrypted-dns.toml
WorkingDirectory=/opt/encrypted-dns/
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF'

Скопируйте файлы в нужные каталоги:

sudo mkdir /opt/dnscrypt-proxy
sudo cp ~/linux-x86_64/* /opt/dnscrypt-proxy/
sudo cp ~/linux-x86_64/dnscrypt-proxy /usr/local/bin

Остановите запущенную службу:

sudo killall -9 dnscrypt-proxy

Запустите службу dnscrypt-proxy:

sudo systemctl enable --now dnscrypt-proxy

Проверьте, запущена ли служба:

$ systemctl status dnscrypt-proxy
● dnscrypt-proxy.service - DNSCrypt v2 server
     Loaded: loaded (/etc/systemd/system/dnscrypt-proxy.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-10-31 16:30:16 EAT; 5s ago
   Main PID: 868360 (dnscrypt-proxy)
      Tasks: 6 (limit: 4617)
     Memory: 7.8M
        CPU: 22ms
     CGroup: /system.slice/dnscrypt-proxy.service
             └─868360 /usr/local/bin/dnscrypt-proxy --config /opt/dnscrypt-proxy/dnscrypt-proxy.toml

Okt 31 16:30:16 example.com dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Network connectivity detected
Okt 31 16:30:16 example.com dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Now listening to 127.0.0.1:53 [UDP]
Okt 31 16:30:16 example.com dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Now listening to 127.0.0.1:53 [TCP]
Okt 31 16:30:16 example.com dnscrypt-proxy[868360]: [2023-10-31 16:30:16] [NOTICE] Source [relays] loaded
....

Проверьте, обрабатывает ли он DNS-запросы:

$ nslookup example.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	example.com
Address: 93.184.216.34
Name:	example.com
Address: 2606:2800:220:1:248:1893:25c8:1946

Вывод

Поздравляем! На этом мы заканчиваем это подробное руководство по установке и настройке зашифрованного DNS-сервера (DNSCrypt).

Если вам понравился эта беззаботная статья о том, как настроить DNSCrypt на Debian 12, поделитесь им с друзьями в социальных сетях или просто оставьте ответ в разделе комментариев. Спасибо.