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.
1
| sudo mkdir -p /opt/encrypted-dns
|
В каталоге загрузите последнюю версию прекомпилированного пакета. На момент создания этой документации последней версией была 0.9.13.
Загрузите двоичный файл командой:
1
2
| 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
|
После загрузки установите пакет:
1
| sudo apt install -f ./encrypted-dns_*_amd64.deb
|
Образец вывода:
1
2
3
4
5
| 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/. Мы скопируем этот файл конфигурации в созданную нами директорию:
1
| sudo cp /usr/share/doc/encrypted-dns/example-encrypted-dns.toml /opt/encrypted-dns/encrypted-dns.toml
|
Теперь мы можем соответствующим образом изменить этот файл конфигурации.
1
| sudo nano /opt/encrypted-dns/encrypted-dns.toml
|
Здесь измените параметр listen_addrs
на ваш IP-адрес, который доступен клиентам (это может быть публичный IP, если вы запускаете сервер в облаке).
1
2
3
4
| 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| ## 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. Это можно сделать с помощью команды:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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'
|
Запустите и включите службу:
1
2
| sudo systemctl daemon-reload
sudo systemctl enable --now encrypted-dns
|
Проверьте, запущена ли служба:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $ 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-серверу, в виде одной строки.
Теперь разрешите необходимые порты через брандмауэр:
1
2
| sudo ufw allow 443
sudo ufw allow 53
|
4. Включите безопасный DNS на локальном устройстве#
После запуска сервера DNSCrypt нам нужно использовать его для запросов DNS. В этом случае нам необходимо установить DNSCrypt-клиент. Существует длинный список реализаций клиента DNSCrypt. В этом руководстве мы установим DNSCrypt Proxy, который может находиться как на локальной, так и на удаленной системе.
Загрузите последнюю версию клиента:
1
2
| 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
|
После завершения извлеките архив:
1
2
| tar xvf dnscrypt-proxy-linux_x86_64-${VER}.tar.gz
cd linux-x86_64
|
Создайте файл конфигурации и откройте его для редактирования:
1
2
| cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
nano dnscrypt-proxy.toml
|
В этом файле сделайте следующие настройки и задайте имена ваших серверов.
1
| server_names = ['myserver']
|
В списке публичных резолверов включено несколько провайдеров. В данном случае мы проигнорируем их и будем использовать пользовательский.
Далее удалите ‘#’ в начале следующих строк и укажите DNS-штамп вашего сервера DNSCrypt
1
2
3
4
| [static]
[static.'myserver']
stamp = 'sdns://AQcAAAAAAAAAAAAQMi5kbnNjcnlwdC1jZXJ0Lg'
|
Не беспокойтесь о штампе DNS, поскольку его можно получить с помощью команды sudo systemctl status encrypted-dns
на вашем сервере DNSCrypt.
Вы также можете задать список доменов, которые будут заблокированы:
1
2
3
4
5
6
| [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'
....
|
В каталоге находится файл-образец, который можно скопировать и отредактировать по своему усмотрению:
1
| sudo cp example-blocked-names.txt blocked-names.txt
|
После внесения изменений сохраните конфигурацию и запустите прокси-службу DNSCrypt:
1
| sudo ./dnscrypt-proxy --config dnscrypt-proxy.toml
|
Образец вывода:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [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
, как показано на рисунке:
1
2
3
4
| $ sudo nano /etc/resolv.conf
nameserver 127.0.0.1
#options edns0 trust-ad
search .
|
Выполните следующую команду, чтобы проверить, обрабатываются ли DNS-запросы с помощью DNSCrypt так, как ожидалось.
1
2
3
4
5
6
7
8
9
| $ 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#
Мы также можем настроить эту службу на запуск в качестве системной службы:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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'
|
Скопируйте файлы в нужные каталоги:
1
2
3
| sudo mkdir /opt/dnscrypt-proxy
sudo cp ~/linux-x86_64/* /opt/dnscrypt-proxy/
sudo cp ~/linux-x86_64/dnscrypt-proxy /usr/local/bin
|
Остановите запущенную службу:
1
| sudo killall -9 dnscrypt-proxy
|
Запустите службу dnscrypt-proxy:
1
| sudo systemctl enable --now dnscrypt-proxy
|
Проверьте, запущена ли служба:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ 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-запросы:
1
2
3
4
5
6
7
8
9
| $ 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, поделитесь им с друзьями в социальных сетях или просто оставьте ответ в разделе комментариев. Спасибо.