Implementación de cliente y proxy DNS sobre QUIC a UDP.
2019—2023 © NS1
Este código se publica bajo la licencia Apache 2.0. Puede encontrar los términos y condiciones en el archivo de LICENCIA.
La implementación sigue RFC 9250: DNS sobre conexiones QUIC dedicadas.
La compatibilidad del protocolo QUIC depende de la biblioteca quic-go.
Cree el proxy DoQ y el cliente de prueba.
go build ./cmd/proxy
go build ./cmd/client
Genere una clave de prueba y un certificado autofirmado para el servidor proxy.
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
Inicie el proxy. De forma predeterminada, el servidor carga la clave TLS y el certificado de los archivos generados anteriormente, utilizará 8.8.4.4 (DNS público de Google) como servidor backend y escuchará en el puerto UDP 853 (puerto experimental del borrador). Utilice opciones de línea de comando para modificar el comportamiento predeterminado. Observe que el uso del puerto predeterminado requiere iniciar el proxy como superusuario.
sudo ./proxy
Consulta el proxy usando la utilidad de prueba. El cliente establece una sesión QUIC con el servidor y envía cada consulta a través de una secuencia dedicada. En sentido ascendente, las solicitudes XFR se envían a través de TCP, todas las demás se envían a través de UDP. Las respuestas se imprimen en el orden de finalización:
./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
El servidor proxy admite la autenticación de certificados de cliente. Para habilitar la función, proporcione el paquete de certificados de CA en formato PEM como parámetro de proxy -mtls_ca_certs
.
Genere un certificado de CA de prueba:
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
Genere certificados de servidor y cliente y fírmelos con el certificado CA:
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
Ejecute el proxy y habilite mTLS proporcionando el certificado de CA como un paquete de CA:
./proxy -mtls_ca_certs ca.crt
Ejecute la consulta proporcionando certificados de cliente. El paquete CA permite la validación del certificado del servidor:
./client -ca_certs ca.crt -cert client.crt -key client.key ns1.com. AAAA
Tenga en cuenta que este es un código experimental creado sobre un protocolo experimental.
El servidor y el cliente de este repositorio utilizan la misma biblioteca QUIC y, por lo tanto, deberían ser compatibles. Sin embargo, si se utiliza un cliente diferente, el protocolo de enlace puede fallar en la negociación de la versión. Le sugerimos verificar primero la captura de paquetes cuando el cliente no pueda conectarse.
El proxy también registra información sobre conexiones y transmisiones aceptadas que se pueden utilizar para inspeccionar la secuencia de eventos:
$ 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"
Este proyecto se mantiene.
Las solicitudes de extracción y los problemas son bienvenidos. Consulte las Pautas de contribución de NS1 para obtener más información.