Mittlerweile sind zwei Jahre seit dem letzten Beitrag zum Pi-Hole vergangen (krass!). Da wird es Zeit, ein paar Notizen zu Verbesserungen, hilfreichen Tricks und Tipps zur Fehlerbehebung aufzuschreiben.

Für mich selbst als Referenz, weil ich dazu tendiere, soche Sachen wieder zu vergessen, und natürlich für alle anderen auch. ☺
Die folgenden Informationen habe ich mir nicht selbst ausgedacht, sondern an verschiedenen Stellen zusammensuchen müssen, hauptsächlich stammen sie aus dem Pi-Hole-Forum.


Inhalt


HTTPS schneller machen

Es ist sinnvoll Regeln für die Firewall auf dem Raspi einzutragen, damit der HTTPS-Seitenaufbau schneller geht. Das Blockieren von HTTPS-Verbindungen dauert länger, weil nur gewartet werden kann, dass die Verbindung in einen Timeout läuft, während beim unverschlüsselten HTTP der Pi-Hole einfach selbst Zieladresse spielt und eine eigene HTML-Seite zurückschickt.[1]

Dazu die folgenden Befehle absetzen (einmal für IPv4, einmal für IPv6):

sudo iptables -A INPUT -p tcp --destination-port 443 -j REJECT --reject-with tcp-reset
sudo iptables -A INPUT -p udp --destination-port 80 -j REJECT --reject-with icmp-port-unreachable
sudo iptables -A INPUT -p udp --destination-port 443 -j REJECT --reject-with icmp-port-unreachable
sudo ip6tables -A INPUT -p tcp --destination-port 443 -j REJECT --reject-with tcp-reset
sudo ip6tables -A INPUT -p udp --destination-port 80 -j REJECT --reject-with icmp6-port-unreachable
sudo ip6tables -A INPUT -p udp --destination-port 443 -j REJECT --reject-with icmp6-port-unreachable
sudo apt install iptables-persistent

Der letzte Befehl sorgt dafür, dass die Einträge dauerhaft gespeichert werden und nach einem Reboot noch vorhanden sind. Beide Male mit „Ja“ antworten. ↩︎

DNS-Einstellungen

Die Angaben im letzten Beitrag zum Pi-Hole sind teilweise überholt – weil das FritzOS inzwischen mehr kann und vor allem, weil ich was dazugelernt habe.

Topologie

Ich habe zwei Netzwerk-Topologien ausprobiert – die eine ist eleganter, aber die andere tut besser. Die jeweilige Namensauflösung funktioniert wie folgt:

  1. FritzBox sagt Clients, dass Pi-Hole der zuständige (lokale) DNS-Server ist.
    Client fragt Pi-Hole nach Namensauflösung > Pi-Hole (benutzt den Cache oder) fragt externen DNS-Server > Pi-Hole gibt Client Ergebnis bekannt (oder blockiert) > Client baut Verbindung über FritzBox auf.
  2. FritzBox sagt Clients, dass Pi-Hole der zuständige (lokale) DNS-Server ist.
    Client fragt Pi-Hole nach Namensauflösung > Pi-Hole (benutzt den Cache oder) fragt FritzBox > FritzBox fragt externen DNS-Server > FritzBox gibt Pi-Hole Ergebnis bekannt > Pi-Hole gibt Client Ergebnis bekannt (oder blockiert) > Client baut Verbindung über FritzBox auf.

Auch wenn Lösung 2 etwas umständlicher ist (wobei ich keinen Unterschied durch den zusätzlich zurückgelegten Weg bemerken konnte) – auf diese Weise funktioniert die Auflösung der internen Namen (fritz.box, fritz.nas) problemlos. Für die Pi-Hole-IPs und -Namen sollte man trotzdem Ausnahmen beim DNS-Rebind-Schutz der FritzBox eintragen (Netzwerk > Netzwerkeinstellungen > DNS-Rebind-Schutz).

  • Um Lösung 1 zu realisieren, wählt man in den Pi-Hole-Einstellungen die bevorzugten (externen) DNS-Server aus.
  • Um die von mir favorisierte Lösung 2 zu realisieren, gibt man im Pi-Hole die IP der FritzBox als DNS-Server ein.

In der FritzBox stellt man beide Male die IP des Pi-Hole als lokalen DNS-Server ein, wie im nächsten Abschnitt erläutert.
Empfehlungen zu Privatsphäre-verträglichen DNS-Servern gibt es zum Beispiel in der Empfehlungsecke vom Kuketz-Blog.

Empfehlungen zu FritzBox-Einstellungen

Die FritzBox erlaubt es (ab FritzOS 6.50), für das Heimnetz einen eigenen DNS-Server anzugeben. Das ist natürlich genau, was wir wollen.

  1. Falls nicht schon bekannt, sollten vorher wir noch herausfinden, wie die IPv4- und die IPv6-Adresse des Pi-Hole lauten. Das geht zum Beispiel per ip -4 a bzw. ip -6 a Befehl, oder auch über nslookup pi.hole. Wenn es nur darum geht herauszufinden, wie die im Pi-Hole konfigurierte IP-Adresse lautet, bietet dessen Weboberfläche den einfachsten Weg: Unter Settings > System werden diese und weitere Informationen präsentiert.
  2. Die Einstellung in der FritzBox ist dagegen etwas versteckt (und nur in der Erweiterten Ansicht möglich):
    Unter Heimnetz > Netzwerk den Reiter Netzwerkeinstellungen wählen. Weiter unten auf der Seite sind dann die Knöpfe IPv4-Adressen und IPv6-Adressen zu finden.
    pihole-fritz-lokaldns
  3. In den IPv4-Einstellungen die IP-Adresse des Pi-Hole als Lokaler DNS-Server eintragen.
    pihole-fritz-lokaldns-ipv4
  4. Für die IPv6-Einstellungen ist etwas mehr zu tun:
    DNSv6-Server auch über Router Advertisement bekanntgeben (RFC 5006) aktivieren und die Adresse als Lokaler DNSv6-Server eintragen.
    Darunter DHCPv6-Server in der FRITZ!Box für das Heimnetz aktivieren > Nur DNS-Server zuweisen auswählen.
    pihole-fritz-lokaldns-ipv6

Noch mehr IPv6-Einstellungen

Wo wir gerade schon dabei sind, sollten wir sicherstellen, dass immer die gleiche, lokale IPv6-Adresse zugewiesen wird:

  1. Weiter oben auf der Netzwerk > Netzwerkeinstellungen > IPv6-Adressen-Seite der FritzBox sollte Unique Local Addresses (ULA) immer zuweisen ausgewählt sein, sowie ULA-Präfix manuell festlegen (fd00 sollte reichen). pihole-fritz-ipv6-ula
  2. Wird hier etwas geändert, ist es sinnvoll danach den Raspi neu zu starten und dann zu überprüfen, ob er eventuell eine andere IPv6-Adresse bekommen hat. (In dem Fall dann wie oben beschrieben auch den DNS-Server anpassen.)
    Weil IPv6-Adressen so überreich vorhanden sind, bleibt es aber normalerweise bei der einmal festgelegten Adresse. (Deshalb gibt es hier auch keine Option analog zu „Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.“) ↩︎

Fehler bei dnsmasq beheben

Aufgrund von Inkompatibilitäten gibt es leider mehrere mögliche Gründe, warum der „dnsmasq“-Service, also ein zentraler Bestandteile unseres DNS-Filtersystems, nicht startet.

Fehlerhafte Startkonfiguration

Eine Änderung im Paket „dns-root-data“ führte bei mir dazu, dass nach einem Reboot dnsmasq nicht mehr startet. Das äußert sich in der folgenden Reihenfolge von Erkenntnissen:

  • Pi-Hole funktioniert nicht, denn
  • das pihole status Kommando ergibt DNS service is not running, denn
  • das sudo systemctl status dnsmasq.service Kommando ergibt
    (...) dnsmasq: Mist in der Kommandozeile (...).
    (Da steht wirklich „Mist“, bzw. englisch dnsmasq: junk found in command line.)

Das Problem lässt sich beheben (es ist ein bekannter Bug):

  1. In der Datei /etc/init.d/dnsmasq die folgende Zeile suchen[2]
    DNSMASQ_OPTS="$DNSMASQ_OPTS sed -e s/". IN DS "/--trust-anchor=.,/ -e s/" "/,/g $ROOT_DS | tr '\n' ' '"
  2. Die Zeile durch diese ersetzen:
    DNSMASQ_OPTS="$DNSMASQ_OPTS sed -e s/'.*IN[[:space:]]DS[[:space:]]'/--trust-anchor=.,/ -e s/'[[:space:]]'/,/g $ROOT_DS | tr '\n' ' '"
    Am Ende soll der Abschnitt in der Datei so aussehen:
# If the dns-root-data package is installed, then the trust anchors 
# will be available in $ROOT_DS, in BIND zone-file format. 
# Reformat as dnsmasq --trust-anchor options.

ROOT_DS="/usr/share/dns/root.ds"

if [ -f $ROOT_DS ]; then
 DNSMASQ_OPTS="$DNSMASQ_OPTS `sed -e s/'.*IN[[:space:]]DS[[:space:]]'/--trust-anchor=.,/ -e s/'[[:space:]]'/,/g $ROOT_DS | tr '\n' ' '`"
fi
  1. Danach dnsmasq starten mit sudo service dnsmasq start und alles müsste wieder laufen.

Inkompatible Versionen von dnsmasq und Pi-Hole

Bei Debian/Raspbian 8 „Jessy“ ist die enthaltene Version von dnsmasq zu alt und unterstützt eine neue Option nicht, die ab Pi-Hole 3.3 benutzt wird.
Die Lösung, die ich gewählt habe (und die funktioniert), besteht im manuellen Upgrade von dnsmasq. Alternativ kann man auf eine frühere Version von Pi-Hole zurückgehen. Bei einem neuen System sollte man dagegen eh nicht mehr Jessy nehmen, sondern Raspbian 9 „Stretch“, da taucht das Problem nicht auf.[3]

  1. Neue Setups herunterladen:
    wget https://archive.raspberrypi.org/debian/pool/main/d/dnsmasq/dnsmasq-base_2.76-5+rpi1_armhf.deb
    wget https://archive.raspberrypi.org/debian/pool/main/d/dnsmasq/dnsmasq_2.76-5+rpi1_all.deb
  2. Sicherstellen, dass zwei Abhängigkeiten vorhanden sind:
    sudo apt install libnetfilter-conntrack3 libmnl0
  3. Neue Version installieren:
    sudo dpkg -i dnsmasq-base_2.76-5+rpi1_armhf.deb
    sudo dpkg -i dnsmasq_2.76-5+rpi1_all.deb
  4. Prüfen, dass dnsmasq -v als Version Dnsmasq version 2.76 ... ausgibt. ↩︎

Backup der Pi-Hole-Konfiguration machen

Die „Teleporter“ genannte Export- und Importfunktion der Pi-Hole-Weboberfläche (Settings > Teleporter) erleichtert das Wiederherstellen der Konfiguration nach einem Neuaufsetzen oder anderen Problemen sehr. Zum Beispiel muss man nicht die Blockierlisten umständlich einzeln (wieder) eingeben. Per Klick wird dabei eine TAR.GZ-Datei zum Herunterladen exportiert mit dem folgenden Inhalt:
01-pihole.conf, adlists.lists, auditlog.list, blacklist.txt, setupVars.conf, whitellist.txt, wildcardblocking.txt.
Dieselbe Datei lässt sich dann später wieder genauso importieren. ↩︎

Titelfoto: Ben Moore / Unsplash
Pi-hole® is a registered trademark of Pi-hole LLC


  1. Alternativ könnte die HTTPS-Verbindung auch mit einem eigenen Zertifikat „aufgebrochen“ werden. Das ist aber aufwendig und auch sicherheitsmäßig ziemlich zweifelhaft. ↩︎

  2. Zum Beispiel mittels sudo nano /etc/init.d/dnsmasq > STRG+W > DNSMASQ_OPTS > RETURN. ↩︎

  3. Man kann freilich auch einen Upgrade des ganzen Systems machen. Bei einem Raspi, der nur als Pi-Hole dient, scheint mir das aber aufwändiger als einfach die SD-Karte neu zu flashen und noch einmal den Pi-Hole zu installieren. ↩︎