DNS-over-QUIC ถึง UDP พร็อกซีและการใช้งานไคลเอ็นต์
2019—2023 © NS1
รหัสนี้เผยแพร่ภายใต้ Apache License 2.0 คุณสามารถดูข้อกำหนดและเงื่อนไขได้ในไฟล์ LICENSE
การใช้งานเป็นไปตาม RFC 9250: DNS ผ่านการเชื่อมต่อ QUIC เฉพาะ
ความเข้ากันได้ของโปรโตคอล 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
พร็อกซีเซิร์ฟเวอร์รองรับการตรวจสอบสิทธิ์ใบรับรองไคลเอ็นต์ เพื่อเปิดใช้งานคุณลักษณะนี้ ให้จัดเตรียมชุดใบรับรอง CA ในรูปแบบ PEM เป็นพารามิเตอร์พร็อกซี -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
เรียกใช้พร็อกซีและเปิดใช้งาน mTLS โดยระบุใบรับรอง CA เป็นกลุ่ม CA:
./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"
โครงการนี้ได้รับการดูแล
ยินดีต้อนรับการดึงคำขอและปัญหาต่างๆ ดูแนวทางการบริจาค NS1 สำหรับข้อมูลเพิ่มเติม