
Bildquelle
DNS (English. Domain Name System) ist ein verteiltes Computersystem zum Abrufen von Informationen zu Domänen.
TLS ( Transport Layer Security Protocol) - bietet eine sichere Datenübertragung zwischen Internetknoten.
Nach den Nachrichten "Google Public DNS hat DNS über TLS-Unterstützung leise aktiviert" habe ich beschlossen, es zu versuchen. Ich habe einen Stunnel , der einen verschlüsselten TCP- Tunnel erstellt. Programme kommunizieren jedoch normalerweise über das UDP- Protokoll mit DNS . Daher benötigen wir einen Proxy, der UDP-Pakete zum und vom TCP-Stream weiterleitet. Wir werden es auf Lua schreiben.
Der ganze Unterschied zwischen TCP- und UDP-DNS-Paketen:
4.2.2. TCP-Nutzung
Über TCP-Verbindungen gesendete Nachrichten verwenden den Server-Port 53 (dezimal). Der Nachricht wird ein Feld mit einer Länge von zwei Bytes vorangestellt, das die Nachrichtenlänge mit Ausnahme des Felds mit einer Länge von zwei Bytes angibt. In diesem Längenfeld kann die Verarbeitung auf niedriger Ebene eine vollständige Nachricht zusammenstellen, bevor mit dem Parsen begonnen wird.
RFC1035: DOMAIN-NAMEN - UMSETZUNG UND SPEZIFIKATION
Das heißt, wir machen es dort:
- Wir nehmen ein Paket von UDP
- Fügen Sie zu Beginn einige Bytes hinzu, in denen die Größe dieses Pakets angegeben ist
- an TCP-Kanal senden
Und in die entgegengesetzte Richtung:
- Wenn wir ein paar Bytes von TCP lesen, erhalten wir die Paketgröße
- Wir lesen ein Paket von TCP
- Senden Sie es per UDP an den Empfänger
Passen Sie Stunnel an
- Laden Sie das Stammzertifikat Root-R2.crt in das Verzeichnis mit der Stunnel-Konfiguration herunter
- Zertifikat in PEM konvertieren
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
Wir schreiben in stunnel.conf:
[dns] client = yes accept = 127.0.0.1:53 connect = 8.8.8.8:853 CAfile = Root-R2.pem verifyChain = yes checkIP = 8.8.8.8
Das heißt, Stunnel:
- akzeptiert unverschlüsseltes TCP um 127.0.0.1:53
- öffnet einen verschlüsselten TLS-Tunnel unter der Adresse 8.8.8.8:853 (Google DNS)
- überträgt Daten hin und her
Stunnel starten
Der Betrieb des Tunnels kann mit dem folgenden Befehl überprüft werden:
nslookup -vc ya.ru 127.0.0.1
Die Option -vc zwingt nslookup, anstelle von UDP eine TCP-Verbindung zu einem DNS-Server zu verwenden.
Ergebnis:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Ein Skript schreiben
Ich schreibe in Lua 5.3 . Binäre Operationen mit Nummern sind bereits verfügbar. Nun, wir brauchen das Lua Socket Modul.
Dateiname: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
Schreiben wir eine einfache Funktion, mit der Sie ein Dump-Paket an die Konsole senden können. Ich möchte sehen, was der Proxy macht.
--]]--
function serialize(data)
--[[--
UDP zu TCP und zurück
Wir schreiben zwei Funktionen, die mit zwei Datenübertragungskanälen arbeiten.
--]]--
--[[--
Beide Funktionen führen coroutine.yield () unmittelbar nach dem Start aus. Auf diese Weise können Sie die Parameter der Funktion an den ersten Aufruf übergeben und dann coroutine.resume (co) ohne zusätzliche Parameter ausführen.
Haupt
Und jetzt die Hauptfunktion, die die Hauptschleife vorbereitet und startet.
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
Wir starten die Hauptfunktion. Wenn die Verbindung plötzlich geschlossen wird, stellen wir sie nach einer Sekunde wieder her, indem wir main aufrufen.
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
überprüfen
Stunnel laufen lassen
Führen Sie unser Skript aus
lua5.3 simple-udp-to-tcp-dns-proxy.lua
Überprüfen Sie die Skriptoperation mit dem Befehl
nslookup ya.ru 127.0.0.1
Dieses Mal haben wir ohne das '-vc' den Proxy geschrieben und gestartet, der UDP-DNS-Anforderungen in den TCP-Tunnel packt.
Ergebnis:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
Wenn alles in Ordnung ist, können Sie in den Verbindungseinstellungen als DNS-Server "127.0.0.1" angeben.
Schlussfolgerung
Jetzt sind unsere DNS-Abfragen durch TLS geschützt.
Unmittelbar nach der Verbindung versucht Windows, uns über unseren Tunnel auf den DNS-Servern von Google zu registrieren. Dies wird in den erweiterten DNS-Einstellungen durch Deaktivieren deaktiviert.

Es gibt noch eine Anfrage für time.windows.com. Er ist nicht mehr so persönlich, aber ich habe nie herausgefunden, wie ich es ausschalten kann. Die automatische Zeitsynchronisation ist deaktiviert.
Links
- RFC1035: DOMAIN-NAMEN - UMSETZUNG UND SPEZIFIKATION
- DNS über TLS
- simple-udp-to-tcp-dns-proxy.lua
- Erstellen Sie manuell eine DNS-Abfrage