Витік DNS (DNS Leak) – це явище, при якому інформація про Ваші DNS-запити доступна третій стороні, незважаючи на використання захищеного VPN-з’єднання, в результаті чого відбувається збір історії відвіданих сайтів, а зібрана інформація використовується з різних цілей, зокрема для формування аналітики про Ваші вподобання, побудови рекламної воронки тощо. У даній статті ми розповімо, як запобігти витоку DNS та підвищити конфіденційність у мережі шляхом встановлення WireHole – зв’язки WireGuard + Unbound + Pi-Hole на серверах під управлінням Ubuntu 22.04 та CentOS 8.
Витік DNS: Що це таке і як з ним боротися?
При витоку DNS Leak наш трафік розділяється на два потоки: тунельований 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 нам необхідний власний DNS-резолвер, який буде обробляти запити замість сторонніх DNS серверів. В якості такого резолвера ми будемо використовувати Unbound. Його встановлення досить просте і здійснюється за допомогою пакетного менеджера yum або apt-get.
В Ubuntu 22.04 виконуємо команду:
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: # якщо не вказано logfile, використовується syslog # logfile: "/var/log/unbound/unbound.log" verbosity: 1 port: 5353 do-ip4: yes do-udp: yes do-tcp: yes # можна встановити в yes, якщо у вас є IPv6 з'єднання do-ip6: no # використовуйте це тільки якщо ви завантажили список кореневих серверів root-hints: "/var/lib/unbound/root.hints" # відповідати на DNS запити на всіх інтерфейсах interface: 0.0.0.0 max-udp-size: 3072 # IP-адреси, яким дозволено доступ до DNS сервера access-control: 0.0.0.0/0 refuse access-control: 127.0.0.1 allow access-control: 10.78.220.0/24 allow # приховати інформацію про DNS сервер hide-identity: yes hide-version: yes # обмежити DNS шахрайство та використовувати DNSSEC harden-glue: yes harden-dnssec-stripped: yes harden-referral-path: yes # встановити поріг небажаних відповідей для очищення кешу та уникнення, коли це можливо, DNS отруєння unwanted-reply-threshold: 10000000 # змусити валідатор виводити помилки валідації в лог val-log-level: 1 # не використовуйте рандомізацію капіталізації, оскільки вона може викликати проблеми з DNSSEC # див. https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 для деталей use-caps-for-id: no # зменшити розмір буфера EDNS для збирання фрагментів # рекомендовано в man-сторінці unbound для зменшення проблем з фрагментацією edns-buffer-size: 1472 # межі TTL для кешу cache-min-ttl: 3600 cache-max-ttl: 86400 # виконувати попереднє завантаження майже закінчених записів кешу # це застосовується лише для доменів, до яких часто здійснюються запити prefetch: yes prefetch-key: yes # одного потоку має бути достатньо, можна збільшити на потужних машинах num-threads: 1 # переконатися, що розмір буфера ядра достатній, щоб не втратити повідомлення під час піків трафіку so-rcvbuf: 1m # забезпечити конфіденційність локальних IP-діапазонів 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-резолвера Unbound. Для цього встановлюємо утиліти 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 володіє високим функціоналом, що дозволяє адміністратору сервера самостійно керувати як небажаними ресурсами, так і використовувати власні списки фільтрації.