Absicherung des DNS-Verkehrs im Heimnetz mit DNS-Proxy auf einem Raspberry Pi
Autor : Gerd Raudenbusch
Stand : 06.06.2024
Inhalt
Motivation
Das "Internet der Dinge" (IoT, Internet of Things) wird zunehmend Alltag in jedem Haushalt : Saugroboter, Rasenmäher, Fernseher, Glühbirnen, Kameras; alles, was man heute kauft, läßt sich über eine App steuern und braucht einen Zugang zum Internet.
Das Problem : Zunächst befinden sich diese Geräte im Regelfall im gleichen Netz, wie unsere Rechner, welche sensible Daten enthalten. Außerdem sammeln diese Geräte jede Menge Daten über ihre Umwelt und darüber, wie wir sie verwenden. Es wäre eine aufrichtige Welt, wenn sie es nicht täten - die Wahrheit sieht leider ganz anders aus !
Ein neues, handelsübliches Smart TV, beispielsweise, kommuniziert intensivst mit dem Hersteller, den Diensten der TV-Sender, und auch ein paar Werbetrackern, außerdem leuchtet es - oft ungefragt - den Rest des eigenen Heim-Netzes aus. Dabei will man doch eigentlich nur fern sehen und vielleicht ein paar Apps benutzen. Stattdessen hagelt es Cookie-Banner und benötigte Zustimmungen, um dieses erniedrigende Trauerspiel der Hersteller zu legalisieren ! Über die Hälfte des Datenverkehrs ist reiner Müll.
Wer nicht darauf warten möchte, bis wir durch gesetzliche Regulierungen bei Produkten ankommen, welche ein menschenwürdiges Kommunikationsverhalten aufweisen, der kann durch diese Lösung für 30€ mit ziemlicher Sicherheit alle Geräte im Haus sauber halten.
Übersicht
Die vorgestellte Problemlösung ermöglicht die volle Kontrolle des DNS-Verkehrs, indem man :
- Entweder am Router den Upstream-DNS-Server durch den eigenen DNS-Proxy ersetzt, um damit sämtliche DNS-Anfragen des Routers zu verarbeiten
- oder den DHCP-Server des Routers die IP-Adresse des DNS-Proxys als DNS-Serveradresse an alle Geräte im Haus verteilen lässt
- oder auf ausgewählten Geräten im Haushalt manuell den DNS-Proxy als DNS-Server in den Netzwerk-Einstellungen konfiguriert
- oder für alle Geräte im Haus den DHCP-Server des DNS-Proxys verwendet
- Die Hardware der Lösung besteht aus einem Einplatinen-Computer, dem Raspberry Pi :
- Die leistungsstärkere Variante (Raspberry Pi 4B) für unter 150€ kann per Ethernet betrieben werden und potentiell auch andere Heimdienste übernehmen
- Die kleine Variante (Raspberry Pi Zero W) für 30€ wird explizit über WLAN betrieben
-
Die Software besteht aus einem DNS-Proxy und erlaubt das Mitschneiden und Zensieren von ausgehenden URL-Anfragen im Internet, sowie die Verwendung verschlüsselter Verbindungen zu ausgewählten, vertrauenswürdigen DNS-Resolvern.
Dafür eignet sich eine der folgenden kostenlosen Open Source-Programme :
- Pi-Hole zusammen mit dnscrypt-proxy
- oder Adguard home
Raspberry Pi
Den Raspberry Pi kann man im Shop bei rasppishop.de mit Zubehör erwerben. Dies umfasst :
- entweder ein Netzteil, eine Micro-SD-Karte, ein Gehäuse und Anschlußmaterial, z. B. den Raspberry Pi 4B mit 4G RAM und 16-GB Micro-SD-Karte, Gehäuse und Netzteil, sowie einen Micro-HDMI-Adapterkabel für den Monitor für aktuell 132,99€.
- oder ein Raspberry Pi Zero Bundle für aktuell 29,90€
Inbetriebnahme des Raspi 4B
Man braucht :
- den Raspberry mit Gehäuse
- die Micro-SD-Karte mit min. 4 GB Speicher-Kapazität
- das Netzteil für den Raspberry Pi
- ein Netzwerk-Kabel zum Anschließen an den Router
- temporär ein HDMI-Kabel zum Anschluss des Pi an den Monitor
- temporär eine USB-Maus
- temporär eine USB-Tastatur
- temporär einen PC mit SD-Kartenleser
Micro-SD-Karte des Raspi 4B bespielen
Oftmals bekommt man beim Erwerb eines Raspberry die Micro-SD-Karte bereits mit dem Betriebssystem darauf befindlich geliefert. Man kann, z. B. im Falle einer defekten oder bereits vorhandenen, eigenen Micro-SD-Karte, das Betriebssystem auch selbst auf die Micro-SD-Karte spielen, indem man mit der dafür vorgesehenen Software, dem Imager, das Betriebssystem-Image (.xz) am PC auf die Micro-SD-Karte spielt.
Peripherie anschließen
- Das Netzwerkkabel muss vorne in die Ethernet-Buchse
- Maus und Tastatur müssen vorne in die USB-Ports
- Der Bildschirm muss seitlich an einen der Micro-HDMI-Ports angeschlossen werden
- Das Netzteil wird seitlich in den USB-C-Slot ganz links gesteckt
- Die Micro-SD-Karte wird auf der Unterseite eingesetzt
Konfiguration des Raspi 4B
Nach dem Einschalten sollte die Power-LED am Raspi leuchten. Nach dem Hochfahren folgt man den Dialogen :
- Sprache und Land festlegen
- Benutzername und Passwort festlegen
- Software aktualisieren (testet damit auch gleich die funktionierende Netzwerk-Verbindung)
- Zum Schluss sollte man unter Einstellungen → Raspberry-Konfiguration → Schnittstellen SSH aktivieren. Dadurch kann man später mit einem beliebigen SSH-Client auch ohne angeschlossene Peripherie (im "headless"-Betrieb) jederzeit ein Kommandozeilen-Terminal zum Raspi öffnen.
Am Ende kann man die Platine ins Gehäuse stecken :
Inbetriebnahme des Raspberry Zero W
Dieser Raspi hat keinen Ethernet-Anschluss. Sein Einsatz setzt eine stabile WLAN-Verbindung voraus. Nachdem man die beiden Plastik-Blenden um die Platine geschraubt hat, kann man sich der SD-Karte widmen.
SD-Karte des Raspi Zero W bespielen
Das Tool zum Bespielen der SD-Karte beinhaltet inzwischen die Auswahl das Herunterladen und die und Konfiguration des Images für die SD-Karte. Das Lite-Image ohne Desktop reicht völlig aus. Bestimmte Dinge muss man nochmals vorher prüfen :
- Die WLAN-Konfiguration muss stimmen. Die existierende Datei
/etc/wpa_supplicant/wpa_supplicant.conf
auf der rootfs-Partition der SD-Karte soll so aussehen :
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
ap_scan=1
network={
scan_ssid=1
ssid="wlanname"
psk="unserpasswort"
key_mgmt=WPA-PSK
}
- Das Passwort des Benutzers
pi
passt man am besten vorab an. Der Befehlopenssl passwd -6
generiert den notwendigen Inhalt für den Eintrag in der Datei/etc/shadow
auf der rootfs-Partition der SD-Karte.
DNS-Proxy
Der Begriff "Proxy" stammt von dem englischen Wort "proxy", was "Stellvertreter" bedeutet. Er wurde von William R. Cheswick geprägt und leitet sich vom lateinischen "Procuratorem" ab, was "für etwas sorgen" bedeutet).
Ein Proxy-Server fungiert als Vermittler zwischen Client, dem anfragenden und Server, dem antwortenden Dienst. Anstatt sich direkt mit einem Server zu verbinden, wird die Anfrage vom Client über den Proxy als Zwischenstation geleitet, der sie filtern und verändern kann, bevor er sie an den tatsächlichen Server weiterleitet.
Zusammenfassend kann man sagen, daß Adguard bedienerfreundlicher erscheint. Adguard bringt bereits einen DoH-Client mit, dafür kann es aktuell die Clients nicht so einfach wie Pi-Hole voneinander unterscheiden, was für den Betrieb im ganzen Haushalt essentiell ist. Und obwohl die Adguard-home-Konfiguration in einer einzigen yaml-Datei steckt, kann diese nicht wie bei Pi-Hole über die GUI migriert werden. Ansonsten leisten beide DNS-Proxies das gleiche.
Vorbereitung
Der Raspi muss nun vorab eine feste IP-Adresse im Heimnetz bekommen. Üblicherweise läßt man dazu die DHCP-Einstellung bestehen, um Konflikte zu vermeiden und konfiguriert die feste IP-Adresse stattdessen auf dem Router. Dort kann man bestimmen, daß bestimmte Geräte immer die gleiche IP-Adresse zugewiesen bekommen sollen. Man kann auf dem Raspi aber auch mit nmtui
die Netzwerk-Parameter ändern.
Verwendung von Pi-Hole
Bei Pi-Hole handelt es sich um eine freie Software, die es auf komfortable Weise ermöglicht, den DNS-Verkehr zu überwachen. Sie stellt dazu eine Weboberfläche bereit, die man im Heimnetz über jeden Browser erreichen kann. Für iOS gibt es auch eine App für Pi-Hole.
Installation von Pi-Hole
Die Installation ist sehr einfach. In der Kommandozeile gibt man folgenden Befehl ein :
git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole && cd "Pi-hole/automated install/" && sudo bash basic-install.sh
Sollte das Initialpasswort am Ende nicht angezeigt werden, kann man es mit dem Befehl sudo pihole -a -p
vergeben. Anschließend sollte die Pi-Hole-Oberfläche im Browser unter http://<raspi-ip-adresse>/admin
erreichbar sein.
Konfiguration von Pi-Hole
Neben dem dedizierten Blocken von eigens bestimmten URLs gibt es auf Github gepflegte Pi-Hole- Blocklisten aller Art. Im Pi-Hole kann man einfach URLs von Blocklisten hinterlegen, welche dieser anwendet und regelmäßig auf Neuheiten überprüft. Durch gemeinsamen, weltweiten Zusammenhalt halten wir uns somit all den Dreck vom Leibe, mit dem aggressive Vermarkter, kontrollsüchtige Hersteller und Krimminelle uns bewerfen.
DNS-Crypt
Obwohl Pi-Hole auch wunderbar ohne DNS-Crypt funktioniert, sollte man diesen Schritt ernst nehmen, der dafür sorgt, daß der gesamte DNS-Verkehr verschlüsselt wird. Ansonsten sind die DNS-Pakete nämlich lesbar und veränderbar, und zwar auf dem gesamten Weg durch das Internet ! Auch dnscrypt-proxy ist eine freie Open Source Software.
Installation von DNS-Crypt
- Um die neuste Version zu installieren (dazu muss man wissen : Alle Raspis haben einen ARM-11 Prozessor, dies entspricht der Plattformbezeichnung
arm
bzw.arm_64
im Archivnamen), benutzt man den Befehl :sudo wget https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/2.1.5/dnscrypt-proxy-linux_arm64-2.1.5.tar.gz && sudo tar xf dnscrypt-proxy-linux_arm64-2.1.5.tar.gz && sudo rm dnscrypt-proxy-linux_arm64-2.1.5.tar.gz && sudo mv linux-arm64 dnscrypt-proxy && cd dnscrypt-proxy && sudo cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
Konfiguration von DNS-Crypt
Im Wesentlichen muss man folgende Einstellungen in der Datei dnscrypt-proxy.toml
machen :
-
Da Pi-Hole den Port 53 verwendet, konfigurieren wir dnscrypt-proxy auf Port 54, durch Anpassung dieser Zeile :
listen_addresses = ['127.0.0.1:54','[::1]:54']
-
Nun muss der Upstream-Resolver konfiguriert werden. Mit dem Befehl
./dnscrypt-proxy --list
im Installationsverzeichnis kann man sich ansehen, welche sicheren externen DNS-Resolver bereits unterstützt werden. Daraus kann man z. B. diese konfigurieren :server_names = ['doh.ffmuc.net', 'doh.ffmuc.net-2', 'quad9-dnscrypt-ip4-nofilter-pri', 'nextdns', 'cloudflare']
-
Nun kann man den Dienst scharf schalten, sodaß er automatisch beim Hochfahren des Raspis startet :
sudo ./dnscrypt-proxy -service install && sudo ./dnscrypt-proxy -service start
-
Zuletzt muss man Pi-Hole so umkonfigurieren, daß er dnscrypt-proxy auch verwendet. In der Admin-Konsole entfernt man unter Settings → DNS sämtliche Häkchen der Upstream-Server und setzt es stattdessen bei 'Custom 1 (IPv4)'. In das Eingabefeld trägt man ein :
127.0.0.1#54
. -
Ein abschließender Test mit
dig @127.0.0.1 -p 54 example.com
sollte erfolgreich verlaufen.
Optional zur Konfiguration mit Pi-Hole und dnscrypt-proxy kann man auch eine Konfiguration mit Pi-Hole, dnscrypt-proxy und OpenVPN-Server verwenden, wenn man erwägt, aus dem öffentlichen Netz zuzugreifen.
Verwendung von Adguard Home
Ebenso wie Pi-Hole handelt es sich bei Adguard home um eine freie Software, die es auf komfortable Weise ermöglicht, den DNS-Verkehr zu überwachen und dazu eine Weboberfläche bereitstellt, die man im Heimnetz über jeden Browser erreichen kann. Für iOS gibt es auch eine App für Adguard home.
Vorbereitung
Der Raspi muss nun vorab eine feste IP-Adresse im Heimnetz bekommen. Üblicherweise läßt man dazu die DHCP-Einstellung bestehen, um Konflikte zu vermeiden und konfiguriert die feste IP-Adresse stattdessen auf dem Router. Dort kann man bestimmen, daß bestimmte Geräte immer die gleiche IP-Adresse zugewiesen bekommen sollen.
Installation von Adguard home
Die Installation ist sehr einfach. In der Kommandozeile gibt man folgenden Befehl ein :
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
Anschließend kann man die Adguard-Oberfläche im Browser über die IP-Adresse erreichen, um die Software einzurichten.
Ausblick
Ein DNS-Filter ist keine Firewall ! Es gibt Geräte (z. B. Smartphones) , aber auch vereinzelt IoT-Geräte, welche beim Ansprechen ihrer Hersteller auf DNS verzichten und direkt deren IP-Adressen verwenden. Zur Kontrolle dieser Kommunikation empfiehlt sich z. B. der Einsatz der Firewall-Software pfsense auf einer Netgate-Hardware für aktuell 189€ oder der Einsatz von OpenWRT auf einer Fritz!Box 4040 für aktuell 87€.