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. Установил заново. Теперь работает.

С недавнего времени не могу теперь обновить или пересобрать пакеты. Даже вручную скачать их не могу.

Пересборка зависимых модулей
 * Обновление модулей ядра ...                                                                [ ok ]
 * (1 из 2) Broadcom's IEEE 802.11a/b/g/n hybrid Linux device driver
 * Сборка net-wireless/broadcom-sta-6.30.223.271-r6 ...                                       [ ok ]
Resolving docs.broadcom.com (docs.broadcom.com)... failed: Temporary failure in name resolution.
wget: unable to resolve host address ‘docs.broadcom.com’
!!! Couldn't download 'hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz'. Aborting.
 * Fetch failed for 'net-wireless/broadcom-sta-6.30.223.271-r6', Log file:
 *  '/var/calculate/tmp/portage/net-wireless/broadcom-sta-6.30.223.271-r6/temp/build.log'

 * Messages for package net-wireless/broadcom-sta-6.30.223.271-r6:

 * 
 * If you are stuck using this unmaintained driver (likely in a MacBook),
 * you may be interested to know that a newer compatible wireless card
 * is supported by the in-tree brcmfmac driver. It has a model number 
 * BCM943602CS and is for sale on the second hand market for less than 
 * 20 USD.
 * 
 * See https://wikidevi.com/wiki/Broadcom_Wireless_Adapters and
 *     https://wikidevi.com/wiki/Broadcom_BCM943602CS
 * for more information.
 * 

 * Messages for package x11-drivers/nvidia-drivers-460.27.04:

 *   CONFIG_I2C_NVIDIA_GPU:	 should not be set. But it is.
 * Please check to make sure these options are set correctly.
 * Failure to do so may cause unexpected problems.

 * Messages for package net-wireless/broadcom-sta-6.30.223.271-r6:

 * Fetch failed for 'net-wireless/broadcom-sta-6.30.223.271-r6', Log file:
 *  '/var/calculate/tmp/portage/net-wireless/broadcom-sta-6.30.223.271-r6/temp/build.log'
 * Выполнение Emerge завершилось с ошибкой
 * Не удалось обновить

wget https://docs.broadcom.com/docs-and-downloads/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
--2021-02-01 10:33:39--  https://docs.broadcom.com/docs-and-downloads/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
Распознаётся docs.broadcom.com (docs.broadcom.com)… ошибка: Временный сбой в разрешении имен.
wget: не удаётся разрешить адрес «docs.broadcom.com»

Обратил внимание на /var/log/dnscrypt-proxy/blocked.log

127.0.0.1	docs.broadcom.com	*ad*
127.0.0.1	us.download.nvidia.com	*ad*
127.0.0.1	download.nvidia.com	*ad*

Забивать в белый список - бесполезно.

dnsmasq.conf

no-resolv
server=127.0.0.1#2053
listen-address=127.0.0.1
localise-queries
proxy-dnssec

resolv.conf

# Generated by NetworkManager
nameserver 127.0.0.1
options edns0

В арче схожие настройки, но проблем таких нет. На эти блокированные адреса захожу без проблем.

Разобрался, надеюсь. Перестарался с фильтрацией контента blacklist.txt.