Calculate Forum

DNSCrypt: первый опыт использования

#1

Доброго всем времени суток!

Вопросы сетевой безопасности становятся всё более и более актуальными. Традиционный DNS при этом является одним из наиболее уязвимых мест во всей цепочке, поэтому я решил поиграться с новыми технологиями. Шифрованный DNS может быть хорошим решением в двух крайних случаях: если вы хотите иметь интернет без цензуры и слежки (в сочетании с VPN), или наоборот, когда вам нужно, скажем, оградить неокрепшую психику своих детей от неокрепшей психики окружающих взрослых. Также он может оказаться полезен и просто по жизни, учитывая масштабы провайдерских (и не только!) манипуляций с DNS трафиком. И вообще, “Выживут только параноики!”: чем меньше дыр, тем спокойней сон админа :slight_smile: Манипуляции с DNS – излюбленный приём всяческих мошенников.

На одном из подшефных мне шлюзов как раз и встала задача №2, ибо оказалось, что простое прописывание family-friendly DNS проблему решает далеко не полностью, даже отвлекаясь от возможного творчества провайдеров.

На шлюзе шуршал себе dnsmasq, раздавал DHCP и заодно кешировал DNS запросы. DNSCrypt v2 тоже научился кешировать, но поскольку DHCP всё равно нужен, dnsmasq был оставлен, но перенастроен на работу с dnsrypt-proxy в качестве апстрима.

Схема такова. Все DNS запросы от пользователей принудительно заворачиваются с помощью shorewall (ну или iptables, как кому больше нравится) на 53 порт шлюза (на котором по-прежнему висит dnsmasq). Он перенаправляет их на 127.0.0.1#2053, а этот порт уже слушает dnscrypt-proxy и посылает внешние запросы именно он. Таким образом весь DNS трафик за пределами локальной сети шифруется.

Итак, настройка.

/etc/hosts

127.0.0.1 localhost.lan localhost
192.168.1.1 server.lan server

/etc/resolv.conf

nameserver 127.0.0.1
options edns0

Не забываем сделать

chattr +i /etc/resolv.conf 

а то все кому не лень этот файл любят переписывать.

/etc/dnsmasq.conf

no-resolv
local=/lan/
server=127.0.0.1#2053
listen-address=127.0.0.1,192.168.1.1
domain=lan
dhcp-range=192.168.1.20,192.168.1.28,12h
localise-queries
proxy-dnssec

Настроечный файл dnscrypt-proxy достаточно велик, поэтому приведён в приложении. Он настроен на изпользование “детских” резольверов. Чтобы они стали видимыми, надо выставить настройку require_nofilter = false Также модифицирован ключ require_nolog = false, убирающий требование к резолверу не вести логи.
Помимо безопасности DNS запросов, такая схема позволяет легко добавлять собственные чёрные списки URL и IP адресов, например, скачивая их еженощно по крону. Примеры списков лежат в /etc/dnscrypt-proxy/ и могут быть модифицированы (убираем example- из имени и разрешаем их использование в dnscrypt-proxy.toml).

Кроме того, есть такая удобная штука как сloacking – позволяет набросать свой список перенаправлений (например, все запросы к google перенаправлять безусловно на forcefamilysearch.google.com). Также этот механизм позволяет перенаправить запросы к не family-friendly поисковикам (тот же duckduckgo) на любой безопасный поисковик или на 127.0.0.1, или куда угодно ещё. Адресат может быть как IP адресом, так и доменом DNS. dnsmasq этого не умеет – ему либо IP подавай, либо имя из /etc/hosts.

Замеченные проблемы. Текущая версия не умеет переоткрывать лог-файлы без перезапуска сервиса (нужно для корректной работы logrotate). Багрепорт отправлен))

Таким образом можно несложно организовать на шлюзе безопасный Интернет на основе фильтрации DNS запросов. Если нужно что-либо более продвинутое, то наше всё – это squid + фильтры, которые позволят фильтровать уже на уровне URL, а заодно и рекламу порежут.
Безопасной работы всем!

Mastodon Mastodon