Pi-Hole

Pi-Hole blockiert bereits auf Netzwerkebene Werbung und Internet-Tracker. Es arbeitet als DNS-Sinkhole und optional als DHCP-Server, und ist für den Einsatz in einem privaten Netzwerk gedacht. Pi-Hole wurde ursprünglich für den Raspberry Pi entwickelt, läuft aber auf allen Linux-Distributionen.

.;;,.
.ccccc:,.
 :cccclll:.      ..,,
  :ccccclll.   ;ooodc
   'ccll:;ll .oooodc
     .;cll.;;looo:.
         .. ','.
        .',,,,,,'.
      .',,,,,,,,,,.
    .',,,,,,,,,,,,....
  ....''',,,,,,,'.......
.........  ....  .........
..........      ..........
..........      ..........
.........  ....  .........
  ........,,,,,,,'......
    ....',,,,,,,,,,,,.
       .',,,,,,,,,'.
        .',,,,,,'.
          ..'''.

Installation

Die Installation am besten per Shell-Skript vornehmen.

Wichtig:

  • SELinux darf nicht auf „Enabled“ stehen.

  • Web-GUI: Ist kein Webserver mit PHP (cli pdo xml json intl) installiert, bringt das Installationsskript lighttpd sowie PHP aus dem Remi-Repo mit. Auf einem bestehenden Apache installiert es sich in /var/www/html/pihole.

  • Details zum „Privacy Mode“: https://docs.pi-hole.net/ftldns/privacylevels/

Auf RHEL 8:

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

Das Skript fragt interaktiv ab:

Select Upstream DNS Provider: z.B. Cloudflare
Pi-hole relies on third party lists in order to block ads: StevenBlack's Unified Hosts List
Do you wish to install the web admin interface?: On
Do you wish to install the web server (lighttpd) and required PHP modules?: On
Do you want to log queries? : On
Select a privacy mode for FTL: Anonymous mode

Danach ist das Web-GUI über http://pi-hole/admin erreichbar, ein zufälliges Passwort wird am Ende des Skripts mitgeteilt.

Anschliessend können die Clients die Pi-Hole-Maschine als primären DNS-Resolver verwenden.

Passwort zurücksetzen

PIHOLE_SKIP_OS_CHECK=true sudo -E pihole admin password

Blacklists, Updates

Eine Sammlung an URLs, die Blacklisten mit Ad-Serving-Domains pflegen, kann z.B. von https://v.firebog.net/hosts/lists.php bezogen werden. Hat man sich für einige Blacklisten entschieden, werden diese im GUI unter http://pi-hole/admin/groups-adlists.php importiert. Danach muss die interne Datenbank /etc/pihole/gravity.db:adlists mit Ad-Serving-Domains entweder per Web-GUI oder per Kommandozeile aktualisiert werden (letzteres am besten regelmässig per Cronjob):

PIHOLE_SKIP_OS_CHECK=true sudo -E pihole updateGravity

Log-DB begrenzen

Pi-Hole speichert die Logdaten in einer SQ-Lite Datenbank ab. Per default werden die Daten 365 Tage behalten. Um diesen Wert zu ändern muss die Datei /etc/pihole/pihole-FTL.conf ergänzt werden.

echo "MAXDBDAYS=30" >> /etc/pihole/pihole-FTL.conf

Sollte die DB bereits Daten beinhalten welche älter als die angegebenen Tage sind, muss erst der Dienst gestoppt und die DB-Datei gelöscht/gesichert werden. Beim starten des Dienstes wird die DB-Datei dann neu erzeugt.

systemctl stop pihole-FTL.service
rm /etc/pihole/pihole-FTL.db
systemctl start pihole-FTL.service

Mehrere Pi-Holes mit Gravity-Sync

Quelle: https://github.com/vmstan/gravity-sync

Ein Pi-Hole wird als primärer Host festgelegt, dem mindestens ein weiterer Host folgt.

  • Am primären Pi-Hole nimmt man Konfigurationsänderungen vor, z. B. manuelles Zulassen von Listen, Hinzufügen von Blocklisten, Geräte-/Gruppenverwaltung oder Konfigurieren von benutzerdefinierten/lokalen Netzwerk-DNS.

  • Auf den angeschlossenen Pi-Holes installiert man zunächst Pi-Hole. Das Shell-Script gravity-sync überträgt die Daten vom primären auf die anderen Geräte, was für Ausfallsicherheit und Lastverteilung sorgt.

Auf beiden Pi-Holes die benötigten Tools installieren:

dnf -y install sqlite sudo git cronie rsync

Setup auf dem ersten Pi-Hole:

export GS_INSTALL=primary && curl -sSL https://gravity.vmstan.com | bash

Setup auf dem zweiten Pi-Hole:

ssh-keygen
export GS_INSTALL=secondary && curl -sSL https://gravity.vmstan.com | bash

Das interaktive Skript fragt diverse Einstellungen ab:

[?] Use Advanced Installation Options? (Y/N, default N): Y
[i] Advanced Configuration Selected
[?] Local/Secondary Pi-hole Instance Type? (Allowed: 'docker' or 'podman' or 'default'): default
[?] Primary/Remote Pi-hole Instance Type? (Allowed: 'docker' or 'podman' or 'default'): default
[?] Local/Secondary Pi-hole Settings Directory Path? (Leave blank for default '/etc/pihole'):
[?] Primary/Remote Pi-hole Settings Directory Path? (Leave blank for default '/etc/pihole'):
[?] Local/Secondary DNSMASQ Settings Directory Path? (Leave blank for default '/etc/dnsmasq.d'):
[?] Primary/Remote DNSMASQ Settings Directory Path? (Leave blank for default '/etc/dnsmasq.d'):
[?] Custom SSH Port to Connect to Primary/Remote host? (Leave blank for default '22'):
[?] Enable Ping/ICMP Check of Primary/Remote? (Y/N, default 'Y'):
[?] Custom SSH PKIF Location? (Leave blank for default '.ssh/id_rsa'):
[?] Enable Replicate 'Local DNS Records' Feature? (Y/N, default 'Y'):
[?] Enable Replicate 'Local CNAME Records' Feature? (Y/N, default 'Y'):
[✓] Saving Local CNAME Preference to gravity-sync.conf
[?] Change Backup Retention in Days? (Leave blank for default '3'):
[i] Required Gravity Sync Settings
[?] Primary/Remote Pi-hole Address (IP or DNS): pihole1
[✓] Testing Network Connection (ICMP)
[✓] Saving Primary/Remote Host to gravity-sync.conf
[?] Existing SSH User for pihole1: root
[✓] Saving User root to gravity-sync.conf
[i] Using existing ~/.ssh/id_rsa file
[✓] Importing New gravity-sync.conf
[i] Registering key-pair to pihole1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '22' 'root@pihole1'"
and check to make sure that only the key(s) you wanted were added.

[✓] Creating Bash Alias
[∞] Gravity Sync CONFIGURE completed after 72 seconds

Sync manuell anstossen (nach dem Setup unbedingt empfohlen!):

gravity-sync/gravity-sync.sh pull

Bemerkung

Das Admin-Passwort wird nicht synchronisiert, ist also auf jedem Pi-Hole tendenziell anders.

Vergleich zwischen der primären und der sekundären Datenbank durchführen:

gravity-sync/gravity-sync.sh compare

Automatische Syncs einrichten:

gravity-sync/gravity-sync.sh automate

[] Initalizing Gravity Sync (3.4.7)
[] Loading gravity-sync.conf
[] Evaluating arguments: AUTOMATE
no crontab for root
[i] Select synchronization frequency (in minutes)
[?] Valid options are 5, 10, 15, 30 or 0 to disable (default: 15):
[] Saving new synchronization task to crontab
[] Gravity Sync AUTOMATE completed after 4 seconds

Status der letzten automatischen Ausführung anzeigen:

gravity-sync/gravity-sync.sh cron

Logs einsehen:

gravity-sync/gravity-sync.sh logs

Am Ende die DNS-Einstellungen der Clients so anpassen, dass auch die weiteren Pi-Holes verwendet werden.

Built on 2024-04-18