DNSCrypt на OpenWRT (LEDE)

На официальной вики есть обновляемый мануал по данной теме, здесь краткий пересказ про конфиг с несколькими DNS серверами.

Зачем это нужно?

Вольно процитирую один технический подкаст: «Зачем ставить замки? В квартиру можно пробраться кучей разных способов – взломать замок, выбить дверь, разбить окно… Замок это сдерживающая мера, защита от дурака, профессионала она не остановит, но зато остановит основную массу доброжелателей.»
Реальность такова, что информацию (данные) о пользователях интернета собирают все, в меру своих знаний и возможностей. Данные и метаданные по текучести и гранулярности как вода, невозможно быть полностью стерильным, т.е. обезвоженным. Поэтому, если вас это как-то беспокоит, единственный способ защитить себя – уменьшать количество отдаваемой информации в сети, т.к. законодательство в данной сфере будет развиваться и догонять реальность ещё десятилетия.

Во времена создания протоколов базовой инфраструктуры интернета особо не задумывались о безопасности, поэтому со временем к ним в дополнение стали создаваться костыли и улучшения, а параллельно ещё и новые протоколы и решения. В связи с тем, что интернет распределённая сеть, отказаться от фундаментальных технологий и перевести всех пользователей на новые протоколы практически невозможно, остаётся только самостоятельно начинать ими пользоваться.

DNSCrypt шифрует ваши DNS запросы, это защищает от слежения за вашим DNS трафиком. Отслеживаемый DNS трафик позволяет идентифицировать вас по статистике запросов (несколько лет Яндекс назад хвастался что может идентифицировать пользователя примерно с 75% вероятностью по поведенческим признакам, а прогресс не стоит на месте), даже если вы пользуетесь интернетом с другого устройства, позволяет собирать эту информацию и использовать её в коммерческих целях, так, по некоторым данным делает Google (те самые 8.8.8.8 и 8.8.4.4), а возможно и (любые) другие добрые люди.
DNSCrypt защищает от MITM атак, например когда провайдер или злоумышленник подменяет ответ на ваш DNS запрос и вы попадаете совсем не на тот сайт, на который рассчитывали попасть, это может быть как заблокированный в соответствии с законодательством сайт, так и например сайт банка или социальной сети, визуально неотличимый от оригинала.

DNSCrypt не спасает в случае недобросовестности DNS сервера (минутку, я записываю!), от слежения за всем прочим вашим трафиком (кем угодно по пути следования трафика, как минимум это системы DPI и СОРМ), от перехвата вашего остального трафика, особенно незашифрованного.
Так же надо иметь в виду, что поднимая VPN, вы скорее всего получаете DNS сервер своего VPN провайдера и он становится приоритетным в операционной системе, а что уж он о вас собирает – может варьироваться от ничего до абсолютно всё.

Настраиваем DNSCrypt на OpenWRT

На самом деле для админа или сетевика это не сложно, особенно когда есть готовые мануалы и Wiki.

LEDE откололся от OpenWRT в 2016 году, но в 2018 они снова слились, поэтому будем считать что сейчас это одно и то же. Плюсами ОС является стабильность и богатый функционал, расширяемый пакетами. В минусы можно записать сложность настройки для неподготовленного пользователя, а так же поддержку ограниченного количества чипов, на которых построены дохленькие домашние роутеры, и на них часто патологически не хватает памяти.

Раньше для работы с несколькими серверами требовалось менять скрипт dnscrypt-proxy, теперь благодаря стараниям black-roland достаточно поставить модифицированный пакет. Дальнейшая инструкция приводится для релиза Chaos Calmer (ветка 15.05). Какая версия софта (и соответственно пакета) нужна вам, можно определить на страничке вашей модели устройства на официальном сайте проекта.

Если места в памяти не хватает (можно посмотреть через df -h или opkg ругнётся) нужно удалить старые пакеты dnscrypt-proxy и libsodium, возможно потребуется применить силу, так же надо иметь хотя бы один рабочий DNS сервер в конфиге, иначе как же вы скачаете новые пакеты. Если обновить только dnscrypt-proxy, без библиотеки, то сервис не будет запускаться.

Идём в веб-интерфейс (LuCI) и в консоль через ssh. В веб-интерфейс на всякий случай, можно например сделать бэкап конфига и посмотреть как поживает роутер, версию софта и т.д.

/etc/init.d/dnscrypt-proxy stop
ps | grep dns
opkg remove dnscrypt-proxy
opkg remove libsodium --force-depends
cd /tmp
wget 'http://exopenwrt.roland.black/exopenwrt.pub'
opkg-key add exopenwrt.pub
echo '/etc/opkg/keys/1a929a1dd62138c1' >> /etc/sysupgrade.conf
echo 'src/gz exopenwrt http://exopenwrt.roland.black/chaos_calmer/15.05.1/ar71xx/packages/exopenwrt' >> /etc/opkg.conf
opkg update
opkg install dnscrypt-proxy
opkg install libsodium

К слову, версия пакета из этого репозитория для Chaos Calmer:
root@OpenWrt:~# dnscrypt-proxy -V
dnscrypt-proxy 1.7.0

Забираем свежий список серверов, причём это ссылка не на официальный сайт DNSCrypt, там список в другом формате.
https://raw.githubusercontent.com/dyne/dnscrypt-proxy/master/dnscrypt-resolvers.csv
В OpenWRT нет openssl, поэтому файл открываем через браузер, копируем содержимое.

echo "" > /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv
vi /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv

Входим в режим редактирования i
Вставляем текст с помощью Control+Insert
Выходим из режима редактирования Esc
Сохраняем и выходим :wq

Редактируем конфигурационные файлы. Имена DNS серверов (option resolver) взяты произвольно, лучше пропинговать каждый выбранный сервер и убедиться что он живой.

vi /etc/config/dnscrypt-proxy
config 'dnscrypt-proxy' 'ns1'
option address '127.0.0.1'
option port '5353'
option resolver 'cs-de3'
option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
config 'dnscrypt-proxy' 'ns2'
option address '127.0.0.1'
option port '5454'
option resolver 'cs-fr2'
option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
vi /etc/resolv-crypt.conf
options timeout:1
vi /etc/config/dhcp
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option localservice '1'
option resolvfile '/etc/resolv-crypt.conf'
list server '/pool.ntp.org/208.67.222.222'
list server '127.0.0.1#5353'
list server '127.0.0.1#5454'

config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv6 'server'
option ra 'server'
option ra_management '1'

config dhcp 'wan'
option interface 'wan'
option ignore '1'

config odhcpd 'odhcpd'
option maindhcp '0'
option leasefile '/tmp/hosts/odhcpd'
option leasetrigger '/usr/sbin/odhcpd-update'

(Пере)запускаем сервисы.

/etc/init.d/dnscrypt-proxy restart
/etc/init.d/dnsmasq restart

Проверка

Проверяем что сервисы запустились.

ps | grep dns
logread | grep -n "using nameserver"
logread | grep "Proxying from"

Вывод, соответственно, должен содержать сообщения вида:

/usr/sbin/dnscrypt-proxy -a 127.0.0.1:5353 -u nobody -L /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv -R имя_DNS_сервера_из_конфига
dnsmasq[XXXX]: using nameserver 127.0.0.1#5353
daemon.notice dnscrypt-proxy[XXXX]: Proxying from 127.0.0.1:5353 to XXX.XXX.XXX.XXX

На всякий случай проверяем какой DNS сервер используется на нашем устройстве в данный момент:
https://dnsleaktest.com
https://ipleak.net
Предполагается что наше устройство (ПК, ноутбук, планшет…) получает адрес DNS сервера по DHCP от настраиваемого роутера.

Бонус

Особенно полезно для мобильных девайсов и некоторых приложений, в которых «hardcoded» свои DNS серверы.
Добавляем пользовательские правила в фаервол. В веб интерфейсе Network → Firewall → Custom Rules, в консоли vi /etc/firewall.user, что в принципе одно и то же.

iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53

Если есть необходимость периодически проверять работу DNS в обход DNS Crypt, перед этими строчками можно добавить:

iptables -t nat -I PREROUTING -p tcp --dport 53 --d ip_адрес_сервера -j ACCEPT
iptables -t nat -I PREROUTING -p udp --dport 53 --d ip_адрес_сервера -j ACCEPT

Решение некоторых проблем

Диагностируется просто – перестают резолвиться домены, проблема в недоступности сервера, либо у сервера что-то не в порядке с сертификатом. Так же, теоретически, такие запросы может блокировать провайдер своим DPI, но пока что я не знаю как это продиагностировать.
Проблема обнаруживается в выводе команды:

logread | grep dnscrypt
Thu Feb  7 19:49:57 2019 daemon.notice dnscrypt-proxy[1846]: Starting dnscrypt-proxy 1.7.0
Thu Feb 7 19:49:57 2019 daemon.info dnscrypt-proxy[1846]: Generating a new session key pair
Thu Feb 7 19:49:57 2019 daemon.notice dnscrypt-proxy[1845]: Starting dnscrypt-proxy 1.7.0
Thu Feb 7 19:49:57 2019 daemon.info dnscrypt-proxy[1845]: Generating a new session key pair
Thu Feb 7 19:49:57 2019 daemon.info dnscrypt-proxy[1846]: Done
Thu Feb 7 19:49:57 2019 daemon.info dnscrypt-proxy[1845]: Done
Thu Feb 7 19:50:12 2019 daemon.err dnscrypt-proxy[1846]: Unable to retrieve server certificates
Thu Feb 7 19:50:12 2019 daemon.err dnscrypt-proxy[1845]: Unable to retrieve server certificates
Thu Feb 7 19:50:13 2019 daemon.info dnscrypt-proxy[1846]: Refetching server certificates
Thu Feb 7 19:50:13 2019 daemon.info dnscrypt-proxy[1845]: Refetching server certificates

Нужно проверить что список серверов обновлён и выбрать живые серверы с непросроченным сертификатом. После смены серверов:

Thu Feb  7 20:01:18 2019 daemon.notice dnscrypt-proxy[1916]: Starting dnscrypt-proxy 1.7.0
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: Generating a new session key pair
Thu Feb 7 20:01:18 2019 daemon.notice dnscrypt-proxy[1917]: Starting dnscrypt-proxy 1.7.0
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1917]: Generating a new session key pair
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: Done
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1917]: Done
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: Server certificate with serial #<cut> received
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: This certificate is valid
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: Chosen certificate #<cut> is valid from [2019-01-02] to [2020-01-02]
Thu Feb 7 20:01:18 2019 daemon.info dnscrypt-proxy[1916]: Server key fingerprint is <cut>
Thu Feb 7 20:01:18 2019 daemon.notice dnscrypt-proxy[1916]: Proxying from 127.0.0.1:5353 to <cut>:443
Thu Feb 7 20:01:19 2019 daemon.info dnscrypt-proxy[1917]: Server certificate with serial #<cut> received
Thu Feb 7 20:01:19 2019 daemon.info dnscrypt-proxy[1917]: This certificate is valid
Thu Feb 7 20:01:19 2019 daemon.info dnscrypt-proxy[1917]: Chosen certificate #<cut> is valid from [2019-01-18] to [2020-01-18]
Thu Feb 7 20:01:19 2019 daemon.info dnscrypt-proxy[1917]: Server key fingerprint is <cut>
Thu Feb 7 20:01:19 2019 daemon.notice dnscrypt-proxy[1917]: Proxying from 127.0.0.1:5454 to <cut>:443

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *