DNS-over-QUIC에서 UDP 프록시 및 클라이언트 구현.
2019—2023 © NS1
이 코드는 Apache License 2.0에 따라 릴리스되었습니다. LICENSE 파일에서 이용 약관을 확인할 수 있습니다.
구현은 RFC 9250: 전용 QUIC 연결을 통한 DNS를 따릅니다.
QUIC 프로토콜 호환성은 quic-go 라이브러리에 따라 다릅니다.
DoQ 프록시 및 테스트 클라이언트를 구축합니다.
go build ./cmd/proxy
go build ./cmd/client
프록시 서버에 대한 테스트 키와 자체 서명된 인증서를 생성합니다.
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
프록시를 시작하십시오. 기본적으로 서버는 위에서 생성된 파일에서 TLS 키와 인증서를 로드하고 8.8.4.4(Google Public DNS)를 백엔드 서버로 사용하며 UDP 포트 853(초안의 실험 포트)에서 수신 대기합니다. 명령줄 옵션을 사용하여 기본 동작을 수정합니다. 기본 포트를 사용하려면 프록시를 수퍼유저로 시작해야 합니다.
sudo ./proxy
테스트 유틸리티를 사용하여 프록시를 쿼리합니다. 클라이언트는 서버에 대한 QUIC 세션을 설정하고 전용 스트림을 통해 각 쿼리를 보냅니다. 업스트림에서 XFR 요청은 TCP를 통해 전송되고 다른 모든 요청은 UDP를 통해 전송됩니다. 응답은 완료 순서대로 인쇄됩니다.
./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
프록시 서버는 클라이언트 인증서 인증을 지원합니다. 이 기능을 활성화하려면 PEM 형식의 CA 인증서 번들을 프록시 매개변수 -mtls_ca_certs
로 제공하세요.
테스트 CA 인증서를 생성합니다.
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
서버 및 클라이언트 인증서를 생성하고 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
CA 인증서를 CA 번들로 제공하여 프록시를 실행하고 mTLS를 활성화합니다.
./proxy -mtls_ca_certs ca.crt
클라이언트 인증서를 제공하여 쿼리를 실행합니다. CA 번들은 서버 인증서 유효성 검사를 활성화합니다.
./client -ca_certs ca.crt -cert client.crt -key client.key ns1.com. AAAA
이는 실험 프로토콜을 기반으로 구축된 실험 코드입니다.
이 저장소의 서버와 클라이언트는 동일한 QUIC 라이브러리를 사용하므로 호환 가능해야 합니다. 그러나 다른 클라이언트를 사용하는 경우 버전 협상 시 핸드셰이크가 실패할 수 있습니다. 클라이언트가 연결할 수 없는 경우 먼저 패킷 캡처를 확인하는 것이 좋습니다.
또한 프록시는 이벤트 순서를 검사하는 데 사용할 수 있는 허용된 연결 및 스트림에 대한 정보를 기록합니다.
$ 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"
이 프로젝트는 유지됩니다.
Pull Request와 이슈를 환영합니다. 자세한 내용은 NS1 기여 지침을 참조하세요.