Im vorgehenden Blogeintrag [Pi-hole mit DNS-over-TLS] habe ich auf dem Pi-hole Stubby für dns-over-tls eingerichtet. Daselbe möchte ich nun für DNS-over-HTTPS (DoH) realisieren, allerdings unterstützen weder Stubby noch Unbound das noch junge Protokoll bei dem DNS-Anfragen über HTTPS beantwortet werden. Einige Browser haben DoH mittlerweile integriert, aber ich möchte gerne alle DNS-Abfragen aus meinem Heimnetzwerk schützen. Daher nutze ich den in Go geschriebene Client von cloudflare: cloudflared
.
Mehr über das Pi-hole und eine Anleitung zur Installation findest du hier:
- Kuketz Blog | Pi-Hole: schwarzes Loch für Werbung
- https://pi-hole.net
- https://docs.pi-hole.net/guides/dns-over-https/
Installation
Grundsätzlich gibt es eine bestehende Dokumentation bei pi-hole.net wie DNS-over-https mit cloudflared eingerichtet werden kann, mich möchte aber die Installation für mich optimieren, damit ich gleichzeitig mehrere Clients nutzen kann.
cloudflared
kann bei Cloudflare als Binary heruntergeladen werden und ist nach einer kleiner Konfiguration einsatzbereit.
Auf dem Raspberry Pi:
cd
wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-arm.tgz
tar -xvzf cloudflared-stable-linux-arm.tgz
cp ./cloudflared /usr/local/bin
chmod +x /usr/local/bin/cloudflared
Für den Service nutzen wir einen eigenen User:
sudo useradd -s /usr/sbin/nologin -r -M cloudflared
sudo chown cloudflared:cloudflared /usr/local/bin/cloudflared # auto-update des binary
Konfiguration
DNS Server Wahl
Wähle deinen DNS Provider sorgfältig da du diesem deine Daten exponierst. Wem du vertraust ist deine Entscheidung.
Es gibt viele Alternativen und wahrscheinlich bessere Optionen als Quad9.
Cloudflare bietet unter anderem auch DNS-over-HTTPS an, aber ich möchte lieber den Dienst von Quad9 nutzen, daher verwende ich als Upstream die IP 9.9.9.9
.
sudo vi /lib/systemd/system/cloudflared.service
[Unit]
Description=cloudflared DNS over HTTPS proxy
After=syslog.target network-online.target
[Service]
Type=simple
User=cloudflared
ExecStart=/usr/local/bin/cloudflared proxy-dns --address 127.0.3.3 --port 5353 --upstream https://9.9.9.9/dns-query
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target
Und den Service für den Neustart aktivieren und starten:
sudo systemctl daemon-reload
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
Damit in der Pi-hole Statistik besser ersichtlich ist, welche DNS Queries nun über Stubby oder Unbound oder cloudflared beantwortet wird, kann die IP des Services ins /etc/hosts
eingetragen werden. Somit erscheint cloudflared
anstatt 127.0.3.3
. Daselbe kann natürlich für alle/noch weitere Clients gemacht werden.
echo "127.0.3.3 cloudflared" >> /etc/hosts
Der aktive Cloudflared-Dienst können wir nun im Pi-hole als Custom DNS Server konfigurieren. Dazu unter "Settings > DNS" bei Upstream DNS Servers bei "custom" die lokale IP des Services und den Port des Dienstes eintragen: zB. 127.0.3.3#5353
Nach dem speichern sollte nun das Pi-hole DNS-Anfragen, welche nicht gecached oder geblockt werden an cloudflared
weiterleiten:
Test
pi@pi-hole:~ $ dig @127.0.3.3 -p 5353 blog.sandchaschte.ch
; <<>> DiG 9.10.3-P4-Raspbian <<>> @127.0.3.3 -p 5353 blog.sandchaschte.ch
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7383
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;blog.sandchaschte.ch. IN A
;; ANSWER SECTION:
blog.sandchaschte.ch. 900 IN CNAME sandchaschte.ch.
sandchaschte.ch. 900 IN A 159.100.248.212
;; Query time: 245 msec
;; SERVER: 127.0.3.3#5353(127.0.3.3)
;; WHEN: Fri Jan 18 15:54:23 UTC 2019
;; MSG SIZE rcvd: 129
It works. 🎉
Vielleicht mache ich mal noch eine Auswertung welche der Clients (Unbound mit DoT, Stubby mit DoT oder Cloudflared mit DoH) eine bessere Performance hat, damit ich auch weiterhin schnell surfen kann 🙂