DNS-über-QUIC-zu-UDP-Proxy- und Client-Implementierung.
2019–2023 © NS1
Dieser Code wird unter der Apache-Lizenz 2.0 veröffentlicht. Die Allgemeinen Geschäftsbedingungen finden Sie in der LIZENZ-Datei.
Die Implementierung folgt RFC 9250: DNS über dedizierte QUIC-Verbindungen.
Die QUIC-Protokollkompatibilität hängt von der quic-go-Bibliothek ab.
Erstellen Sie den DoQ-Proxy und den Test-Client.
go build ./cmd/proxy
go build ./cmd/client
Generieren Sie einen Testschlüssel und ein selbstsigniertes Zertifikat für den Proxyserver.
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -out server.key
openssl req -x509 -days 30 -subj "/CN=DNS-over-QUIC Test" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:::1" -key server.key -out server.crt
Starten Sie den Proxy. Standardmäßig lädt der Server den TLS-Schlüssel und das Zertifikat aus den oben generierten Dateien, verwendet 8.8.4.4 (Google Public DNS) als Backend-Server und lauscht am UDP-Port 853 (experimenteller Port aus dem Entwurf). Verwenden Sie Befehlszeilenoptionen, um das Standardverhalten zu ändern. Beachten Sie, dass die Verwendung des Standardports das Starten des Proxys als Superuser erfordert.
sudo ./proxy
Fragen Sie den Proxy mit dem Testdienstprogramm ab. Der Client baut eine QUIC-Sitzung zum Server auf und sendet jede Anfrage über einen dedizierten Stream. Upstream werden die XFR-Anfragen über TCP gesendet, alle anderen über UDP. Die Antworten werden in der Reihenfolge ihrer Vervollständigung gedruckt:
./client ns1.com A ns1.com AAAA
;; opcode: QUERY, status: NOERROR, id: 25849
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;ns1.com. IN AAAA
;; ANSWER SECTION:
ns1.com. 195 IN AAAA 2606:4700:10::6814:31b6
ns1.com. 195 IN AAAA 2606:4700:10::6814:30b6
ns1.com. 195 IN RRSIG AAAA 13 2 200 20190325121641 20190323121641 44688 ns1.com. m17G7sGkXNhBiKINI2LuQLvUL0Qb+l6LMUmKSoVo2TP5sw3Yd27L44QOZhVU1GS//tD1e6YVOVsMrW3arlk/bQ==
;; ADDITIONAL SECTION:
;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 512
;; opcode: QUERY, status: NOERROR, id: 26044
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;ns1.com. IN A
;; ANSWER SECTION:
ns1.com. 25 IN A 104.20.49.182
ns1.com. 25 IN A 104.20.48.182
ns1.com. 25 IN RRSIG A 13 2 26 20190325121645 20190323121645 44688 ns1.com. xJK5DhMiFqxWx/gC7gHQXM8wkVFDyocIF3Zuehqa+S92zAq3yOtZMrqVRXxsKNw2lfCMQXLHr7hVUDm5H4B5eA==
;; ADDITIONAL SECTION:
;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 512
Der Proxyserver unterstützt die Authentifizierung von Client-Zertifikaten. Um die Funktion zu aktivieren, stellen Sie das CA-Zertifikatpaket im PEM-Format als Proxy-Parameter -mtls_ca_certs
bereit.
Generieren Sie ein Test-CA-Zertifikat:
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -out ca.key
openssl req -x509 -days 30 -subj "/CN=DNS-over-QUIC Test CA" -addext "basicConstraints=critical,CA:true,pathlen:0" -key ca.key -out ca.crt
Erzeugen Sie Server- und Client-Zertifikate und signieren Sie diese mit dem CA-Zertifikat:
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -out server.key
openssl req -x509 -CA ca.crt -CAkey ca.key -days 30 -subj "/CN=server" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:::1" -key server.key -out server.crt
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -pkeyopt ec_param_enc:named_curve -out client.key
openssl req -x509 -CA ca.crt -CAkey ca.key -days 30 -subj "/CN=client" -key client.key -out client.crt
Führen Sie den Proxy aus und aktivieren Sie mTLS, indem Sie das CA-Zertifikat als CA-Bundle bereitstellen:
./proxy -mtls_ca_certs ca.crt
Führen Sie die Abfrage unter Bereitstellung von Client-Zertifikaten aus. Das CA-Bundle ermöglicht die Validierung von Serverzertifikaten:
./client -ca_certs ca.crt -cert client.crt -key client.key ns1.com. AAAA
Beachten Sie, dass es sich hierbei um einen experimentellen Code handelt, der auf einem experimentellen Protokoll aufbaut.
Der Server und der Client in diesem Repository verwenden dieselbe QUIC-Bibliothek und sollten daher kompatibel sein. Wenn jedoch ein anderer Client verwendet wird, kann der Handshake bei der Versionsaushandlung fehlschlagen. Wir empfehlen, zuerst die Paketerfassung zu überprüfen, wenn der Client keine Verbindung herstellen kann.
Der Proxy protokolliert außerdem Informationen über akzeptierte Verbindungen und Streams, die zur Überprüfung der Ereignissequenz verwendet werden können:
$ sudo ./proxy -listen 127.0.0.1:853 -cert cert.pem -key key.pem -backend 8.8.4.4:53
ts=2019-03-24T10:31:32.408891Z msg="listening for clients" addr=127.0.0.1:853
ts=2019-03-24T12:16:45.048583Z client=127.0.0.1:52212 msg="session accepted"
ts=2019-03-24T12:16:45.050231Z client=127.0.0.1:52212 stream_id=0 msg="stream accepted"
ts=2019-03-24T12:16:45.050278Z client=127.0.0.1:52212 stream_id=4 msg="stream accepted"
ts=2019-03-24T12:16:45.091568Z client=127.0.0.1:52212 stream_id=4 msg="stream closed"
ts=2019-03-24T12:16:45.104623Z client=127.0.0.1:52212 stream_id=0 msg="stream closed"
ts=2019-03-24T12:16:45.110261Z client=127.0.0.1:52212 msg="session closed"
Dieses Projekt wird beibehalten.
Pull-Requests und Issues sind willkommen. Weitere Informationen finden Sie in den NS1-Beitragsrichtlinien.