Przed połączeniem z serwerem w chmurze z niemal każdego inteligentnego gniazdka, kamery, telewizora czy robota sprzątającego wysyłane jest zapytanie DNS o nazwę domeny. Jeśli te zapytania trafiają do własnego serwera DNS w domowej sieci, masz na bieżąco listę adresów, z którymi łączy się każde urządzenie, i wiesz, jak często to się dzieje. Możesz też blokować domeny tylko dla wybranych urządzeń. Do tego właśnie służy Pi-hole, bezpłatny serwer DNS, który dobrze działa na Raspberry Pi i na każdym małym komputerze z Linuksem.

Poniżej znajdziesz instalację Pi-hole v6 w Dockerze, przełączenie domowej sieci na ten serwer i sposób na podgląd oraz filtrowanie ruchu urządzeń IoT. Polecenia, porty i ustawienia pochodzą z dokumentacji Pi-hole i z oficjalnego repozytorium docker-pi-hole.

Co widać w Pi-hole, a czego nie

W Pi-hole widać zapytania DNS: o jaką domenę pytało urządzenie, kiedy i jaka była odpowiedź. Nie widać treści przesyłanych danych, a do tego tylko te zapytania, które faktycznie trafiają do Pi-hole. Jeśli w oprogramowaniu urządzenia jest na stałe wpisany inny serwer DNS albo zapytania idą szyfrowanym kanałem DNS over HTTPS do serwera producenta, w Pi-hole nie będzie po nich śladu. Z dziennika zapytań można więc uzyskać dobry obraz większości urządzeń, ale nie jest to pełny audyt.

Blokowanie też ma swoją cenę. Domena wyglądająca na telemetrię może być potrzebna do aktualizacji oprogramowania, synchronizacji czasu albo działania aplikacji. Blokuj po jednej domenie i za każdym razem sprawdzaj, czy urządzenie nadal działa.

Wymagania

Według strony z wymaganiami Pi-hole potrzebujesz:

  • co najmniej 2 GB wolnego miejsca na dysku (zalecane 4 GB) i 512 MB pamięci RAM,
  • stałego adresu IP komputera z Pi-hole (wystarczy rezerwacja DHCP w routerze),
  • wolnych portów 53 TCP/UDP (DNS) oraz 80 i 443 TCP (strona administracyjna).

Program Pi-hole jest dostępny w gotowej postaci dla architektur x86_64, armv6, armv7, armv8 (aarch64) i riscv64, więc nadaje się każde obecne Raspberry Pi. Potrzebny jest też Docker z dodatkiem Compose. Zainstaluj go według instrukcji Dockera dla swojego systemu.

Zwolnienie portu 53 w Ubuntu i Fedorze

W Ubuntu od wersji 17.10 i w Fedorze od wersji 33 port 53 jest zajęty przez lokalny resolwer systemd-resolved, przez co nasłuch Pi-hole na tym porcie jest niemożliwy. W dokumentacji Pi-hole dla Dockera są na to trzy polecenia:

sudo sh -c 'mkdir -p /etc/systemd/resolved.conf.d && printf "[Resolve]\nDNSStubListener=no\n" | tee /etc/systemd/resolved.conf.d/no-stub.conf'
sudo sh -c 'rm -f /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf'
sudo systemctl restart systemd-resolved

Pierwszym poleceniem wyłączasz lokalny nasłuch, drugim kierujesz /etc/resolv.conf na właściwe serwery nadrzędne, a trzecim wprowadzasz zmianę w życie. W dokumentacji wymienione są tylko te dwa systemy. Jeśli w innym systemie po docker compose up -d pojawi się błąd zajętego portu 53, znajdź i zatrzymaj usługę, która go używa.

Plik Compose

Utwórz katalog, na przykład ~/pihole, i zapisz w nim plik compose.yaml. To oficjalny plik startowy bez opcjonalnych wierszy dla DHCP i NTP:

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
      - "443:443/tcp"
    environment:
      TZ: 'Europe/Warsaw'
      FTLCONF_webserver_api_password: 'zmien-to-haslo'
      FTLCONF_dns_listeningMode: 'ALL'
    volumes:
      - './etc-pihole:/etc/pihole'
    restart: unless-stopped

Objaśnienie ustawień:

  • Dzięki TZ dzienniki są rotowane o północy czasu lokalnego, a nie o północy UTC.
  • FTLCONF_webserver_api_password to hasło do strony administracyjnej. Bez tej zmiennej generowane jest losowe hasło, zapisywane w dzienniku. Znajdziesz je poleceniem docker logs pihole, szukając tekstu „random password”. Na stronie konfiguracji opisano też zmienną WEBPASSWORD_FILE do użycia z sekretami Dockera, jeśli wolisz nie trzymać hasła w pliku.
  • FTLCONF_dns_listeningMode: 'ALL' jest według oficjalnego pliku wymagane przy domyślnej sieci mostkowej Dockera, bo zapytania docierają do kontenera spoza jego podsieci. W dokumentacji Pi-hole tryb ALL jest opisany jako „Permit all origins” i jest tam ostrzeżenie, że serwer musi być dobrze chroniony zaporą, inaczej może stać się otwartym resolwerem. W praktyce: nigdy nie przekierowuj portu 53 z internetu na ten komputer.
  • W wolumenie są przechowywane konfiguracja i bazy danych, także po ponownym utworzeniu kontenera.
  • Uprawnienia: w oficjalnym pliku są dodane NET_ADMIN (potrzebne tylko wtedy, gdy Pi-hole jest serwerem DHCP), SYS_TIME (tylko gdy przez Pi-hole ustawiany jest zegar komputera) i opcjonalne SYS_NICE. Przy samym DNS żadne z nich nie jest potrzebne. Twórcy projektu odradzają tryb --privileged.

Jeśli port 80 albo 443 jest już zajęty, zmień lewą stronę mapowania, na przykład na "8080:80/tcp".

Uruchomienie:

docker compose up -d

Następnie otwórz http://<adres-IP>/admin/ i zaloguj się.

Przełączenie sieci na Pi-hole

Na stronie Pi-hole o czynnościach po instalacji są trzy sposoby, od najlepszego:

  1. Wpisz Pi-hole jako serwer DNS w ustawieniach DHCP routera. Wtedy wszystkie urządzenia z adresem przydzielonym przez router są obsługiwane przez Pi-hole bez dalszych zmian. Nowy serwer DNS jest przekazywany przy odnowieniu dzierżawy, więc ponowne uruchomienie urządzeń przyspiesza zmianę. Nie wpisuj w tym samym miejscu publicznego serwera DNS jako drugiego, bo zapytania mogą wtedy omijać Pi-hole.
  2. Użyj serwera DHCP wbudowanego w Pi-hole, jeśli w routerze nie da się zmienić serwera DNS. Najpierw wyłącz DHCP w routerze, a w pliku Compose dodaj port 67:67/udp i uprawnienie NET_ADMIN z oficjalnego pliku.
  3. Ustaw serwer DNS ręcznie na każdym urządzeniu, w ostateczności.

W dokumentacji jest też ostrzeżenie dotyczące samego komputera z Pi-hole: jeśli na tym komputerze Pi-hole jest ustawiony jako serwer DNS, a kontener przestanie działać, rozpoznawanie nazw na komputerze też przestaje działać i pobranie obrazu do naprawy może się nie udać. Lepiej ustawić na nim inny serwer DNS, chyba że świadomie akceptujesz to ryzyko.

Nazwy urządzeń zamiast adresów

Gdy adresy przydziela router, w Pi-hole widać tylko adresy IP. Przy włączonym ustawieniu Reverse server (dawniej „conditional forwarding”) zapytania o nazwy adresów lokalnych są przekazywane do routera, dzięki czemu urządzenia są widoczne pod nazwami. W Dockerze ustawia się to zmienną środowiskową:

      FTLCONF_dns_revServers: 'true,192.168.1.0/24,192.168.1.1,lan'

Kolejne pola to: włączenie, zakres adresów sieci lokalnej w notacji CIDR, adres routera i domena lokalna używana przez router. Wpisz własny zakres, adres i domenę. Domena zależy od modelu routera. Pomaga też rezerwacja DHCP dla każdego urządzenia IoT, bo wtedy dany adres w dzienniku zawsze oznacza to samo urządzenie.

Czytanie dziennika zapytań

Otwórz w panelu Query Log i przefiltruj wyniki według klienta. Przy urządzeniach IoT zwróć uwagę na:

  • Częstotliwość. Zapytania z gniazdka o tę samą domenę co kilka sekund oznaczają regularne odpytywanie usługi w chmurze.
  • Nieoczekiwane domeny. Domeny analityczne, reklamowe albo śledzące w urządzeniu, które nie ma nawet ekranu.
  • Nieudane i zablokowane zapytania. Jeśli po dodaniu listy blokowania urządzenie przestanie działać, przyczynę zwykle widać wśród ostatnich zablokowanych zapytań.

Od poziomu prywatności zależy, ile danych jest zapisywanych. Poziom 0 (domyślny) oznacza pełny zapis. Na wyższych poziomach ukrywane są domeny, potem klienci, a na poziomie 3 dziennik zapytań i długoterminowy zapis są całkiem wyłączone. Do obserwacji urządzeń IoT potrzebny jest poziom 0, najwyżej 1. Zapytania zapisane z ukrytymi szczegółami są ukryte na stałe, nawet po obniżeniu poziomu.

Blokowanie domen tylko dla urządzeń IoT

W Pi-hole klienci, domeny i listy blokowania są powiązane przez grupy. Każdy klient i każdy wpis trafia na początku do specjalnej grupy Default, której nie da się usunąć. W przykładzie zarządzania grupami w dokumentacji jest schemat reguł dla pojedynczych urządzeń:

  1. Utwórz grupę, na przykład „iot”.
  2. Dodaj urządzenia IoT jako klientów (po adresie IP) i przypisz je do tej grupy.
  3. Dodaj blokowaną domenę do listy zabronionych i przypisz ją do grupy „iot”.
  4. Usuń przypisanie tej domeny do grupy Default, żeby nie dotyczyła innych urządzeń.

W przykładzie z dokumentacji użyto bezpośrednich poleceń dla bazy danych, a w panelu WWW są te same grupy, klienci i przypisania domen. Dokładne nazwy pozycji menu mogą się różnić między wersjami, więc szukaj w menu bocznym części poświęconej zarządzaniu grupami.

Utrzymanie

  • Aktualizacje. Twórcy Pi-hole odradzają automatyczne aktualizacje kontenera (na przykład przez Watchtower). Przeczytaj informacje o wydaniu, a potem pobierz nowy obraz i utwórz kontener na nowo: docker compose pull, a następnie docker compose up -d. Dane są przechowywane w wolumenie etc-pihole.
  • Listy blokowania są odświeżane automatycznie raz w tygodniu przez zadanie cron w kontenerze, we wczesnych godzinach niedzielnego poranka.
  • Plan awaryjny. Gdy Pi-hole nie działa, w całej sieci przestaje działać rozpoznawanie nazw domen. Zapisz adres panelu routera, żeby w razie awarii szybko przywrócić poprzedni serwer DNS.