Протокол DNSCrypt медленно но верно получает распространение. Его поддержка по-тихоньку появляется в популярных DNS-серверах и сейчас уже каждый желающий может развернуть свой персональный DNSCrypt-сервер. Далее будет рассмотрен пример DNCrypt-сервера на базе балансировщика DNS-запросов dnsdist, разработанном создателями DNS-сервера PowerDNS.
Разворачивать наш DNSCrypt-сервер мы будем на VPS от Vultr под управлением Ubuntu 18.04. В Ubuntu пакет dnsdist собран без поддержки DNSCrypt, потому ставить dnsdist будем из официального репозитория PowerDNS. Первым шагом создадим файл «/etc/apt/sources.list.d/pdns.list» следующего содержания:
deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-dnsdist-13 main
Затем опишем приоритет этого репозитория в файле «/etc/apt/preferences.d/dnsdist»:
Package: dnsdist* Pin: origin repo.powerdns.com Pin-Priority: 600
Добавим ключ для проверки подписей пакетов:
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
И установим пакет dnsdist:
sudo apt-get update sudo apt-get install dnsdist
По умолчанию dnsdist не использует файл конфигурации. Чтобы это исправить надо скопировать файл «/lib/systemd/system/dnsdist.service» в директорию «/etc/systemd/system/» и отредактировать под наши задачи. Изменения минимальны:
#ExecStartPre=/usr/bin/dnsdist --check-config -u _dnsdist -g _dnsdist ExecStartPre=/usr/bin/dnsdist --check-config -u _dnsdist -g _dnsdist --config /etc/dnsdist/dnsdist.conf #ExecStart=/usr/bin/dnsdist --supervised --disable-syslog -u _dnsdist -g _dnsdist ExecStart=/usr/bin/dnsdist --supervised --disable-syslog -u _dnsdist -g _dnsdist --config /etc/dnsdist/dnsdist.conf
Закончив правки обновим конфигурацию systemd:
systemctl daemon-reload
Создадим директорию для хранения ключей нашего DNSCrypt-сервера:
mkdir -p /var/lib/dnsdist chown -vR _dnsdist:_dnsdist /var/lib/dnsdist
Далее нужно сгенерировать ключ для управления демоном:
echo 'makeKey()' | dnsdist -l 5555
В выводе этой команды нас интересует строка вида:
setKey("iR/y3Mp8zsUcfqYtiEVlt3jUj85uZdNAU+XaQxywqR8=")
Запоминаем эту строку и создаём файл конфигурации «/etc/dnsdist/dnsdist.conf»:
controlSocket('127.0.0.1:5199') setKey("iR/y3Mp8zsUcfqYtiEVlt3jUj85uZdNAU+XaQxywqR8=") newServer("8.8.8.8") newServer("8.8.4.4") setACL("0.0.0.0/0") setLocal('127.0.0.1:8853')
После создания файла конфигурации нам надо получить две временных метки: начала действия ключа сервера и окончания действия ключа сервера. Получить их можно командой:
date +%s && date +%s --date="2030-12-31 23:59:59"
Перезапускаем сервис и подключаемся к его консоли управления:
service dnsdist restart dnsdist -c
В консоли управления последовательно вводим команды:
generateDNSCryptProviderKeys("/var/lib/dnsdist/providerPublic.key", "/var/lib/dnsdist/providerPrivate.key") generateDNSCryptCertificate("/var/lib/dnsdist/providerPrivate.key", "/var/lib/dnsdist/resolver.cert", "/var/lib/dnsdist/resolver.key", 1, 1529585908, 1924981199)
Во вторую команду вместо 1529585908 и 1924981199 нужно подставить полученные ранее временные метки. Далее придумываем имя нашему серверу. Например «mydnscryptsrv». После чего дописываем в файл «/etc/dnsdist/dnsdist.conf» строку:
addDNSCryptBind("0.0.0.0:8854", "2.mydnscryptsrv", "/var/lib/dnsdist/resolver.cert", "/var/lib/dnsdist/resolver.key")
И ещё раз перезапускаем сервис:
service dnsdist restart
Получаем цифровой отпечаток сервера командой:
echo 'printDNSCryptProviderFingerprint("/var/lib/dnsdist/providerPublic.key")' | dnsdist -c
На этом конфигурация DNSCrypt-сервера завершена и можно перейти к настройке клиента. Если используется dnscrypt-proxy на машине под управлением Ubuntu 18.04 то достаточно привести файл «/etc/dnscrypt-proxy/dnscrypt-proxy.conf» к виду:
Daemonize no LocalAddress 127.0.2.1:53 ProviderName 2.usvpnyls ProviderKey цифровой_отпечаток_сервера ResolverAddress IP-сервера:8854
И перезапустить сервис:
service dnscrypt-proxy restart
Важно отметить что в данной конфигурации dnsdist не кэширует запросы. Кроме того доступ к нему разрешён всем желающим (правда они должны иметь ключ). Если надо ограничить доступ только определёнными IP-адресами то надо соответствующим образом отредактировать ACL.
На этом всё. Приятной работы!