Dieses Tutorial zeigt Ihnen, wie Sie Ihr eigenes DNS über TLS einrichten (DoT)-Resolver auf Ubuntu mit Nginx, sodass Ihre DNS-Abfragen verschlüsselt und vor neugierigen Blicken geschützt werden können.
Was ist DNS über TLS und warum ist es wichtig
DNS (Domain Name System) ist für die Übersetzung von Domainnamen in IP-Adressen zuständig. Es wurde 1987 ohne Rücksicht auf Sicherheit oder Privatsphäre entwickelt. Standardmäßig werden DNS-Abfragen nicht verschlüsselt. Sie werden im Klartext über die Leitung gesendet und können von Mittelinstanzen ausgenutzt werden. Zum Beispiel die Great Firewall of China (GFW ) verwendet eine Technik namens DNS-Cache-Poison das chinesische Internet zu zensieren. (Sie verwenden auch andere Methoden, die den Rahmen dieses Artikels sprengen würden.)
GFW prüft jede DNS-Anfrage, die an einen DNS-Server außerhalb Chinas gesendet wird. Da das Klartext-DNS-Protokoll auf UDP basiert, einem verbindungslosen Protokoll, kann GFW sowohl die Client-IP als auch die Server-IP fälschen. Wenn GFW einen Domainnamen auf seiner Sperrliste findet, ändert es die DNS-Antwort. Wenn beispielsweise ein chinesischer Internetnutzer google.com besuchen möchte, gibt GFW anstelle der echten IP-Adresse von Google eine in China befindliche IP-Adresse an den DNS-Resolver des Nutzers zurück. Dann gibt der DNS-Resolver die gefälschte IP-Adresse an den Computer des Benutzers zurück, sodass der Benutzer google.com nicht besuchen kann.
DNS über TLS bedeutet, dass DNS-Abfragen über eine sichere Verbindung gesendet werden, die mit TLS verschlüsselt ist, der gleichen Technologie, die HTTP-Datenverkehr verschlüsselt.
Warum einen eigenen DoT-Resolver ausführen?
Es gibt bereits einige öffentliche DNS-Resolver wie 1.1.1.1 und 9.9.9.9, die DNS über TLS unterstützen, sodass Sie sie verwenden können, wenn Sie nicht über die Fähigkeiten oder die Zeit verfügen, einen eigenen auszuführen. Einige Leute argumentieren jedoch, dass dies großen DNS-Dienstanbietern immer noch erlaubt, Informationen über Benutzer zu sammeln. Sie scheinen mehr Vertrauen in ihren ISP zu haben. Aber ich denke, wenn Sie in Bezug auf den Datenschutz paranoid sind, sollten Sie Ihren eigenen DoT-Resolver betreiben, damit weder große DNS-Dienstanbieter noch Ihr ISP Sie ausspionieren können.
Derzeit unterstützen nicht alle DNS-Resolver (BIND, Unbound, Knot-Resolver, PowerDNS-Recursor usw.) DNS über TLS. Anstatt eine Anleitung für einen bestimmten Resolver zu erstellen, werde ich Ihnen zeigen, wie Sie den Nginx TLS-Proxy für Ihren vorhandenen DNS-Resolver einrichten, um den DoT-Dienst bereitzustellen. Unabhängig davon, welchen DNS-Resolver Sie verwenden, können Sie diesem Tutorial folgen.
Voraussetzungen
Es wird davon ausgegangen, dass auf Ihrem Ubuntu-Server ein DNS-Resolver ausgeführt wird. Sie können jeden DNS-Resolver verwenden (BIND, Unbound, Knot-Resolver …) Ich persönlich verwende BIND.
- Richten Sie Ihren eigenen BIND9-DNS-Resolver auf Ubuntu 16.04/18.04 ein
- Richten Sie Ihren eigenen BIND9-DNS-Resolver unter Ubuntu 20.04 ein
Sie benötigen auch einen Domänennamen, da DNS-Clients eine sichere TLS-Verbindung mit unserem DNS-Resolver herstellen müssen. Ich habe meinen Domainnamen bei NameCheap registriert, weil der Preis niedrig ist und sie lebenslangen Whois-Datenschutz bieten.
Wenn Sie die oben genannten Anforderungen erfüllen, befolgen Sie die nachstehenden Anweisungen.
Schritt 1:Nginx auf Ubuntu-Server installieren
Es ist sehr einfach zu tun. Führen Sie einfach den folgenden Befehl aus.
sudo apt install nginx
Schritt 2:Erhalten Sie ein vertrauenswürdiges TLS-Zertifikat von Let’s Encrypt
DNS über TLS erfordert die Installation eines TLS-Zertifikats auf der Serverseite. Wir werden das Let’s Encrypt-Zertifikat erhalten und installieren. Der Vorteil der Verwendung des Let’s Encrypt-Zertifikats besteht darin, dass es kostenlos ist, einfacher einzurichten ist und von der Client-Software als vertrauenswürdig eingestuft wird.
Führen Sie die folgenden Befehle aus, um den Let’s Encrypt-Client (certbot) aus dem standardmäßigen Ubuntu-Repository zu installieren.
sudo apt install certbot
Um ein Let’s Encrypt TLS-Zertifikat zu erhalten, können wir mit dem folgenden Befehl einen virtuellen Nginx-Host erstellen. Ersetzen Sie dot.example.com
mit eigenem Domainnamen. Vergessen Sie nicht, einen DNS-A-Eintrag für diese Subdomain zu erstellen.
sudo nano /etc/nginx/conf.d/dot.example.com.conf
Kopieren Sie den folgenden Text und fügen Sie ihn in die virtuelle Hostdatei ein.
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
Speichern und schließen Sie die Datei. Laden Sie Nginx neu, damit die Änderungen wirksam werden.
sudo systemctl reload nginx
Sobald der virtuelle Host erstellt und aktiviert ist, führen Sie den folgenden Befehl aus, um das Let’s Encrypt-Zertifikat mit dem Webroot-Plugin zu erhalten.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
Schritt 3:DNS über TLS-Proxy in Nginx erstellen
Bearbeiten Sie die Hauptkonfigurationsdatei von Nginx.
sudo nano /etc/nginx/nginx.conf
Fügen Sie am Ende dieser Datei die folgenden Zeilen hinzu. Beachten Sie, dass sie außerhalb von http
platziert werden müssen Kontext.
stream { # DNS upstream pool upstream dns { zone dns 64k; server 127.0.0.1:53; } # DoT server for decryption server { listen 853 ssl; ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem; proxy_pass dns; } }
In der obigen Konfiguration lassen wir Nginx die TLS-Verbindung auf Port 853 beenden, dann leitet es DNS-Anfragen an den lokalen DNS-Resolver um, der 127.0.0.1:53
überwacht .
Speichern und schließen Sie die Datei. Testen Sie dann die Nginx-Konfiguration und starten Sie neu.
sudo nginx -t sudo systemctl restart nginx
Wenn auf dem Ubuntu-Server eine Firewall läuft, müssen Sie den TCP-Port 853 öffnen. Wenn Sie beispielsweise die UFW-Firewall verwenden, führen Sie den folgenden Befehl aus.
sudo ufw allow 853/tcp
Da wir DNS über TLS verwenden, müssen Sie sich keine Gedanken über DNS-Amplification-Angriffe machen.
Schritt 5:Stubby DoT Client auf Ubuntu Desktop konfigurieren
Stubby ist ein vom getdns-Team entwickelter Open-Source-DNS-Stub-Resolver. Ein Stub-Resolver ist ein kleiner DNS-Client auf dem Computer des Endbenutzers, der DNS-Anfragen von Anwendungen wie Firefox empfängt und Anfragen an einen rekursiven Resolver wie 1.1.1.1 oder 8.8.8.8 weiterleitet. Stubby ist insofern besonders, als es DNS über TLS unterstützt. Standardmäßig werden DNS-Anfragen nur verschlüsselt gesendet.
Installieren Sie Stubby auf dem Ubuntu-Desktop aus dem Standard-Repository.
sudo apt install stubby
Einmal installiert, läuft Stubby im Hintergrund. Überprüfen Sie den Status mit:
systemctl status stubby
Stubby lauscht auf TCP- und UDP-Port 53 von localhost (127.0.0.1). Standardmäßig verwendet Stubby Drittanbieter-DNS über TLS-Resolver. Wir müssen es konfigurieren, um unser eigenes zu verwenden.
sudo nano /etc/stubby/stubby.yml
Scrollen Sie nach unten zu upstream_recursive_servers:
Abschnitt und fügen Sie den folgenden Text über anderen DNS-Servern hinzu. Ersetzen Sie 12.34.56.78 durch die IP-Adresse Ihres DoT-Resolvers.
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
Suchen Sie dann die folgende Zeile:
round_robin_upstreams: 1
Ändern Sie 1
auf 0
. Dadurch verwendet Stubby immer Ihren eigenen DNS-over-TLS-Resolver. Wenn es nicht verfügbar ist, verwendet Stubby andere DNS-Server. Speichern Sie die Datei und starten Sie Stubby neu, damit die Änderungen wirksam werden.
sudo systemctl restart stubby
Schritt 6:Konfigurieren Sie Ubuntu Desktop für die Verwendung von Stubby
Obwohl Stubby ausgeführt wird, wird es nicht vom Betriebssystem verwendet. Klicken Sie auf das Network Manager-Symbol in der oberen rechten Ecke Ihres Desktops. Wählen Sie dann kabelgebundene Einstellungen. (Wenn Sie Wi-Fi verwenden, wählen Sie Wi-Fi-Einstellungen.)
Klicken Sie auf das Zahnradsymbol.
Wählen Sie IPv4
und wechseln Sie dann in den DNS-Einstellungen zu Automatic
auf OFF, wodurch verhindert wird, dass Ihr Ubuntu-System die DNS-Serveradresse von Ihrem Router erhält. Geben Sie 127.0.0.1
ein im DNS-Feld. Klicken Sie auf Apply
Schaltfläche, um Ihre Änderungen zu speichern.
Starten Sie anschließend NetworkManager neu, damit die Änderungen wirksam werden.
sudo systemctl restart NetworkManager
Sobald Sie wieder verbunden sind, können Sie in den Details
sehen, dass Ihr Ubuntu-System jetzt 127.0.0.1 als DNS-Server verwendet Registerkarte.
So überprüfen Sie, ob Ihr DNS-Verkehr verschlüsselt ist
Wir können WireShark verwenden, um den DNS-Verkehr zu überwachen. Installieren Sie WireShark auf dem Ubuntu-Desktop.
sudo apt install wireshark
Wenn Sie gefragt werden „Sollten Nicht-Superuser in der Lage sein, Pakete zu erfassen?“, antworten Sie mit Ja. Führen Sie nach der Installation den folgenden Befehl aus, um Ihr Benutzerkonto zur Wireshark-Gruppe hinzuzufügen, damit Sie Pakete erfassen können.
sudo adduser your-username wireshark
Melden Sie sich ab und wieder an, damit die Änderungen wirksam werden. Öffnen Sie dann WireShark über Ihr Anwendungsmenü und wählen Sie Ihre Netzwerkschnittstelle in WireShark aus. Beispielsweise lautet der Name meiner Ethernet-Schnittstelle enp5s0. Geben Sie dann port 853
ein als Fangfilter. Dadurch erfasst WireShark nur Datenverkehr auf Port 853, dem Port, der von DNS über TLS verwendet wird.
Klicken Sie auf die Schaltfläche in der oberen linken Ecke, um mit der Aufnahme zu beginnen. Führen Sie danach im Terminalfenster den folgenden Befehl aus, um den Domänennamen mit dig
abzufragen Nützlichkeit. Beispielsweise kann ich den A-Eintrag meines Domainnamens abfragen.
dig A linuxbabe.com
Jetzt können Sie den erfassten DNS-Verkehr in WireShark sehen. Verbindungen wurden über TCP hergestellt und mit TLS verschlüsselt, was wir wollen. Sie sollten überprüfen, ob die Spalte Ziel die IP-Adresse Ihres DoT-Resolvers enthält.
Wenn DNS-Anfragen unverschlüsselt gesendet werden, würde der Computer den DNS-Server auf Port 53 kontaktieren. Sie können Pakete erneut mit port 53
erfassen als Erfassungsfilter, aber Sie sehen keine Pakete in WireShark, was bedeutet, dass Stubby Ihre DNS-Abfragen verschlüsselt.