Утечка DNS: Решаем проблему при помощи WireHole в Ubuntu 22.04 и CentOS 8

Системное администрирование

Утечка 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, следует схематически представить нашу интернет-маршрутизацию, которая выглядит примерно следующим образом:

Утечка DNS Leak

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

Тест на утечку DNS Leak

Как мы видим из теста, происходит утечка 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.

Утечка DNS. Установка Unbound

На этом установка Unbound завершена. Переходим к следующему шагу.

Установка и настройка Pi-Hole для фильтрации DNS запросов

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

Pi-Hole Dashboard

Перейдём непосредственно к установке и настройке Pi-Hole. Для этого запускаем скрипт:

curl -sSL https://install.pi-hole.net | bash

Соглашаемся со всеми предложенными параметрами и жмём Yes/Ok. Единственное что мы должны выбрать при установке – это интерфейс wghub для WireGuard вместо основного интерфейса сервера:

Настройка Pi-Hole

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

Настройка Pi-Hole

Так как последующая настройка будет происходить через браузер по протоколу 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 как на скрине ниже:

Настройка Pi-Hole

Ниже на странице включаем поддержку DNSSEC и сохраняем настройки (кнопка Save внизу страницы).

На этом настройка Pi-Hole завершена. Переходим к тюнингу WireGuard.

Настройка клиента WireGuard для предотвращения утечки DNS

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

WireGuard DNS Leak

Чтобы при добавлении новых клиентов 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. В результате, мы должны увидеть сообщение, что тест пройден успешно:

DNS Leak Tests

Заключение

Внедрение WireHole является эффективным способом борьбы с утечкой DNS Leak и является эффективным методом повышения сохранности личных данных пользователя и его конфиденциальности в сети интернет. Это стало возможным благодаря переходу от использования сторонних серверов к приватному DNS резолверу на базе Unbound, а за счет сервера фильтрации DNS запросов Pi-Hole, блокируется львиная доля нежелательного трафика и значительно снижается количество рекламы. Всего за несколько часов наш WireHole заблокировал 23,1% всех DNS запросов:

Утечка DNS и Pi-Hole

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

Оцените статью