Pi-hole – skonfiguruj serwer DNS we własnym domu

avlab.pl 2 lat temu
Zdjęcie: pi-hole


Chcąc uzyskać większą kontrolę nad ruchem w sieci lokalnej np. sprawdzać, jakie domeny są odpytywane albo blokować dostęp do zawartości w Internecie, musimy mieć kontrolę nad ruchem sieciowym za pomocą. Prawdopodobnie najłatwiejszym i najtańszym rozwiązaniem jest wykorzystanie własnego serwera DNS. O ile konfiguracja pakietu Bind9 jest skomplikowana, czyli standardu w świecie DNS dla systemu Linux, to istnieją gotowe i działające rozwiązania, niewymagające szczególnej wiedzy (zakładając zwykłe zastosowanie). Jednym z nich jest Pi-Hole.

Pi-Hole we wstępie

Znanym i polecanym przykładem jest Pi-hole. Rozwiązanie zapewnia serwer DNS i DHCP oraz możliwość blokowania żądań do wprowadzonych manualnie domen na podstawie list. Po ustawieniu adresu IP urządzenia, kontenera czy maszyny wirtualnej z Pi-hole, domyślnie zyskujemy blokowanie domen powiązanych z serwowaniem reklam, co daje efekt podobny do ad blocker’a w przeglądarce. Oczywiście wciąż warto używać dedykowanych rozszerzeń, natomiast „ochrona” przed reklamami jest już zapewniona „na niższym” poziomie w warstwie sieciowej i obejmuje np. SmartTV. Oprócz tego zyskujemy podgląd na odpytywane domeny i w intuicyjny sposób możemy je zablokować poprzez graficzny konfigurator.

Do wdrożenia Pi-Hole polecam zastosowanie Raspberry Pi, również dlatego, iż ten minikomputer jest bardzo interesujący pod względem technicznym. Niezależnie od wybranego modelu (ten z 2 GB pamięci RAM na początek wystarczy), skłaniałbym się ku zakupowi gotowych zestawów (starter kit), zamiast wszystkich „części” oddzielnie. Zestawy zawierają dodatkowo obudowę (ochrona podzespołów przed czynnikami zewnętrznymi, np. kurzem, jak również to kwestia estetyczna), dodatkowe kable (np. HDMI, USB, RJ-45) czy karty SD z preinstalowanym systemem operacyjnym (Raspberry Pi OS, oczywiście można zapisać własny obraz innego systemu). Przydatny może być także wentylator.

Zdarzyło mi się, iż właśnie ten preinstalowany system nie był prawidłowo obsługiwany przez Raspberry Pi, stąd pojawiła się konieczność dodatkowego zakupu adaptera do karty SD. Wystarczyło samodzielnie zapisać obraz systemu i wszystko poprawnie się uruchomiło. Najszybciej taki obraz zapisać z użyciem Raspberry Pi Imager, który pobiera adekwatny obraz wskazanego systemu (to bardzo dobra opcja, nie musimy przeszukiwać Internetu, wszystko jest wypisane w programie), zapisuje się na karcie SD, opcjonalnie weryfikuje poprawność zapisu i co ważne, potrafi założyć konto użytkownika i ustawić konfigurację sieci. Więc w praktyce nie potrzebujemy podpinać Raspberry Pi do monitora czy używać klawiatury lub myszki w połączeniu SSH.

Należy mieć świadomość, iż karty SD nie są najsolidniejszym nośnikiem danych i stosunkowo gwałtownie potrafią się zużyć, zależnie od jakości danej karty. Dla własnych projektów zalecam karty o pojemności przynajmniej 32 GB. Systemy oparte o Linux raczej nie zajmą dużo miejsca, natomiast więcej przestrzeni na pewno się przyda (zakładając używanie partycji pliku wymiany swap, co dodatkowo może zwiększyć wydajność).

Konfiguracja – pierwsze kroki z Pi-Hole

Dysponując całą powyższą wiedzą, możemy przystąpić do konfiguracji Raspberry Pi. Przedstawiony setup będę opierał na Ubuntu 22.04, ale w przypadku Pi-hole nie ma to żadnego znaczenia, ponieważ instalację i dalszą konfigurację wykonuje gotowy skrypt. Dla całkowitej jasności, na koniec opisałem też instalację jako kontener Docker. Po uruchomieniu Raspberry Pi Imager wybieramy system operacyjny i wskazujemy kartę SD podłączoną poprzez adapter. jeżeli chcemy dodać konfigurację sieci oraz użytkownika, musimy po prostu wybrać ikonę koła zębatego.

Prekonfiguracja systemu z poziomu Raspberry Pi Imager.
Zapis wybranego obrazu na karcie SD.

Raspberry Pi powinno otrzymać adres IP z serwera DHCP. jeżeli tak się stało, zobaczymy go w panelu routera. Można też użyć Nmap lub innego programu w rodzaju Advanced IP Scanner.

Łączymy się poprzez SSH jako zdefiniowany użytkownik. Teraz powinniśmy przypisać statyczny adres IP na karcie sieciowej. W Ubuntu 22.04 należy to zrobić dzięki Netplan: konfiguracja w pliku /etc/netplan/50-cloud-init.yaml może wyglądać jak na poniższym przykładzie (<nazwa_interfejsu> zostanie wyświetlona w wyniku polecenia ip a). jeżeli używamy Wi-Fi, zawartość tego pliku będzie inna, ale wszystko uzupełniamy analogicznie. Bezpieczniejsza opcja to rezerwacja adresu IP na routerze.

network: version: 2 renderer: networkd ethernets: : dhcp4: no addresses: [/] gateway4: nameservers: addresses: [, ]

Ustawienia będą zastosowane po wykonaniu sudo netplan apply (weryfikacja poprawności dzięki sudo netplan try).

W dalszym kroku pozostaje wykonanie polecenia:

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

Niezbędne czynności (m.in. instalacja pakietów i ich odpowiednia konfiguracja) zostaną przeprowadzone przez skrypt w sposób automatyczny. Nam pozostanie udzielenie odpowiedzi na kilka pytań. Pierwsze z nich to prośba o wybór dostawcy DNS.

Decyzję pomoże podjąć nasz najnowszy test serwerów DNS.

Wybieramy dowolny serwer z listy lub wpisujemy własne (Custom).

Na pozostałych ekranach wybieramy za każdym razem Yes. Po udanej instalacji zobaczymy okno podobne do poniższego:

Szczegóły konfiguracji.

Graficzny panel Pi-Hole po skonfigurowaniu

Czyli panel będzie dostępny pod adresem http://192.168.1.150/admin, widoczne jest również hasło. Nasz lokalny serwer DNS musimy teraz ustawić na docelowych hostach lub w panelu routera (aby objąć całą sieć). Dzięki temu będzie dostępne także lokalne rozwiązywanie nazw, np. domyślnie adres pi.hole zostanie rozwiązany na adres IP naszego serwera. Po chwili w zakładce Query log zobaczmy obsłużone zapytania.

Pi-Hole, zakładka kolejki logów.

Z poziomu tego widoku możemy bezpośrednio zablokować dostęp do danej domeny klikając na Blacklist. Wszystkie zablokowane domeny są widoczne w zakładce Blacklist, w której również mamy opcję wpisania kolejnych domen do czarnej listy.

Na początek dobrym pomysłem jest dodanie listy od CERT Polska. Domyślnie jest podana tylko jedna, odpowiadająca za blokowanie reklam. W tym celu w zakładce Group Management -> Adlists wpisujemy https://hole.cert.pl/domains/domains.txt i wybieramy Add.

Przydatną opcją jest podgląd aktualnie podłączonych do sieci urządzeń i statystyka ich ruchu. Taki widok znajdziemy w zakładce Tools -> Network. Administratorzy sieci mogą docenić możliwość konfiguracji lokalnego resolvera DNS, czyli przypisanie domeny dla lokalnego adresu. Po wejściu do Local DNS -> DNS Records uzupełniamy dwa pola formularza i zapisujemy zmiany.

Rozwiązywanie nietypowej domeny na lokalny adres.

Panel Pi-hole zawiera pozostałe opcje, natomiast starałem się przedstawić te najbardziej istotne. Zachęcam do samodzielnej konfiguracji w celu lepszego poznania i maksymalnego wykorzystania dostępnych możliwości. Musimy jednak pamiętać, iż to tylko DNS, więc do obejścia blokad czy innych reguł wystarczy zmiana adresów DNS na urządzeniu klienckim. W firmach zwykli pracownicy raczej nie pracują z uprawnieniami administratora, natomiast w domu zwykle (niestety) nie zwraca się na tę kwestię uwagi. W celu zwiększenia skuteczności można zablokować wybrane domeny na poziomie routera (do ominięcia z użyciem VPN) lub ustawić urządzenie z Pi-hole jako router (konfiguracja może być trudniejsza, trzeba obsłużyć interfejsy WAN i LAN).

Raspberry Pi 4 wykorzystane jako serwer DNS w tym poradniku.

Instalacja z użyciem Dockera

Jak wspomniałem, wyjaśnię teraz sposób instalacji Pi-hole z użyciem Docker. Opis przygotowałem w oparciu na tym samym Ubuntu 22.04 (ponownie zapisany obraz), ale Docker można uruchomić z powodzeniem również na Windows:

Należy się upewnić, iż w BIOS/UEFI mamy aktywne wsparcie dla wirtualizacji. Instrukcja zależy od producenta, pomocny jest opis na stronie Microsoft. W systemie najpierw musimy uruchomić PowerShell z prawami administratora i wykonać wsl –install. W kolejnym kroku pobieramy i instalujemy Docker Desktop.

Inna opcja to skorzystanie z Hyper-V zamiast WSL. Dla takiego prostego zastosowania nie ma to większego znaczenia. Wtedy instalacja WSL nie jest potrzebna, wystarczy odznaczyć pierwszy checkbox zaraz po uruchomieniu instalatora Docker.

W Ubuntu Docker Desktop jest zbędny, ponieważ kontenerami możemy bezpośrednio zarządzać poprzez wykonywanie poleceń w terminalu. Jak zawsze, pierwszy krok to instalacja Docker. Polecam sposób z użyciem repozytorium wydawcy, czyli wykonujemy:

sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu jammy stable" sudo apt update sudo apt install docker-ce sudo usermod -aG docker pihole

Uwagę zwracamy na nazwę kodową Ubuntu (w naszym przykładzie jammy). Poprzednie wersje tego systemu mają inne nazwy, możemy je łatwo sprawdzić poleceniem lsb_release -a.

Raspberry Pi ma procesor oparty na architekturze ARM64, dlatego jawnie wskazujemy arm64 przy dodawaniu repozytorium. Poprzez usermod dodajemy naszego użytkownika do grupy docker, tak aby możliwe było używanie Docker bez każdorazowego uruchamiania z sudo. Musimy się jeszcze „wylogować” i ponownie połączyć, aby ta informacja została załadowana przez system.

Przydatny będzie docker-compose:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

Dalsze działania są równie proste. Klonujemy repozytorium:

git clone https://github.com/pi-hole/docker-pi-hole cd docker-pi-hole

Tutaj istotna uwaga. Kiedy wykonamy sudo ss -antpl, zobaczymy, iż na porcie 53 działa nam usługa systemd-resolve. Z tego powodu kontener nie uruchomi się prawidłowo. Musimy tę usługę wyłączyć poprzez:

sudo systemctl disable systemd-resolved sudo systemctl stop systemd-resolved

Z kolei w pliku /etc/resolv.conf ustawiamy nameserver na adres dowolnego zewnętrznego serwera DNS. Za obsługę DNS będzie ostatecznie odpowiadało Pi-hole, systemowa usługa nie będzie potrzebna. jeżeli jednak zdecydujemy się zrezygnować z własnego DNS, wszystkie ustawienia przywrócimy poleceniami:

sudo systemctl enable systemd-resolved sudo systemctl start systemd-resolved

Następnie zwyczajnie uruchamiamy skrypt docker_run.sh, który wykona całą operację. Na koniec zobaczymy hasło do panelu. Skoro już nasz pierwszy kontener działa (docker ps -a wyświetli nam informacje), możemy spróbować wykorzystać Portainer, czyli usługę, która poprzez interfejs webowy ułatwi nam zarządzanie Docker’em. Instalacja ogranicza się do dwóch poleceń:

docker volume create portainer_data docker run -d -p 8000:8000 -p 9443:9443 --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:2.9.3

Po ich wykonaniu na porcie 9443 zobaczymy panel Portainer (adres musi być w postaci https://<adres_IP>:9443). Tworzymy nowe konto, wchodzimy w Environments, wybieramy local, następnie Containers. Zobaczmy aktualnie uruchomione kontenery i możliwości zarządzania nimi bez konieczności znajomości wszystkich poleceń Docker.

Lista kontenerów i informacje o nich.
Idź do oryginalnego materiału