Einen Rasperry Pi mit Pi-hole für DNS-Over-HTTPS konfigurieren

DNS ist einer der wenigen Dienste für die es lange keine verschlüsselte Variante gab. DNS ist jedoch ein zentraler Dienst im Internet und für datensammelnde Firmen von großen Interesse. Google stellt wahrscheinlich mit 88.88.88.88 und 88.88.44.44 nicht umsonst einen öffentlichen DNS-Server zur Verfügung. Aus DNS-Anfrage und IP-Adresse, die immer übertragen werden, lassen sich prima virtuelle Bewegungsprofile erstellen. Das Internet wurde seinerzeit nicht in Hinblick auf Sicherheit entworfen sondern auf Funktionalität. Heute ist das Internet, im Gegensatz zu damals, ein Tummelplatz von Datenkraken, Werbetreibende und anderen geworden die daran interessiert sind möglichst viel über die meist ahnungslosen Benutzer heraus zu bekommen um sie mit mehr oder minder unerwünschter Werbung zu beglücken. Heute sind viele Seiten, z.B. die Seiten für Online-Banking aber auch die meisten anderen – wie diese hier auch – per SSL/TLS verschlüsselt. Das heißt der Inhalt des Abrufes ist nicht mehr so ohne weiteres einsehbar. Der DNS-Aufruf, d.h. wenn man in seinen Browser in der Adresszeile „www.example.com“ eingibt und das dann direkt in eine IP-Adresse aufgelöst wird, ist unverschlüsselt und für den Internetprovider sowohl mitlesbar als auch fälschbar. So liefern manche Internetprovider, die deutsche Telekom zum Beispiel, eine ihrer Seiten aus in der sie ihre Werbung platzieren wenn man einen Tippfehler in der Adresszeile hat und eine Domain nicht aufrufbar ist.

Pi-hole fungiert im lokalen Netz als DNS-Server und daher bietet sich an ab hier zu verschlüsseln wobei die ganze Sache den Pferdefuß hat, dass der Anbieter des DNS-Services immer noch die DNS-Anfrage auslesen könnte. Aber für den Provider ist es nahezu unmöglich diese zu erfassen weil die Anfrage vom lokalen Netz zum DNS-Server verschlüsselt erfolgt.

Die Installation macht man nach meiner Erfahrung besser manuell mit:

wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgz
tar -xzvf cloudflared-stable-linux-arm.tgz
cp ./cloudflared /usr/local/bin
chmod +x /usr/local/bin/cloudflared
cloudflared -v

In die Datei /etc/default/cloudflared wird nun

# Commandline args for cloudflared, using Cloudflare DNS
CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query

eingetragen mit:

useradd -s /usr/sbin/nologin -r -M cloudflared

ein Systembenutzer angelegt und mit:

chown cloudflared:cloudflared /etc/default/cloudflared
chown cloudflared:cloudflared /usr/local/bin/cloudflared

die Rechte gesetzt.

Nun wird die Datei /etc/systemd/system/cloudflared.service mit dem folgenden Inhalt angelegt:

[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target

[Service]
Type=simple
User=cloudflared
EnvironmentFile=/etc/default/cloudflared
ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Zum Schluss wird der Dienst noch aktiviert und gestartet:

sudo systemctl enable cloudflared
systemctl start cloudflared
systemctl status cloudflared

Eine Ausgabe von dig @127.0.0.1 -p 5053 google.de sollte nun auf dem Pi folgendermaßen aussehen:

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Raspbian <<>> @127.0.0.1 -p 5053 google.de
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22983
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.de.                     IN      A

;; ANSWER SECTION:
google.de.              40      IN      A       172.217.16.163

;; Query time: 50 msec
;; SERVER: 127.0.0.1#5053(127.0.0.1)
;; WHEN: Fr Sep 18 13:21:31 CEST 2020
;; MSG SIZE  rcvd: 63

Nun fehlt noch die Konfiguration von Pi-hole selber. Dazu loggt man sich in der Webinterface von Pi-hole ein (normalerweise aus dem lokalen Netzwerk unter dem Namen pi.hole zu erreichen) und ruft den Menüpunkt Settings→DNS auf. Dort wird unter Upstream DNS Servers:

127.0.0.1#5053

eingetragen, aktiviert und abgespeichert.

Da cloudflared nicht über den Paketmanager installiert wurde wird er auch nicht durch diesen aktuell gehalten. Ein Update kann aber durch cloudflared update angestoßen werden. Nach einem Update nicht vergessen den Dienst mit service cloudflared restart neu zu starten.

kais-universum.de