Утечка 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 обладает высоким функционалом, что позволяет администратору сервера самостоятельно управлять как нежелательными ресурсами, так и использовать собственные списки фильтрации.