Pi-Hole
Уже давно я пользуюсь Pi-hole. Этот инструмент позволяет блокировать разные рекламные баннеры, интернет-трекеры и прочие бесполезные для пользователя ресурсы. При этом вы еще и ускоряете загрузку страниц, так как запросы блокируются на уровне DNS.
Изначально Pi-hole разрабатывался для Raspberry Pi, и изначально он у меня и стоял на Raspberry Pi, и я даже делал пост или ролик о том как его устанавливать. Со временем Raspberry Pi меня стал сильно доставать. Тем, что у флешек случались проблемы с файловой системой. Иногда она просто запарывалась. Ну а проблем с нормальными дисками у меня никогда не было. Поэтому я решил сделать все на нормальном домашнем сервере, без Raspberry Pi. Для большей надежности, а если учесть еще и то, что на Raspberry Pi, по какой-то причине, цена сейчас выше, чем на нормальный неттоп, то выбор вообще очевиден.
Unbound
Еще мы будем использовать Unbound. Unbound это это удостоверяющий, рекурсивный и кеширующий DNS сервер. Некоторые скажут, что это бессмысленно, так как в Pi-hole уже есть dnsmasq. Но dnsmask хоть тоже и является DNS ресолвером и может получать адреса у серверов, но все-таки dnsmasq это только форвардер. Все что он будет делать это спрашивать адрес у ближайшего к вам DNS сервера.
Кроме того unbound умеет использовать различные методы защиты и криптографии. Чтобы избежать плейнтекста. Например, через DNSSEC или DoH.
А еще мне нравится, что у unbound довольно ясный и понятный конфиг.
Используя Unbound мы будем получать ответ от DNS ОЧЕНЬ быстро по сравнению с резолверами вашего провайдера, у которых в любом случае есть какая-то очередь. А еще ваш провайдер не будет знать на какие сайты вы ходите.
А еще локальный резолвер умеет заранее обновлять некоторые записи, проверяя ttl и обновляя те их них, которые вот-вот протухнут. И из-за этого мы тоже всегда выигрываем в скорости.
Есть такая уязвимость, которая называется “dns leak” (утечка днс). Это когда ваши запросы не шифруются и могут быть видны третьим лицам, как минимум, вашему провайдеру. Есть даже различные сервисы, которые могут сказать есть ли у вас утечка (в интернете куча сервисов, которые могут помочь вам узнать, есть ли у вас такая уязвимость)
Wireguard
Еще я видел различные гайды в которых вдовесок устанавливают wireguard. Например, в пакете wirehole, там все это ставится вместе.
У меня есть сомнения в том, что это все целесообразно ставить на один сервер. Как мне кажется, wireguard действительно разумнее ставить куда-нибудь в облако, например, на сервер в digitalocean, тогда как pi-hole и unbound разумнее ставить на сервер в локальной сети, так мы получим значительно более быстрый отклик.
Установка и настройка Pi-hole
У Pi-hole есть два пакета, первый называется “Pi-hole standalone”, это пакет который позволяет вам развернуть пайхол конкретно на том компе на котором вы его устанавливаете. Например, у вас есть один ноут и больше ничего нет, ни сервера, ни телефона, ни чего-то еще. Вот вы можете на него поставить это все и радоваться жизни.
Но значительно разумнее поставить это все на сервер, который будет работать со всем трафиком внутри локальной сети. Для этого есть пакет “pi-hole-server”
Оба пакета находятся в AUR, так что перед тем как их ставить поставьте yay или pacaur, что вам больше нравится.
yay -S pi-hole-server
Теперь намнадо установить пакет
sudo pacman -S php-sqlite
И после этого надо отредактировать файл
sudo vim /etc/php/php.ini
и надо раскомментировать три строки:
extension=pdo_sqlite
extension=sockets
extension=sqlite3
и в этот же файл добавим строку
open_basedir = /srv/http/pihole/:/run/pihole-ftl/pihole-FTL.port:/run/log/pihole/pihole.log:/run/log/pihole-ftl/pihole-FTL.log:/etc/pihole:/etc/hosts:/etc/hostname:/etc/d
nsmasq.d/02-pihole-dhcp.conf:/etc/dnsmasq.d/03-pihole-wildcard.conf:/etc/dnsmasq.d/04-pihole-static-dhcp.conf:/var/log/lighttpd/error.log:/proc/meminfo:/proc/cpuinfo:/sys
/class/thermal/thermal_zone0/temp:/tmp
Install lighttpd
sudo pacman -S lighttpd
sudo pacman -S php-cgi
# cp /usr/share/pihole/configs/lighttpd.example.conf /etc/lighttpd/lighttpd.conf
sudo systemctl start lighttpd
sudo systemctl enable lighttpd
sudo systemctl status lighttpd
● lighttpd.service - Lighttpd Web Server
Loaded: loaded (/usr/lib/systemd/system/lighttpd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-06-22 01:40:33 MSK; 10s ago
Main PID: 46120 (lighttpd-angel)
Tasks: 10 (limit: 9374)
Memory: 20.4M
CPU: 56ms
CGroup: /system.slice/lighttpd.service
├─46120 /usr/bin/lighttpd-angel -D -f /etc/lighttpd/lighttpd.conf
├─46121 /usr/bin/lighttpd -D -f /etc/lighttpd/lighttpd.conf
├─46123 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46124 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46125 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46126 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46127 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46128 /usr/bin/php-cgi -d session.save_path=/run/pihole
├─46129 /usr/bin/php-cgi -d session.save_path=/run/pihole
└─46130 /usr/bin/php-cgi -d session.save_path=/run/pihole
sudo vim /etc/hosts
192.168.0.112 pi.hole myhostname
http://192.168.0.112/admin/
Установка и настройка Unbound
Для начала надо установить пакет unbound
для ubuntu
sudo apt install unbound
для arch
sudo pacman -S unbound
После этого нам нужно добавить в файл /var/lib/unbound/root.hints
информацию о root серверах DNS. Мы его можем взять из https://www.internic.net/domain/named.root
Для этого запустим команду
sudo mkdir /var/lib/unbound
wget https://www.internic.net/domain/named.root -qO- | sudo tee /var/lib/unbound/root.hints
cat /var/lib/unbound/root.hints
Стандартные настройки уже находятся в файле /etc/unbound/unbound.conf
sudo vim /etc/unbound/unbound.conf
server:
verbosity: 0
interface: 127.0.0.1
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
do-ip6: no
prefer-ip6: no
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: no
edns-buffer-size: 1232
prefetch: yes
num-threads: 1
so-rcvbuf: 1m
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
sudo service unbound restart
dig pi-hole.net @127.0.0.1 -p 5335
sudo systemctl restart unbound
sudo systemctl status unbound ✔ dm@dm-pc
● unbound.service - Validating, recursive, and caching DNS resolver
Loaded: loaded (/usr/lib/systemd/system/unbound.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2022-06-22 01:57:46 MSK; 10s ago
Docs: man:unbound(8)
Main PID: 48336 (unbound)
Tasks: 1 (limit: 9374)
Memory: 6.1M
CPU: 52ms
CGroup: /system.slice/unbound.service
└─48336 /usr/bin/unbound -d -p
можем протестировать что все работает нормально
dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5335
Вот эта команда должна вывести SERVFAIL
А вот эта команда
dig sigok.verteiltesysteme.net @127.0.0.1 -p 5335
Должна вывести NOERROR
Теперь идем в админку pi-hole
Идем в раздел settings - dns
убираем стандартный гугловский DNS и ставим свой собственный
127.0.0.1#5335
И теперь нам надо ждать пока наши клиенты переподключатся (некоторые клиенты сами не переподключатся, и надо выключить и включить сеть руками) и после этого они будут отображаться в этой статистике
Проверка работоспособности Unbound
Для проверки работоспособности DNSSEC, после запуска службы unbound.service
выполните:
$ unbound-host -C /etc/unbound/unbound.conf -v sigok.verteiltesysteme.net
В ответе должен быть IP адрес и (secure)
после него.
$ unbound-host -C /etc/unbound/unbound.conf -v sigfail.verteiltesysteme.net
Этот ответ должен содержать (BOGUS (security failure))
.
Так же вы можете использовать drill для проверки вашего сервера следующими командами:
$ drill sigfail.verteiltesysteme.net
$ drill sigok.verteiltesysteme.net
Первая команда должна в переменной rcode
выдать SERVFAIL
. Вторая команда должна выдать NOERROR
.
Ну а вот скриншот с моим примером
Так же в интернете вы можете найти довольно много сервисов, который помогут вам проверить DNS Leak, не буду рекламировать какой-то конкретный, найдите любой.