Raspberry Pi VPN – Teil 9: Installation Pi-Hole

Raspberry Pi VPN

Mit der Einrichtung eines VPN-Tunnels vom Smartphone auf unseren eigenen VPN-Server haben wir bereits viel für die Sicherheit am Smartphone erreicht. Nun gehen wir einen Schritt weiter und installieren Pi-Hole zusätzlich auf den VPN-Server (Raspberry Pi). Pi-Hole klinkt sich in das System der Namensauflösung am Raspberry Pi ein und und hat dadurch die Möglichkeit, unliebsame Tracking- oder Werbe-Server zu blockieren. Gesteuert wir Pi-Hole über mitgelieferte Blacklists, die bekannte Tracker beinhalten. Darüber hinaus lassen sich vom Anwender eigene Black- und White-Listen anlegen und so die werksseitigen Vorgaben an die eigenen Bedürfnisse anpassen.

Wie funktioniert Pi-Hole

Mit Werbung
App mit Werbung

Wie in der Einleitung bereits kurz angerissen, ist Pi-Hole eine Software, die sich in die Namensauflösung des Raspberry Pi einschleift. So muss jedes Datenpaket, das eine DNS-Anfrage (Domain Name System) enthält, zwangsweise an Pi-Hole vorbei. Und nachdem wir Pi-Hole auf unserem VPN-Server installieren werden, trifft das auch auf alle Datenpakete zu, die durch den VPN-Tunnel vom Smartphone kommen.

Pi-Hole kann folglich alle Namensauflösungsvorgänge des (oder der) Smartphones analysieren und gegebenenfalls blockieren.

Wer sich unter Namensauflösung noch nichts vorstellen kann, der kann es selber auf einem Unixsystem (zum Beispiel dem Raspberry Pi) mit dem host Kommando einmal ausprobieren:

$ host heise.de
heise.de has address 193.99.144.80
heise.de has IPv6 address 2a02:2e0:3fe:1001:302::
heise.de mail is handled by 10 relay.heise.de.

Das ist die DNS-Anfrage für heise.de und die liefert drei Ergebnisse: eine IPv4 Adresse, eine IPv6 Adresse und den Namen des Mail-Servers. Typischerweise wissen wir von einer Webseite im Internet nur den Namen – damit die Datenpakete aber ihren Weg finden, wird die IP-Adresse benötigt. Und die liefert uns DNS. Beim Surfen im Internet passiert das natürlich unsichtbar im Hintergrund – der Browser macht das automatisch, so dass sich der Mensch um IP-Adressen normalerweise keine Gedanken machen muss.

Ohne Werbung
App mit Pi-Hole ohne Werbung

Jetzt muss man wissen, dass beim Aufruf einer Webseite oftmals mehrere DNS-Anfragen notwendig sind. Einmal für die Webseite selbst und dann für weitere Elemente, die in diese Webseite eingebunden sind, so weit diese unter einem anderen Domänennamen verlinkt sind. Das können Bilder sein, oder Videos, aber auch Werbung oder Tracking-Services.

Bei jeder Anforderung einer Namensauflösung prüft nun Pi-Hole ob der angefragte Domänenname in einer hinterlegten Blacklist eingetragen ist. Ist das der Fall, dann blockiert Pi-Hole die Anfrage und sendet selbst 0.0.0.0 als ungültige IP-Adresse zurück. Ist der Domänenname in keiner Blacklist verzeichnet, wird die Anfrage an den DNS-Server weitergeleitet und die Anfrage so beantwortet. Auf diese Weise können bekannte Tracking- und Werbeserver effektiv blockiert werden. Und das gilt universell für alles, was auf DNS basiert, also nicht nur für Webseiten, sondern auch für Apps, wie man an den beiden Beispielbildern sehen kann.

Mehr zu Pi-Hole findet sich auf der Pi-Hole Website und bei Github.com. Dazu gibt es eine umfangreiche Dokumentation.

Installation von Pi-Hole

Typischerweise installiert man OpenVPN (PiVPN) zuerst und wenn der Tunnel funktioniert, dann kommt Pi-Hole an die Reihe. Die Installation von Pi-Hole starten wir am Raspberry Pi mit:

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

Das führt zu folgenden Abfragen:

Bei den meisten Abfragen können die Vorgaben einfach bestätigt werden, wichtig sind die folgenden Eingabefenster:

Interfaceauswahl

An sich wäre das Tunnelinterface tun0 die richtige Auswahl, allerdings kann es passieren, dass die Installation dann später auf einen Fehler mit der DNS Resolution läuft (zumindest in der aktuellen Version v4.2.2). Deshalb ist meine Empfehlung, in dieser Auswahl das LAN-, bzw. WLAN-Interface zu selektieren, je nachdem, wie der Raspberry Pi angebunden ist. Das Tunnelinterface werden wir dann später ergänzen.

Upstream DNS Provider

Der Upstream DNS Provider ist der DNS-Server, an den sich Pi-Hole selbst zur Namensauflösung wendet. Hier sollte Custom gewählt werden.

Upstream DNS Server Adresse

Und in der darauf folgenden Eingabemaske geben wir die IP-Adresse unseres eigenen DNS-Servers im lokalen Netz ein. Üblicherweise ist das der eigene Internetrouter. Diese Adresse hatten wir bei der Konfiguration von PiVPN zu diesem Zweck ebenfalls eingetragen.

Den eigenen Router nehmen wir aus folgenden Grund: Externe DNS-Server, wie die im Beispiel angegebenen beiden von Google, können zwar alle Domänennamen im Internet auflösen, aber nicht die Namen der Geräte im eigenen Heimnetz. Die kennt aber der Internetrouter, weil er fast immer gleichzeitig auch DHCP- und DNS-Server ist. Wer also einen File- oder Printserver im eigenen Netz betreibt, oder weitere Raspberry Pis – und wer über den VPN-Tunnel darauf zugreifen möchte, der muss den internen DNS-Server, also den Internetrouter hier eintragen.

Blockierlisten

Bei der Abfrage der Blockierlisten übernehmen wir die Voreinstellung (alle Listen ausgewählt) und bestätigen mit Enter. Später können wir nicht gewünschte Listen in der Weboberfläche jederzeit wieder deaktivieren.

IPV4 und IPv6

Bei der Auswahl der IP-Protokolle können wir IPv6 getrost abwählen. Durch den VPN-Tunnel kommt ausschließlich IPv4.

Pi-Hole complete

Damit ist die Installation abgeschlossen. Das letzte Bild gibt die Links zum Install-Log und zur Weboberfläche aus, sowie das Admin-Passwort dafür. An dieser Stelle sollte ein Reboot erfolgen. Die Ausgabe des Intstallationsvorgangs auf der Konsole sieht in etwa wie folgt aus – man erkennt, dass nicht jede Fehlermeldung kritisch ist.

$ curl -sSL https://install.pi-hole.net | bash
stty: Standardeingabe: Unpassender IOCTL (I/O-Control) für das Gerät

  [✗] Root user check
  [i] Script called with non-root privileges
      The Pi-hole requires elevated privileges to install and run
      Please check the installer for any concerns regarding this requirement
      Make sure to download this script from a trusted source

  [✓] Sudo utility check
stty: Standardeingabe: Unpassender IOCTL (I/O-Control) für das Gerät

  [✓] 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... up to date!

  [i] Installer Dependency checks...
  [✓] Checking for apt-utils
  [i] Checking for dialog (will be installed)
  [✓] Checking for debconf
  [✓] Checking for dhcpcd5
  [✓] Checking for git
  [✓] Checking for iproute2
  [✓] Checking for whiptail
  [i] Using interface: wlan0
  [i] Using   [✓] Set IP address to 192.168.0.167 
  You may need to restart after the install is complete
  [i] IPv4 address: 192.168.0.167/24
  [i] IPv6 address: 
  [i] Web Interface On
  [i] Web Server On
  [i] Logging On.
  [✗] Check for existing repository in /etc/.pihole
  [✓] Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole

  [✗] Check for existing repository in /var/www/html/admin
  [✓] Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin

  [i] Main Dependency checks...
  [✓] Checking for cron
  [✓] Checking for curl
  [✓] Checking for dnsutils
  [✓] Checking for iputils-ping
  [i] Checking for lsof (will be installed)
  [i] Checking for netcat (will be installed)
  [✓] Checking for psmisc
  [✓] Checking for sudo
  [✓] Checking for unzip
  [✓] Checking for wget
  [i] Checking for idn2 (will be installed)
  [i] Checking for sqlite3 (will be installed)
  [✓] Checking for libcap2-bin
  [i] Checking for dns-root-data (will be installed)
  [i] Checking for resolvconf (will be installed)
  [✓] Checking for libcap2
  [i] Checking for lighttpd (will be installed)
  [i] Checking for php-common (will be installed)
  [i] Checking for php-cgi (will be installed)
  [i] Checking for php-sqlite3 (will be installed)
  [✓] Enabling lighttpd service to start on reboot...

  [i] FTL Checks...

  [✓] Detected ARM-hf architecture (armv7+)
  [i] Checking for existing FTL binary...
  [✓] Downloading and Installing FTL
  [✓] Creating user 'pihole'
  [✓] Installing scripts from /etc/.pihole

  [i] Installing configs from /etc/.pihole...
  [✓] No dnsmasq.conf found... restoring default dnsmasq.conf...
  [✓] Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf

  [i] Installing blocking page...
  [✓] Creating directory for blocking page, and copying files
  [✓] Backing up index.lighttpd.html

  [✓] Installing sudoer file

  [✓] Installing latest Cron script

  [✓] Installing latest logrotate script
  [i] Backing up /etc/dnsmasq.conf to /etc/dnsmasq.conf.old

  [i] Skipping firewall configuration
  [✓] man pages installed and database updated
  [i] Testing if systemd-resolved is enabled
  [i] Systemd-resolved is not enabled
  [✓] Restarting lighttpd service...
  [✓] Enabling lighttpd service to start on reboot...
  [i] Restarting services...
  [✓] Enabling pihole-FTL service to start on reboot...
  [✓] Restarting pihole-FTL service...
  [✓] Deleting existing list cache
  [i] Pi-hole blocking is enabled
  [i] Neutrino emissions detected...
  [✓] Pulling blocklist source list into range

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: mirror1.malwaredomains.com (justdomains)
  [✓] Status: Retrieval successful

  [i] Target: sysctl.org (hosts)
  [✓] Status: Retrieval successful

  [i] Target: zeustracker.abuse.ch (blocklist.php?download=domainblocklist)
  [✓] Status: Retrieval successful

  [i] Target: s3.amazonaws.com (simple_tracking.txt)
  [✓] Status: Retrieval successful

  [i] Target: s3.amazonaws.com (simple_ad.txt)
  [✓] Status: Retrieval successful

  [i] Target: hosts-file.net (ad_servers.txt)
  [✓] Status: Retrieval successful

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

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [i] Pi-hole blocking will be enabled
  [i] Enabling blocking
  [✓] Reloading DNS service
  [✓] Pi-hole Enabled
fatal: Keine Namen gefunden, kann nichts beschreiben.
fatal: Keine Namen gefunden, kann nichts beschreiben.
  [i] Web Interface password: _U1S_eR0
  [i] This can be changed using 'pihole -a -p'

  [i] View the web interface at http://pi.hole/admin or http://192.168.0.167/admin

  [i] You may now configure your devices to use the Pi-hole as their DNS server
  [i] Pi-hole DNS (IPv4): 192.168.0.167
  [i] 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! 

Nacharbeiten

Bevor wir mit Pi-Hole arbeiten können sind ein paar Nacharbeiten erforderlich.

Admin Passwort ändern

Das kryptische Passwort, das während der Installation vergeben wurde, kann sich niemand merken, wir setzen also zuerst ein neues Admin-Passwort mit:

$ pihole -a -p
Enter New Password (Blank for no password): 
Confirm Password: 
  [✓] New password set

Das Passwort wird zur Anmeldung in der Pi-Hole-eigenen Weboberfläche benötigt.

Anpassung der PiVPN Konfiguration an Pi-Hole

Wir erinnern uns, dass wir bei der Installation von PiVPN als DNS-Server unseren eigenen Internet Router eingetragen hatten. Das war auch richtig, so lange PiVPN eigenständig gelaufen ist. Nun kommt Pi-Hole dazu und muss in die Linie der Namensauflösung eingeschleift werden. Wir müssen also PiVPN so umkonfigurieren, dass Pi-Hole als DNS-Server verwendet wird. Oder – um es etwas genauer auszudrücken: PiVPN soll angeschlossenen VPN-Clients (also Smartphones) mitteilen, dass Pi-Hole künftig der richtige Ansprechpartner für DNS-Anfragen ist. Das erreichen wir durch eine Änderung in der PiVPN-Konfigurationsdatei:

sudo nano /etc/openvpn/server.conf

Hier suchen wir nach der Zeile:

push "dhcp-option DNS 192.168.0.1"

und ändern sie wie folgt:

push "dhcp-option DNS 10.8.0.1"

192.168.0.1 ist in meinem Beispiel die IP-Adresse des Internet Routers, die kann in anderen Netzen natürlich anders lauten. Und 10.8.0.1 ist das Tunnelinterface am Raspberry Pi. Die Adresse kann 1:1 so übernommen werden – PiVPN konfiguriert immer diese Adresse. Jetzt werden VPN-Clients alle DNS-Anfragen an Pi-Hole richten und Pi-Hole seinerseits versorgt sich dann beim Internet Router. Vor dem Speichern überprüfen wir sicherheitshalber, dass kein weiterer Eintrag mit push "dhcp-option DNS ... existiert.

Ergänzung des Tunnel-Interfaces in Pi-Hole

Bei der Installation von Pi-Hole (weiter oben in diesem Artikel) hatten wir als Interface den LAN, bzw WLAN-Anschluss des Raspberry Pi eingetragen. Das belassen wir auch so, aber wir müssen zusätzlich das Tunnelinterface ergänzen, damit Pi-Hole auch dort DNS-Anfragen filtert. Pi-Hole hat bei der Installation eine Konfigurationsdatei mit Namen 01-pihole.conf im Verzeichnis /etc/dnsmasq.d angelegt. Die wollen wir aber nicht direkt verändern, damit unsere Anpassung nicht durch künftige Updates oder Änderungen überschrieben wird. Wir legen also besser eine zweite eigene Konfigurationsdatei im selben Verzeichnis an:

sudo nano /etc/dnsmasq.d/02-my.conf

und schreiben folgende Zeile hinein:

interface=tun0

Damit sind alle Nacharbeiten abgeschlossen, wir müssen nur noch einen Reboot vornehmen, damit die Konfigurationsänderungen auch übernommen werden.

Weboberfläche von Pi-Hole

Pi-Hole

Pi-Hole bringt eine sehr umfangreiche Weboberfläche mit, die Statistiken und die aktuellen DNS-Anfragen anzeigt und es ermöglicht Einstellungen zu ändern und White- und Blacklists zu pflegen. Der Aufruf erfolgt im Browser unter dem Namen des Raspberry Pi (oder seiner IP-Adresse) mit angehängtem /admin/, also zum Beispiel:

http://raspi167/admin/

Unter Query Log sind dann die letzten DNS-Anfragen zu sehen, die über Pi-Hole gelaufen sind und in den Farben grün und rot, ob sie weitergeleitet oder blockiert wurden.

Pi-Hole Queries

Zu jedem Eintrag gibt es rechts einen Button, mit dem wir die entsprechende Domäne in unsere eigene White- bzw. Blacklist aufnehmen können.

Es ist nicht alles schlecht

Ich bin kein Freund des radikalen Unterdrückens von Werbung, weil sich meine eigenen Webseiten natürlich auch nur durch Werbung finanzieren. Wer das ähnlich sieht, der kann über die Pi-Hole Weboberfläche ein wenig experimentieren, welche Blocklists den eigenen Vorstellungen entsprechen. Zu diesem Zweck ist die Suchfunktion unter Tools – Query Lists hilfreich, mit der man die Blockierlisten nach bestimmten Domänennamen durchsuchen kann.

Pi-Hole Whitelist

Ich bin aber sehr wohl dagegen, dass das Surfen in Internet getrackt wird und große Internetunternehmen umfangreiche Daten über uns Bürger anhäufen. Aus diesem Grund ist diese Artikelserie entstanden. Aber auch hier gilt es zu differenzieren, denn Tracking ist nicht gleich Tracking. So verwendet zum Beispiel die Verwertungsgesellschaft Wort auch Tracking-Pixel. Die VG-Wort ist in Deutschland in etwa vergleichbar mit der GEMA für Musik, aber eben für Verlage, Schriftsteller und auch Web-Autoren. Die können über die VG-Wort Vergütungen für ihre Texte im Internet erhalten, allerdings nur, wenn die VG-Wort ermitteln kann, wie oft diese Texte (also Webseiten) im Jahr aufgerufen werden. Daten über die Besucher der Webseiten werden dabei nicht gespeichert. Trotzdem werten einige der Pi-Hole Blocklists die Erfassung der VG-Wort als Tracking, was technisch ja durchaus stimmen mag. Als Anwender von Pi-Hole kann man dem abhelfen, in dem man selbst eine Whitelist anlegt. Zum Beispiel mit den neun Servern der VG-Wort, wie ich das in dem Beispiel gemacht habe.

Weitere Artikel in dieser Kategorie:

4 Kommentare

  1. Anonymous

    Hallo,

    und erstmal danke für die Anleitungen. Funktionieren tut alles.

    Ich habe das Handy dauerhaft über PiVPN verbunden, da fast jede App mit Trackingcode verseucht ist. Die DNS-Anfragen laufen auch ordnungsgemäß im PiHole auf und werden gefiltert.

    Allerdings wird mir die Statistik ziemlich versaut, weil ich minütlich mehrere hundert Querys für meinen DynDNS-Anbieter drin stehen habe.

    Habe ich etwas falsch konfiguriert, oder ist das zwangsweise so, dass jedes VPN-Paket eine eigene DNS-Anfrage stellt?

    Oder hängt es damit zusammen, dass das VPN über TLS anstelle von UDP läuft und TLS für jedes Paket eine eigene DNS-Anfrage stellt?

  2. Helmut (Beitrag Autor)

    Dyn-DNS-Anfragen sollten überhaupt nicht bei PiHole ankommen. DNS steht vor dem Tunnelaufbau und PiHole kommt erst ins Spiel, wenn der Tunnel bereits steht.

  3. kaschmir

    Guter Artikel und klasse Projekt!
    Habe mal meinen Raspberry 3 mit Pihole installiert und dazu eine Videoanleitung veröffentlicht:

    Installation:
    https://devtube.dev-wiki.de/video-channels/pihole_01/videos

    Inbetriebnahme:
    https://devtube.dev-wiki.de/video-channels/pihole_02/videos

    Gruß Dr. Varut Kaschmir

  4. Helmut (Beitrag Autor)

    Schön gemachte Videos – vielen Dank.

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.