OpenWrt: DNS-Abfragen mit Stubby verschlüsseln
Im Allgemeinen erfolgen DNS-Abfragen standardmäßig unverschlüsselt über Port 53 (UDP/TCP). Wenn im Router (oder im verwendeten Endgerät) nicht anders eingestellt, werden dabei zumeist die DNS-Server des eigenen Internet-Service-Provider (ISP) kontaktiert. Um bei Bedarf die eigene Privatssphäre und Sicherheit zu erhöhen, kann es sich anbieten, den DNS-Datenverkehr zu verschlüsseln und hierzu öffentliche DNS-Server, die DNS-over-TLS (DoT) als auch DNSSEC unterstützen, zu verwenden. Wie sich das mit dem eigenen OpenWrt-Router in Verbindung mit Dnsmasq und Stubby umsetzen lässt, erfahrt ihr in diesem Beitrag.
Ausgangslage & Zielstellung
OpenWrt verwendet standardmäßig Dnsmasq als lokalen DNS-Forwarder, welcher lokal auf Port 53 lauscht und alle eingehenden DNS-Anfragen an einen der im System hinterlegten externen DNS-Server weiterleitet. Die ausgehende Weiterleitung an den externen DNS-Server erfolgt dabei unverschlüsselt über Port 53 (UDP/TCP).
Bei Stubby handelt es sich um einen DNS-Resolver, der DNS-Anfragen verschlüsselt per TLS an (externe) DNS-Server senden kann. Die Technik wird auch als DNS-over-TLS (DoT) bezeichnet. Als Standardport für DoT kommt der Port 853 (TCP) zum Einsatz. Prinzipiell gibt es bspw. mit DNS-over-HTTPS (DoH) aber auch noch andere Möglichkeiten zur DNS-Verschlüsselung.
Ginge es nur um die Funktionalität der DNS-Auflösung, dann könnte man Dnsmasq 1:1 durch Stubby ersetzen. Dnsmasq ist unter OpenWrt aber auch für DHCP zuständig. Aus diesem Grund bietet es sich an, Stubby zwischen Dnsmasq und externe DNS-Server zwischenzuschalten. In diesem Fall wird Dnsmasq so konfiguriert, dass alle DNS-Anfragen an Stubby durchgereicht werden. Stubby sendet die DNS-Anfragen dann verschlüsselt an einen der konfigurierten externen DNS-Server und gibt die Antwort an Dnsmasq zurück.
Mithilfe der Verschlüsselung der DNS-Abfragen kann sichergestellt werden, dass diese kein Dritter im Klartext mitlesen kann. Um aber auch die Integrität sowie Authentizität der DNS-Antworten sicherzustellen, sollte zusätzlich DNSSEC Verwendung finden. So kann sichergestellt werden, dass die DNS-Anfragen nicht manipuliert wurden.
Die Validierung der DNS-Antworten per DNSSEC kann sowohl durch Dnsmasq als auch durch Stubby erfolgen. "Out of the box" setzt OpenWrt ein abgespecktes Dnsmasq ohne vollständige DNSSEC-Unterstützung ein. Wenn man also Dnsmasq zur DNSSEC-Validierung verwenden möchte, muss man das Standard-Paket dnsmasq durch dnsmasq-full ersetzen. Um diesem Aufwand zu umgehen, verwende ich Stubby für die DNSSEC-Validierung, wobei Dnsmasq dann nur die DNSSEC-Informationen von Stubby zu den Clients durchreicht.
Für verschlüsselte und mit DNSSEC abgesichterte DNS-Abfragen muss der verwendete externe DNS-Server DoT und DNSSEC unterstützen. Eine Liste empfehlenswerter öffentlicher DNS-Server, die diese Bedingungen erfüllen, finden sich hier:
- Kuketz-Blog: Empfehlungsecke - DNS-Server
- Privacy Handbuch - DNS-Server
- DNS Privacy Project - DNS-Server
Stubby installieren & einrichten
Als erstes installieren wir Stubby auf unserem OpenWrt-Router:
Anschließend öffnet die Konfigurationsdatei von Stubby /etc/config/stubby
. Als erstes aktiviert nun DNSSEC:
Danach könnt ihr die externen DNS-Server eintragen, die ihr verwenden möchtet:
Um die Konfiguration von Stubby abzuschließen, startet Stubby neu:
Dnsmasq einrichten
Im nächsten Schritt konfigurieren Dnsmasq nun so, dass alle DNS-Anfragen an Stubby weitergeleitet und die DNSSEC-Daten an die Clients durchreicht werden. Stubby lauscht dabei standardmäßig auf Port 5453. Öffnet die Konfigurationsdatei von Dnsmasq /etc/config/dhcp
und fügt folgende Zeilen hinzu:
Wie bei Stubby starten wir nun auch Dnsmasq neu, damit die angepasste Konfiguration angewendet wird:
Konfiguration überprüfen und DNS-Auflösung testen
Als erstes stellen wir sicher, dass sowohl Dnsmasq und Stubby auf den entsprechenden Ports lauschen:
Zusätzlich könnten wir auch noch mal kurz das OpenWrt-Logging starten, Dnsmasq und Stubby neu starten und das Log überprüfen:
Dnsmasq-Log auslesen:
Stubby-Log auslesen:
Wenn das dann alles gut aussieht, können wir die eigentliche DNS-Auflösung testen:
Wichtig ist auch, dass in der Zeile mit flags
das Flag ad
gesetzt ist. Das bedeutet, dass die DNSSEC-Validierung funktioniert.
Den gleichen Befehl ausgeführt auf einem eurer Clients bzw. Endgeräte, die mit eurem OpenWrt-Router verbunden sind, sollten zum gleichen Ergebnis führen (Ausnahme: explizit anderer DNS-Server im Client konfiguriert).
Abschließend kann noch z.B. mittels https://dnsleaktest.com getestet werden, dass die von euch hinterlegten DNS-Server angefragt werden:
Optional: DNS-Hijacking
Die aktuelle Umsetzung hat einen Nachteil: Clients können die sichere und verschlüsselte DNS-Auflösung des Routers umgehen. Wenn auf Clientseite alternative DNS-Server explizit hinterlegt sind, kann es je nach verwendeter Software passieren, das der Client DNS-Anfragen nicht an den lokalen DNS-Server des Routers, sondern direkt an die auf Clientseite konfigurierten DNS-Server sendet. Um diesem Problem zu begegnen, kann man auf Routerseite sogenanntes DNS-Hijacking betreiben. Dazu werden alle DNS-Abfragen abgefangen und an den eigenen lokalen DNS-Forwarder/Resolver weitergereicht. Details hierzu siehe: OpenWrt-Doku: DNS-Hijacking
Optional: DNS-Leak beim Start verhindern
Es kann passieren, dass beim Start von OpenWrt bereits DNS-Abfragen nötig sind, noch bevor Dnsmasq und Stubby gestartet sind. In diesem Fall würden die DNS-Anfragen weiterhin an den DNS-Server des ISPs gesendet werden. Wenn man auch das verhindern möchte, muss man die DNS-Option für das WAN-Interface deaktivieren. Hierzu siehe z.B. Kuketz-Blog - Abschnitt: 4.2 DNS-Anfragen nicht an ISP-DNS übermitteln, wobei Folgendes beachtet werden sollte: https://github.com/openwrt/packages/issues/15765.
Fazit
Ohne großen Aufwand könnt ihr euren OpenWrt-Router mithilfe von Stubby so einrichten, dass DNS-Abfragen verschlüsselt und mit DNSSEC abgesichert durchgeführt werden.