Доброго всем времени суток!
Вопросы сетевой безопасности становятся всё более и более актуальными. Традиционный DNS при этом является одним из наиболее уязвимых мест во всей цепочке, поэтому я решил поиграться с новыми технологиями. Шифрованный DNS может быть хорошим решением в двух крайних случаях: если вы хотите иметь интернет без цензуры и слежки (в сочетании с VPN), или наоборот, когда вам нужно, скажем, оградить неокрепшую психику своих детей от неокрепшей психики окружающих взрослых. Также он может оказаться полезен и просто по жизни, учитывая масштабы провайдерских (и не только!) манипуляций с DNS трафиком. И вообще, “Выживут только параноики!”: чем меньше дыр, тем спокойней сон админа Манипуляции с 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, а заодно и рекламу порежут.
Безопасной работы всем!