lorem

OS-Admin

"Системное администрирование – это культура"


Кеширующий DNS сервер с DNSCrypt


Опубликовано 24th Jul 2018 12:50:00 в категории Linux

Здравствуй, дорогой друг. Наверняка ты слышал про такие слова, как чистый DNS, защищенный DNS и так далее. Казалось бы, зачем нужен какой-то там "чистый" DNS? Я тебе расскажу. Чистым DNS называют такой DNS сервер, трафик до которого прозрачным образом перехватить нельзя. Все вы, наверное, сталкивались с тем, что при подключении к провайдеру вам дают его DNS, якобы лучше работающий. Здесь очень все сложно. Дело в том, что используя свой Интернет через такой DNS сервер, вы автоматом снимаете штаны и подставляете свою задницу прямо провайдеру и "большому дядьке", к их удочкам. Все DNS запросы будут логированы. Абсолютно, от слова абсолютно. Но если использовать альтернативный DNS, к примеру от Яндекс или Гугл, то это вовсе не означает, что штанишки вы не снимаете и повторно не подставляете задницу к удочке провайдера или "большого дяди". DNS запросы точно так же будут логироваться, что многим очень не нравится. Я не говорю, что мне, или соседу дяде Пете есть, что скрывать. Нет. Но есть такая вещь, как личная жизнь, и есть тайна личной жизни. Если тебе, дружище, как и мне не насрать на такие вещи, то необходимо прекращать использовать "рекомендуемые" DNS серверы, и поднять у себя сервис "DNSCrypt".

Основная задача DNSCrypt - это полное шифрование всего канала связи между клиентом и DNS-сервером. Шифрование DNS-трафика позволит защитить клиента от атак "человек посередине" (MitM), при которых злоумышленник вклинивается в канал связи и притворяется DNS-сервером. Кроме того, шифрование предотвращает наблюдение за трафиком и блокирует активность злоумышленников, связанную с подбором идентификаторов пакетов или отправкой фиктивных DNS-ответов. А коли хочется еще и быстрого DNS, то необходимо установить еще и такую вещь, как unbound.

Unbound - валидирующий, рекурсивный, кэширующий DNS-резолвер. Он спроектирован так, чтобы молниеносно обрабатывать запросы с минимальными требованиями. К тому же, он многопоточный. Конфигурабельный и легкой в понимании. Его мы будем состыковывать с DNSCrypt.
Итак, что нам нужно:

  1. Кофе, печеньки.
  2. Debian/Ubuntu/какой-то там ещё Linux
  3. DNSCrypt
  4. Unbound
  5. Прямые руки не из жопы

 

Будем считать, что ОС у тебя уже стоит. Далее следуют примеры на основе Debian 9, но оно будет справедливо для всех дистрибутивов, могут лишь отличаться пути к конфигам.

Итак, сперва установим DNSCrypt. Его нам предоставляет пакет dnscrypt-proxy. Установим его, а также плагины к нему:

apt install dnscrypt-proxy dnscrypt-proxy-plugins

 

Далее нам необходимо настроить сам DNSCrypt. Но прежде чем это сделать, нужно выбрать безопасный резолвер. Полный список резолверов располагается в /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv. Погугли в Интернете, какой тебе сможет подойти лучше всего. Я выбрал dnscrypt.eu-dk. Далее уже идем в конфиг DNSCrypt

cat /etc/dnscrypt-proxy/dnscrypt-proxy.conf

# Пример конфига также можно найти тут
# /usr/share/doc/dnscrypt-proxy/examples/dnscrypt-proxy.conf

#Выбираем резолвер
ResolverName dnscrypt.eu-dk

#Список резолверов
ResolversList /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv

#Укажем, где крутиться нашему DNSCrypt
LocalAddress 127.0.2.1:53

#Запретим запускаться как демон. Это нужно, чтобы выполнять сервис как службу systemd
Daemonize no

#Блокируем ipv6
BlockIPv6 yes

#Блокируем запросы АААА
Plugin libdcplugin_example_ldns_aaaa_blocking.la

 

По конфигу все довольно понятно и просто. Если ipv6 у тебя используется, то блокировку убери, иначе - обязательно убери ipv6 отовсюду. Также прочитай вот эту мою статейку, в которой я написал про блокирование АААА запросов. В конфиге уже это включено в последней строке.

Итак, включаем и запускаем сервис dnscrypt-proxy

● dnscrypt-proxy.service - DNSCrypt client proxy
Loaded: loaded (/lib/systemd/system/dnscrypt-proxy.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-06-27 11:00:10 +05; 3 weeks 6 days ago
Docs: man:dnscrypt-proxy(8)
Main PID: 5169 (dnscrypt-proxy)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/dnscrypt-proxy.service
└─5169 /usr/sbin/dnscrypt-proxy /etc/dnscrypt-proxy/dnscrypt-proxy.conf

июл 24 12:46:20 dns dnscrypt-proxy[5169]: Tue Jul 24 12:46:20 2018 [INFO] This certificate is valid
июл 24 12:46:20 dns dnscrypt-proxy[5169]: Tue Jul 24 12:46:20 2018 [INFO] Chosen certificate #808464433 is valid from [2017-09-11]

 

Работает! Далее установим unbound

apt install unbound

 

Идём в его конфиг, и настраиваем:

#Начинаем конфиг с этой строки
server:

#Указываем интерфейсы, на которых следует крутиться сервису
interface: ip_адрес_твоего_сервера@53
interface: 127.0.0.1@53

#Укажем, чтобы валидатор не отмечал ложные сообщения как неопределенные.
val-permissive-mode: no

#Отключить высирание сообщений в Syslog
use-syslog: no

#Указываем собственный лог-файл
logfile: "/etc/unbound/unbound.log"

#Уровень разговорчивости, бывает нужен для отладки, на продакшене ставим 0
verbosity: 0

#Если включено, идёт расширенная статистика из unbound-control
extended-statistics: yes

#Число потоков. Выставляем в зависимости от кол-ва ядер, если не скряга, конечно
num-threads: 2

###############################################
### Значения получены опытным путём
###############################################
# Число дескрипторов, которое может быть открыто на один поток.
outgoing-range: 206

#Количество исходящих буферов TCP для размещения в потоке
outgoing-num-tcp: 128

#Количество входящих буферов TCP для размещения в потоке
incoming-num-tcp: 128

#Буферное пространство входящих запросов
so-rcvbuf: 4m

#Буферное пространство исходящих запросов
so-sndbuf: 4m

#Количество байтов в кеше сообщений
msg-cache-size: 16m

#Количество 'плит' в кеше сообщений. Плиты снижают конфликт блокировок по потокам
msg-cache-slabs: 16

#Количество байтов в кеше RRset
rrset-cache-size: 16m

#Кол-во 'плит' в кеше RRset, для уменьшения риска конфликта блокировок по потокам
rrset-cache-slabs: 16

#Время жизни RRsets и сообщений в кеше
cache-min-ttl: 86400

#Наши любимые 'плитки'
infra-cache-slabs: 16
###############################################

#Контроль доступа. Здесь перечисляем наши подсети, которым разрешен доступ к DNS
#Действие allow_snoop дает нерекурсивный доступ.
access-control: 127.0.0.0/8 allow_snoop
access-control: 192.168.0.0/24 allow_snoop
access-control: 192.168.1.0/24 allow_snoop

#Имя юзера, от которого запускается сервис
username: "unbound"

#Не разрешаем localhost добавляться в do-not-query-address
do-not-query-localhost: no

#Элементы кэша сообщений предварительно заполняются,
#прежде чем они истекут, чтобы обновить кеш-память
prefetch: yes

#Unbound ротирует запрос RRSet в ответе
#(случайное число берется из идентификатора запроса,
#для скорости и безопасности потока)
rrset-roundrobin: yes

#Unbound не вставляет дополнительные разделы в ответные
#сообщения, когда эти разделы не требуются
minimal-responses: yes

#Отключаем ipv6
do-ip6: no

#Добавляем форвардеры. Можно добавить несколько форвардеров. В нашем случае
#только один - наш DNSCrypt
forward-zone:
name: "."
forward-addr: 127.0.2.1@53
#forward-addr: 1.1.1.1@53
#forward-addr: 1.0.0.1@53

 

Сохраняемся. Также приведем файл /etc/resolv.conf к следующему виду:

nameserver 127.0.0.1

 

Запускаем unbound, глядим:

● unbound.service - Unbound DNS server
Loaded: loaded (/lib/systemd/system/unbound.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-07-24 14:37:46 +05; 8min ago
Docs: man:unbound(8)
Process: 21269 ExecStartPre=/usr/lib/unbound/package-helper root_trust_anchor_update (code=exited, status=0/SUCCESS)
Process: 21265 ExecStartPre=/usr/lib/unbound/package-helper chroot_setup (code=exited, status=0/SUCCESS)
Main PID: 21275 (unbound)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/unbound.service
└─21275 /usr/sbin/unbound -d

июл 24 14:37:46 dns systemd[1]: Starting Unbound DNS server...
июл 24 14:37:46 dns package-helper[21269]: /var/lib/unbound/root.key has content
июл 24 14:37:46 dns package-helper[21269]: success: the anchor is ok
июл 24 14:37:46 dns systemd[1]: Started Unbound DNS server.

 

Также на ресурсе dnsleaktest можно проверить работу DNSCrypt.

Всё! Можно указывать наш DNS сервер на всех пк в локалке, убрать лишние DNS и получать удовольствие от сёрфинга на чистом, быстром и кеширующем DNS

 

 

 


Поделиться:


Теги
Comments System WIDGET PACK

Поддержите блог!