DNS-over-QUIC ke proksi UDP dan implementasi klien.
2019—2023 © NS1
Kode ini dirilis di bawah Lisensi Apache 2.0. Anda dapat menemukan syarat dan ketentuan di file LISENSI.
Implementasinya mengikuti RFC 9250: DNS melalui Koneksi QUIC Khusus.
Kompatibilitas protokol QUIC bergantung pada perpustakaan quic-go.
Bangun proksi DoQ dan klien pengujian.
go build ./cmd/proxy
go build ./cmd/client
Hasilkan kunci pengujian dan sertifikat yang ditandatangani sendiri untuk server 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
Mulai proksi. Secara default, server memuat kunci TLS dan sertifikat dari file yang dihasilkan di atas, akan menggunakan 8.8.4.4 (DNS Publik Google) sebagai server backend, dan akan mendengarkan pada port UDP 853 (port eksperimental dari draf). Gunakan opsi baris perintah untuk mengubah perilaku default. Perhatikan penggunaan port default mengharuskan memulai proxy sebagai pengguna super.
sudo ./proxy
Kueri proksi menggunakan utilitas pengujian. Klien membuat sesi QUIC ke server dan mengirimkan setiap kueri melalui aliran khusus. Di hulu, permintaan XFR dikirim melalui TCP, semua permintaan lainnya dikirim melalui UDP. Balasan dicetak sesuai urutan penyelesaian:
./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
Server proksi mendukung autentikasi sertifikat klien. Untuk mengaktifkan fitur ini, berikan bundel sertifikat CA dalam format PEM sebagai parameter proksi -mtls_ca_certs
.
Hasilkan sertifikat CA pengujian:
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
Hasilkan sertifikat server dan klien dan tanda tangani dengan sertifikat 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
Jalankan proksi dan aktifkan mTLS dengan memberikan sertifikat CA sebagai bundel CA:
./proxy -mtls_ca_certs ca.crt
Jalankan kueri dengan memberikan sertifikat klien. Bundel CA memungkinkan validasi sertifikat server:
./client -ca_certs ca.crt -cert client.crt -key client.key ns1.com. AAAA
Perhatikan bahwa ini adalah kode eksperimental yang dibangun di atas protokol eksperimental.
Server dan klien dalam repositori ini menggunakan perpustakaan QUIC yang sama dan oleh karena itu keduanya harus kompatibel. Namun, jika klien berbeda digunakan, jabat tangan mungkin gagal pada negosiasi versi. Kami menyarankan untuk memeriksa pengambilan paket terlebih dahulu ketika klien tidak dapat terhubung.
Proksi juga mencatat informasi tentang koneksi dan aliran yang diterima yang dapat digunakan untuk memeriksa urutan kejadian:
$ 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"
Proyek ini dipertahankan.
Permintaan Tarik dan masalah dipersilakan. Lihat Pedoman Kontribusi NS1 untuk informasi lebih lanjut.