Werbung blocken mit Pi-hole

Datum

Im Kampf gegen die Werbung im Internet helfen in der Regel Adblocker, welche als Plugin für den jeweiligen Browser installiert werden können.
Aber wäre es nicht einfacher, wenn man nicht auf jedem System erst einmal Browser einrichten muss, sondern nur eine Anpassung der DNS-Einstellung vornehmen muss um vor Werbung geschützt zu sein?

Das Grundprinzip von Pi-hole ist, dass das Pi-hole System als DNS-Server fungiert, welches DNS-Anfragen annimmt und überprüft ob Domains dabei sind welche auf einer Blacklist stehen.
Hierbei verfügt Pi-hole noch über eine gut strukturierte Web-GUI in der man auch eigene White- und Blacklisten pflegen kann.

Pi-hole besteht aus 3 Komponenten:

  1. Core
  2. Webgui
  3. FTL

Installation

Homepage: pi-hole.net

Das Projekt war, wir der Name bereits vermuten lässt, ursprünglich für den RaspberryPI gedacht. Aber ich nutze Pi-hole in einem Container, welchen ich entsprechend erreichbar mache.

+--------+---------+-----------------------+-----------------------------------------------+------------+-----------------+
|  NAME  | STATUS  |         IPV4          |                     IPV6                      |    TYP     | SCHNAPPSCHÜSSE |
+--------+---------+-----------------------+-----------------------------------------------+------------+-----------------+
| pihole | RUNNING | 10.239.182.169 (eth0) | fd51:2e64:a2c7:88e6:216:3eff:fe27:17ca (eth0) | PERSISTENT | 0               |
+--------+---------+-----------------------+-----------------------------------------------+------------+-----------------+

Das Projekt bietet ein Installationsscript an, welches man sich entweder herunterladen und ausführen oder auch direkt in die Bash pipen kann.
Hierbei muss jeder selber wissen was ihm am sichersten erscheint.

root@pihole:~# curl -sSL https://install.pi-hole.net | bash

  [✓] Root user check

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

  [✓] Disk space check

  [✓] Update local cache of available packages

  [✗] Checking apt-get for upgraded packages
      Kernel update detected. If the install fails, please reboot and try again

  [i] Installer Dependency checks...
  [✓] Checking for apt-utils
  [i] Checking for dialog (will be installed)
  [✓] Checking for debconf
  [i] Checking for dhcpcd5 (will be installed)
  [✓] Checking for git
...

  [✓] Consolidating blocklists
  [✓] Extracting domains from blocklists
  [i] Number of domains being pulled in by gravity: 147323
  [✓] Removing duplicate domains
  [i] Number of unique domains trapped in the Event Horizon: 124347
  [i] Nothing to whitelist!
  [✓] Parsing domains into hosts format
  [✓] Cleaning up stray matter

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [✓] Pi-hole blocking is Enabled
  [i] Web Interface password: 2TnDRysU
      This can be changed using 'pihole -a -p'

  View the web interface at http://pi.hole/admin or http://10.239.182.169/admin

  You may now configure your devices to use the Pi-hole as their DNS server
  [i] Pi-hole DNS (IPv4): 10.239.182.169
  [i] Pi-hole DNS (IPv6): fd51:2e64:a2c7:88e6:216:3eff:fe27:17ca
  If you set a new IP address, please restart the server running the Pi-hole

  [i] The install log is located at: /etc/pihole/install.log
  Installation Complete!

Wie man sieht wird direkt bei der Installation ein Passwort erzeugt, welches aus einer zufälligen Kombination von Groß- und Kleinbuchstaben und Zahlen besteht.
Das ist definitiv eine bessere Lösung als ein default-passwort, welches bei jeder Installation identisch ist.

Ändern kann man das Passwort dann direkt auf dem System mit dem Befehl pihole -a -p

root@pihole:~# pihole -a -p
Enter New Password (Blank for no password):
Confirm Password:
  [✓] New password set

Als kleine Anpassung muss ich noch alle ankommenden DNS-Abfragen an das Hostsystem an den entsprechenden Container weiterleiten:
iptables -A PREROUTING -t nat -p tcp --dport 53 -j DNAT --to 10.239.182.169:53

Aktualisieren

Um Pi-hole auf dem neusten Stand zu bekommen kann man folgenden Befehl verwenden:

 pihole -up
  [i] Checking for updates...
  [i] Pi-hole Core:	up to date
  [i] FTL:		up to date
  [i] Web Interface:	up to date

  [✓] Everything is up to date!

oder auch pihole updatePihole
Das lässt sich auch per Cronjob automatisieren. Hierzu trägt man in die Datei /etc/cron.d/pihole noch folgende Zeilen ein:

# Pi-hole: Update Pi-hole! 
30 2    * * 7   root    /usr/local/bin/pihole updatePihole

Einstellen als DNS-Server

Je nach vorhandenen Systemen sollte nun die IP oder die entsprechende Domain des Pi-hole Systems als DNS-Server eingetragen werden.
Dies kann man entweder auf den jeweiligen Systemen in der entsprechenden Konfiguration einstellen oder auch im lokalen Heim-Router.

Die Web-GUI

Die Weboberfläche erreicht man unter http://<IP-des-Systems>/admin

Hier erhält man nur eine sehr rudimentäre Übersicht und man muss sich einloggen um Einstellungen im Pi-hole anzupassen.
Sofern es noch nicht geändert wurde, verwendet man dazu das Initial-Passwort.

Unter Settings —> DNS lassen sich die Nameserver einstellen, welche zum auflösen der DNS-Anfragen verwendet werden sollen.
Momentan stehen zur Auswahl:

  • Google DNS (auch IPv6)
  • OpenDNS (auch IPv6)
  • Level3
  • Norton
  • Comodo
  • DNS.WATCH (auch IPv6)
  • Quad9 (auch IPv6)

Und sofern man noch keinen eigenen DHCP-Server verwendet, kann dies auch von Pi-hole übernommen werden.
Dazu passt man unter Settings —> DHCP die entsprechenden Einstellungen an.

Die Blocklisten lassen sich ebenfalls über die Weboberfläche verwalten (Settings —> Block Lists).

Troubleshooting

Es kann passieren, dass man z.B. eine Blockliste hinzufügen will oder ähnliches und dabei erscheint folgende Fehlermeldung:
Failed CORS: pihole.techgoat.net vs 10.239.182.169, fd51:2e64:a2c7:88e6:216:3eff:fe27:17ca, 10.239.182.169, pi.hole, localhost

Diese Fehlermeldung besagt, dass Pi-hole mit dem übergebenen Domainnamen nichts anfangen kann, bzw. das es sich nicht um einen autorisierten Hostname handelt.
Um dies anzupassen bearbeiten wir die Datei /var/www/html/admin/scripts/pi-hole/php/auth.php und fügen in das Array AUTHORIZED_HOSTNAMES = array( noch die entsprechenden Domains ein.

Aus:

    // Check CORS
    $AUTHORIZED_HOSTNAMES = array(
        $ipv4,
        $ipv6,
        str_replace(array("[","]"), array("",""), $_SERVER["SERVER_NAME"]),
        "pi.hole",
        "localhost"
    );

wird dann:

    // Check CORS
    $AUTHORIZED_HOSTNAMES = array(
        $ipv4,
        $ipv6,
        str_replace(array("[","]"), array("",""), $_SERVER["SERVER_NAME"]),
        "pi.hole",
        "localhost",
        "10.239.182.169",
        "pihole.techgoat.net"
    );

Wichtig ist hierbei, dass hinter jedem eingetragenen String ein Komma kommt außer hinter den letzten.

Anzeige auf einem kleinen LCD-Monitor

mit dem Befehl pihole -c -e zeigt pihole im Terminal eine Übersicht über die wichtigsten Parameter an, welche man sich z.B. auf einem entsprechenden separaten Monitor ausgeben lassen kann…

Mit einer entsprechenden Schleife aktualisiert sich die Anzeige entsprechend.
$ while true; do pihole -c -e; sleep 10; done;

Autor
Kategorien Linux, Software

PRTG Map