Calculate Forum

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

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

Вопросы сетевой безопасности становятся всё более и более актуальными. Традиционный 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, а заодно и рекламу порежут.
Безопасной работы всем!

У меня не получается запустить dnscrypt-proxy

# dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml
[2020-03-29 09:20:00] [NOTICE] dnscrypt-proxy 2.0.33
[2020-03-29 09:20:00] [NOTICE] Network connectivity detected
[2020-03-29 09:20:00] [NOTICE] Source [public-resolvers] loaded
[2020-03-29 09:20:00] [NOTICE] Source [relays] loaded
[2020-03-29 09:20:00] [NOTICE] Firefox workaround initialized
[2020-03-29 09:20:00] [FATAL] listen udp 127.0.0.1:53: bind: address already in use


# rc-service dnscrypt-proxy restart
dnscrypt-proxy     | * Stopping dnscrypt-proxy ...
dnscrypt-proxy     | * start-stop-daemon: no matching processes found                         [ ok ]
dnscrypt-proxy     | * Starting dnscrypt-proxy ...                                            [ ok ]


# rc-service dnscrypt-proxy status
 * status: crashed

Решил попробовать cloudflare.

Ну ясно дело 53-й порт занят. Вы пытаетесь и dnsmasq, и dnscrypt повесить на один и тот же порт. Перевесьте dnscrypt на порт с номером выше 1000. В моём примере 2053.

У меня установлен еще privoxy и частенько dnsrypt-proxy падает.
А как правильно вернуть в первоначальный вид? До этого я сделал бэкап

  • dnsmasq.conf
  • resolv.conf
  • hosts

Достаточно заменить их бэкапом?

Если больше ничего не меняли, то да, достаточно. Потом, ессно, перезапуститься.

Обновился dnsrypt-proxy. Установил заново. Теперь работает.

© 2007-2020 Calculate Ltd.
Mastodon Mastodon