pi-hole + unbound

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.

Ну а вот скриншот с моим примером

1655593556

Так же в интернете вы можете найти довольно много сервисов, который помогут вам проверить DNS Leak, не буду рекламировать какой-то конкретный, найдите любой.

1655560074

Contents

comments powered by Disqus