В этой статье хотелось бы рассмотреть нововведения Dnscrypt, на конкретном примере, который наверняка окажется для кого-то полезным.

Для тех, кто не знает, Dnscrypt — это уникальный протокол шифрования DNS-трафика. Он даёт возможность защитить DNS-коммуникации от перехватов и подмены, и к примеру, обойти блокировки реализуемые на уровне DNS-запросов.

Из основных возможностей новой версии, прежде всего, хочется отметить возможность коммуникации с сервером по протоколу TCP, что делает такой канал более стабильным и менее заметным.

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

Dnscrypt-proxy


В новой версии, переписанной автором на языке Go, настройки Dnscrypt-proxy хранятся в конфигурационном файле «dnscrypt-proxy.toml». Рассмотрим только интересующие параметры:

# Значение true включит проверку DNSSEC
require_dnssec = false
# Значение true позволит прокси серверу выполнять DNS-запросы по TCP.
force_tcp = false
# Здесь можно указать незашифрованный DNS-сервер, который будет использоваться в случае недоступности сервера DNSCrypt.
fallback_resolver = '9.9.9.9:53'

К слову, теперь DNSCrypt кэширует запросы и обновляет список серверов без необходимости какой-либо дополнительной настройки.

Dnsmasq


Dnsmasq будет принимать обычные DNS-запросы на 53 порте протокола UDP и перенаправлять их на DNSCrypt-proxy сервер.

/etc/dnsmasq.conf
no-resolv
# Адрес прокси-сервера DNSCrypt
server=127.0.0.1#5353
listen-address=127.0.0.1
proxy-dnssec

Блокирование рекламы


Заблокировать рекламу проще всего по средствам файла hosts. В интернете можно найти множество открытых источников, предоставляющих доступ к списку нежелательных доменов. Я пользуюсь вот этим репозиторием, предназаначенным для блокирования рекламы и прочего малозначимого контента. Репозиторий содержит скрипт, написанный на языке Python, который обновляет действующий hosts-файл в системе, согласно, собственно репозиторию. Чтобы автоматизировать этот процесс, достаточно создать в системе запланированное задание. Я делаю это так:

# crontab -e
@daily python /путь/к/репозиторию/hosts/updateHostsFile.py -ar

Параметр "-a" указывает скрипту исполнение в автоматическом режиме, то есть без необходимости подтверждения действий пользователем.

Параметр "-r" указывает скрипту заменять hosts-файл, действующий в системе.

Спасибо за внимание!

Комментарии (5)


  1. Antiever
    21.03.2018 08:25

    Заблокировать рекламу проще всего по средствам файла hosts

    Способ хорош, к сожалению некоторые ресурсы определяют отсутствие «контента» с запрещенных источников и блокируют содержимое полностью (например overclockers).


  1. stangri
    21.03.2018 08:25

    Спасибо за статью. Но если писать про DNSCrypt, наверно стоило бы также указать такую почти детективную историю, что старый разработчик (@jedisct1) сначала в прошлом году забросил, вроде, свой проект (из-за появления RFC на DNS over TSL: tools.ietf.org/html/rfc7858), в связи с чем @dyne просили отдать им управление проектом, в итоге сделали форк и переписали на Go, а потом @jedisct1 внезапно выложил обновление до 2.0.7, которое, впрочем, скорее всего будет последним.

    Так же, если кто-то все-таки захочет выбрать DNSCrypt, а не DNS-over-TLS (сравнение на английском языке «для чайников» тут: tenta.com/blog/post/2017/12/dns-over-tls-vs-dnscrypt), на роутере проще будет поднять все-таки вариант от @jedisct1.


    1. cybran24 Автор
      21.03.2018 08:37

      Спасибо за отзыв. Весьма полезная информация и думаю, стоит попробовать предложенный вами вариант.


  1. silmor_senedlen
    21.03.2018 21:08

    Какая-то очень обрывочная статья(скорее заметка), в которой всё перемешано.
    Вторая версия самого протокола DNSCrypt существует уже очень давно, а тут по факту речь о ветке 2.x dnscrypt-proxy.

    Из основных возможностей новой версии, прежде всего, хочется отметить возможность коммуникации с сервером по протоколу TCP

    Такая возможность присутствовала в dnscrypt-proxy уже очень давно(если не всегда), ещё до перехода на ветку 2.x. Из конфига версии 1.9.5:
    ## Do not send queries using UDP. Only use TCP.
    ## Even if some resolvers mitigate this, DNS over TCP is almost always slower
    ## than UDP and doesn't offer additional security.
    ## Only enable this option if UDP doesn't work on your network.

    # TCPOnly no


    И поддержка TCP транспорта является прямым требованием спецификации:

    The DNSCrypt protocol can use the UDP and TCP transport protocols.
    DNSCrypt Clients and resolvers should support the protocol over UDP
    and must support it over TCP.


    А вот действительной фичей dnscrypt-proxy 2.x является поддержка сразу нескольких серверов, автоматический выбор самых быстрых из них (из списка разрешённых), а также автоматический failover и load-balancing.

    Весь список различий относительно ветки 1.x можно посмотреть тут:
    github.com/jedisct1/dnscrypt-proxy/wiki/Differences-to-v1


    1. cybran24 Автор
      21.03.2018 21:11

      Благодарю, статья на уровне заметки, вы правы. Но написана исключительно исходя из благих намерений, может кому нибудь пригодится ;)