Утечка DNS (DNS Leak) — это явление, при котором информация о Ваших DNS-запросах доступна третьей стороне не смотря на использование защищенного VPN-подключения, в результате чего происходит сбор истории посещенных сайтов, а собранная информация используется в различных целях, в т.ч. для формирования аналитики о Ваших предпочтениях, построения рекламной воронки и т.д.. В данной статье мы расскажем как предотвратить утечку DNS и повысить конфиденциальность в сети путём установки WireHole — связки WireGuard + Unbound + Pi-Hole на серверах под управлением Ubuntu 22.04 и CentOS 8.
Утечка DNS: Что это такое и как с ней бороться?
При утечке DNS Leak наш трафик делится на 2 потока: туннелированный VPN-трафик и DNS-трафик, который проходит вне VPN-подключения. Это происходит за счет использования сторонних DNS (сервера провайдера, публичные сервера Google, Cloudflare и т.д.) для получения информация о доменных именах, к которым осуществляются запросы. Чтобы понять как происходит утечка DNS Leak, следует схематически представить нашу интернет-маршрутизацию, которая выглядит примерно следующим образом:

Чтобы проверить происходит ли утечка, пройдём тест на сайте https://dnsleak.com:

Как мы видим из теста, происходит утечка DNS, а в качестве сервера используются резолверы Cloudflare. Для её предотвращения, нам следует использовать приватный DNS-сервер. Для этого нам понадобится виртуальный сервер с операционной системой CentOS 8, на который будет установлен WireHole — связка WireGuard, Unbound и Pi-Hole:
- WireGuard — Это достаточно молодой, но зарекомендовавший себя VPN-протокол, обладающий высокой скоростью работы по сравнению с OpenVPN и IPSec, стабильностью и надёжным шифрованием;
- Unbound — Это кеширующий и рекурсивный DNS-резолвер, разработанный компанией NLnet Labs и предназначенный для получения информации о DNS-записях с коренных серверов;
- Pi-hole — Это приложение для блокировки рекламы и интернет-трекинга, основанный на фильтрации DNS-запросов и предназначенный для использования в частной сети.
Установку WireGuard на сервер с операционной системой CentOS 8 мы уже рассматривали в другой статье и она ничем не отличается для WireHole, поэтому произведём установку согласно ней, а в данной статье мы сразу перейдём к установке и настройке Unbound и Pi-Hole.
Установка и настройка Unbound в Ubuntu 22.04 и CentOS 8
Для предотвращения DNS Leak, нам необходим собственный DNS резолвер, который будет обрабатывать запросы вместо сторонних DNS серверов. В качестве такого резолвера мы будем использовать Unbound. Его установка достаточно простая и осуществляется при помощи пакетного менеджера yum или apt-get.
В Ubuntu 22.05 выполняем команду:
sudo apt-get install unbound -y
В CentOS 8 выполняем команду:
sudo yum install unbound -y
Затем обновляем список коренных DNS серверов:
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
Теперь, забегая наперёд, создаём конфигурационный файл для Pi-Hole.
В Ubuntu 22.04:
sudo vi /etc/unbound/unbound.conf.d/pi-hole.conf
В CentOS 8:
sudo vi /etc/unbound/conf.d/pi-hole.conf
В него следующее следующее содержимое:
server:
# if no logfile is specified, syslog is used
# logfile: "/var/log/unbound/unbound.log"
verbosity: 1
port: 5353
do-ip4: yes
do-udp: yes
do-tcp: yes
# may be set to yes if you have IPv6 connectivity
do-ip6: no
# use this only when you downloaded the list of primary root servers
root-hints: "/var/lib/unbound/root.hints"
# respond to DNS requests on all interfaces
interface: 0.0.0.0
max-udp-size: 3072
# IPs authorised to access the DNS Server
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1 allow
access-control: 10.78.220.0/24 allow
# hide DNS Server info
hide-identity: yes
hide-version: yes
# limit DNS fraud and use DNSSEC
harden-glue: yes
harden-dnssec-stripped: yes
harden-referral-path: yes
# add an unwanted reply threshold to clean the cache and avoid, when possible, DNS poisoning
unwanted-reply-threshold: 10000000
# have the validator print validation failures to the log val-log-level: 1
# don't use Capitalisation randomisation as it known to cause DNSSEC issues sometimes
# see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
use-caps-for-id: no
# reduce EDNS reassembly buffer size
# suggested by the unbound man page to reduce fragmentation reassembly problems
edns-buffer-size: 1472
# TTL bounds for cache
cache-min-ttl: 3600
cache-max-ttl: 86400
# perform prefetching of close to expired message cache entries
# this only applies to domains that have been frequently queried
prefetch: yes
prefetch-key: yes
# one thread should be sufficient, can be increased on beefy machines
num-threads: 1
# ensure kernel buffer is large enough to not lose messages in traffic spikes
so-rcvbuf: 1m
# ensure privacy of local IP ranges
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
В данном конфигурационном файле, подсеть IP access-control: 10.78.220.0/24 allow следует заменить на подсеть интерфейса wghub, который используется Вашим WireGuard. Для этого выполняем команду ifconfig на сервере:
[root@virtirio.com ~]# ifconfig
wghub: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1280
inet 10.78.220.1 netmask 255.255.255.0 destination 10.78.220.1
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000
В нашем случае IP адрес интерфейса wghub 10.78.220.1, соответственно подсеть 10.78.220.0/24.
После внесения изменений в настройки, добавляем unbound в автозагрузку и запускаем его:
sudo systemctl enable unbound sudo systemctl start unbound
Для CentOS 8 необходимо открыть работу служб DNS в firewalld:
sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
Проверяем работу DNS резолвера Ubound. Для этого устанавливаем утилиты bind-utils, предназначенные для работы с DNS.
В Ubuntu 22.04:
sudo apt-get install bind9-utils dnsutils -y
В CentOS 8:
sudo yum install bind-utils -y
И выполняем команды:
dig pi-hole.net @127.0.0.1 -p 5353 dig sigok.verteiltesysteme.net @127.0.0.1 -p 5353 dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5353
В первом и втором случае сервер должен ответить NOERROR, а в третьем — SERFAIL.


На этом установка Unbound завершена. Переходим к следующему шагу.
Установка и настройка Pi-Hole для фильтрации DNS запросов
Pi-Hole — Это высоко-функциональный продукт, предназначенный для фильтрации нежелательного трафика на уровне DNS-запросов, в частности, сервисов сбора статистики о действиях пользователей в сети и блокировки рекламы. Система обладает удобным и функциональным web-интерфейсом, с помощью которого выполняется настройка, а так же осуществляется мониторинг и анализ работы DNS сервера:

Перейдём непосредственно к установке и настройке Pi-Hole. Для этого запускаем скрипт:
curl -sSL https://install.pi-hole.net | bash
Соглашаемся со всеми предложенными параметрами и жмём Yes/Ok. Единственное что мы должны выбрать при установке — это интерфейс wghub для WireGuard вместо основного интерфейса сервера:

После завершения установки, сохраняем адрес и пароль для доступа к web-интерфейсу:

Так как последующая настройка будет происходить через браузер по протоколу http, откроем его в firewalld:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
Для предотвращения доступа к web-интерфейсу, закрываем доступ по протоколу http из вне:
iptables -A INPUT -s 10.78.220.0/24 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP
Где 10.78.220.0/24 — подсеть, используемая WireGuard.
На этом установка Pi-Hole завершена и мы переходим непосредственно к его настройке через web-интерфейс в браузере по адресу http://<ip_адрес_сервера>/admin и авторизируемся с помощью пароля администратора, сгенерированного при установке.
Переходим в раздел Settings на вкладку DNS. Нам необходимо отключить внешние Upstream DNS Servers и указать адрес нашего Unbound 127.0.0.1#5353 как на скрине ниже:

Ниже на странице включаем поддержку DNSSEC и сохраняем настройки (кнопка Save внизу страницы).
На этом настройка Pi-Hole завершена. Переходим к тюнингу WireGuard.
Настройка клиента WireGuard для предотвращения утечки DNS
Утечка DNS происходит при обращении к сторонним DNS серверам. В нашем случае, подключение к DNS выполняется через VPN-клиент Wireguard, поэтому нам необходимо делегировать их на наш сервер. Для этого, редактируем настройки подключения в WireGuard клиенте. Нам нужно изменить IP-адрес DNS сервера на IP-адрес нашего интерфейса wghub:

Чтобы при добавлении новых клиентов WireGuard каждый раз не править вручную IP-адрес DNS сервера, внесем изменения в файл intnetdns.txt, который находится в директории со скриптом easy-wg-quick (директория, из которой мы производили установку WireGuard). Для этого, открываем его в редакторе vi:
sudo vi intnetdns.txt
И заменяем IP-адрес 1.1.1.1 (публичный DNS сервер CloudFlare), который используется по-умолчанию, на IP адрес нашего интерфейса wghub.
Теперь снова проходим тест на утечку DNS на сайте https://dnsleak.com. В результате, мы должны увидеть сообщение, что тест пройден успешно:
Заключение
Внедрение WireHole является эффективным способом борьбы с утечкой DNS Leak и является эффективным методом повышения сохранности личных данных пользователя и его конфиденциальности в сети интернет. Это стало возможным благодаря переходу от использования сторонних серверов к приватному DNS резолверу на базе Unbound, а за счет сервера фильтрации DNS запросов Pi-Hole, блокируется львиная доля нежелательного трафика и значительно снижается количество рекламы. Всего за несколько часов наш WireHole заблокировал 23,1% всех DNS запросов:

В итоге, сервисам интернет-трекинга и сбора пользовательской информации становится сложнее собирать статистику о нас и отслеживать наши действия в сети. Кроме того, Pi-Hole обладает высоким функционалом, что позволяет администратору сервера самостоятельно управлять как нежелательными ресурсами, так и использовать собственные списки фильтрации.








