Kueri dan balasan DNS tradisional dikirim melalui UDP atau TCP tanpa enkripsi, membuat mereka tunduk pada pengawasan, pemalsuan, dan penyaringan internet berbasis DNS. Respons terhadap klien dari resolver publik, seperti Google Public DNS, terutama rentan terhadap hal ini, karena pesan dapat melewati banyak jaringan, sementara pesan antara {i>recursive resolver<i} dan server nama otoritatif, sering menggabungkan perlindungan tambahan.
Untuk mengatasi masalah ini, pada tahun 2016 kami meluncurkan DNS-over-HTTPS (sekarang disebut DoH) menawarkan resolusi DNS yang memvalidasi DNSSEC terenkripsi melalui HTTPS dan QUIC. Dan pada tahun 2019, kami menambahkan dukungan untuk standar DNS over TLS (DoT) yang digunakan oleh fitur DNS Pribadi Android.
DoH dan DoT meningkatkan privasi dan keamanan antara klien dan resolver, melengkapi validasi Google Public DNS terhadap DNSSEC untuk memberikan end-to-end DNS terautentikasi untuk domain bertanda tangan DNSSEC. Dengan Google Public DNS, kami berkomitmen untuk menyediakan resolusi DNS yang cepat, pribadi, dan aman untuk DoH dan klien DoT.
Versi TLS dan suite kripto yang didukung
Google Public DNS mendukung TLS 1.2 dan TLS 1.3 untuk DoH dan DoT; tidak sebelumnya yang didukung, bukan versi TLS atau SSL. Hanya paket penyandian dengan keamanan maju dan Enkripsi yang Diautentikasi dengan Data Tambahan (AEAD) didukung. Qualys SSL Labs menunjukkan kumpulan cipher suite yang didukung saat ini.
Endpoint
Google Public DNS menggunakan endpoint berikut untuk DoH dan DoT:
DoT (port 853) dns.google
DoH (port 443) Template URI
RFC 8484 –
https://dns.google/dns-query{?dns}
- Untuk POST, URL hanya
https://dns.google/dns-query
dan isi dari permintaan HTTP adalah {i>payload<i} DNS UDP biner dengan tipe konten application/dns-message. - Untuk GET, alamat ini adalah
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Untuk POST, URL hanya
JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Parameter GET lebih lanjut dijelaskan di
JSON API.
Hanya parameter
name
yang diperlukan.
- Parameter GET lebih lanjut dijelaskan di
JSON API.
Hanya parameter
Klien
Ada sejumlah aplikasi klien yang menggunakan DoT atau DoH
- Fitur “Private Browsing” Android 9 (Pie) – DoT
- Intra (aplikasi Android) – DoH
Situs dnsprivacy.org mencantumkan beberapa klien lain untuk DoT dan DoH, tetapi proses ini biasanya memerlukan konfigurasi yang cukup teknis.
Contoh command line
Contoh command line berikut tidak dimaksudkan untuk digunakan di klien sebenarnya dan hanya ilustrasi menggunakan alat diagnostik yang umum tersedia.
DoT
Perintah berikut memerlukan Knot DNS kdig
2.3.0 atau yang lebih baru; dengan 2.7.4 atau
nanti, hapus tanda komentar di +tls‑sni
untuk mengirim SNI sesuai yang diwajibkan oleh TLS 1.3.
kdig -d +noall +answer @dns.google example.com \
+tls-ca +tls-hostname=dns.google # +tls-sni=dns.google
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(dns.google), port(853), protocol(TCP) ;; DEBUG: TLS, imported 312 system certificates ;; DEBUG: TLS, received certificate hierarchy: ;; DEBUG: #1, C=US,ST=California,L=Mountain View,O=Google LLC,CN=dns.google ;; DEBUG: SHA-256 PIN: lQXSLnWzUdueQ4+YCezIcLa8L6RPr8Wgeqtxmw1ti+M= ;; DEBUG: #2, C=US,O=Google Trust Services,CN=Google Internet Authority G3 ;; DEBUG: SHA-256 PIN: f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78= ;; DEBUG: TLS, skipping certificate PIN check ;; DEBUG: TLS, The certificate is trusted. ;; ANSWER SECTION: example.com. 2046 IN A 93.184.216.34
kdig -d +noall +answer @dns.google example.com \
+tls-pin=f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78= \
# +tls-sni=dns.google
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(dns.google), port(853), protocol(TCP) ;; DEBUG: TLS, received certificate hierarchy: ;; DEBUG: #1, C=US,ST=California,L=Mountain View,O=Google LLC,CN=dns.google ;; DEBUG: SHA-256 PIN: lQXSLnWzUdueQ4+YCezIcLa8L6RPr8Wgeqtxmw1ti+M= ;; DEBUG: #2, C=US,O=Google Trust Services,CN=Google Internet Authority G3 ;; DEBUG: SHA-256 PIN: f8NnEFZxQ4ExFOhSN7EiFWtiudZQVD2oY60uauV/n78=, MATCH ;; DEBUG: TLS, skipping certificate verification ;; ANSWER SECTION: example.com. 5494 IN A 93.184.216.34
DoH
POSTINGAN RFC 8484
String yang dienkode Base64Url dalam perintah ini adalah pesan DNS yang dikirim oleh
dig +noedns example.test A
dengan kolom ID DNS disetel ke nol, seperti yang direkomendasikan
oleh RFC 8484 bagian 4.1. Perintah {i>shell<i} mengirimkan kueri DNS itu sebagai
konten isi data biner, menggunakan Content-Type application/dns-message
.
echo AAABAAABAAAAAAAAB2V4YW1wbGUEdGVzdAAAAQAB | base64 --decode |
curl -is --data-binary @- -H 'content-type: application/dns-message' \
https://dns.google/dns-query
HTTP/2 200 strict-transport-security: max-age=31536000; includeSubDomains; preload access-control-allow-origin: * date: Wed, 29 May 2019 19:37:16 GMT expires: Wed, 29 May 2019 19:37:16 GMT cache-control: private, max-age=19174 content-type: application/dns-message server: HTTP server (unknown) content-length: 45 x-xss-protection: 0 x-frame-options: SAMEORIGIN alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"
GET RFC 8484
String yang dienkode Base64Url dalam perintah ini adalah pesan DNS yang dikirim oleh
dig +noedns example.com A
dengan kolom ID DNS disetel ke nol. Dalam hal ini,
secara eksplisit diteruskan di URL.
curl -i https://dns.google/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE
HTTP/2 200 strict-transport-security: max-age=31536000; includeSubDomains; preload access-control-allow-origin: * date: Wed, 29 May 2019 19:37:16 GMT expires: Wed, 29 May 2019 19:37:16 GMT cache-control: private, max-age=19174 content-type: application/dns-message server: HTTP server (unknown) content-length: 45 x-xss-protection: 0 x-frame-options: SAMEORIGIN alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"
GET JSON
Ini menggunakan JSON API untuk DoH.
curl -i 'https://dns.google/resolve?name=example.com&type=a&do=1'
HTTP/2 200 strict-transport-security: max-age=31536000; includeSubDomains; preload access-control-allow-origin: * date: Thu, 30 May 2019 02:46:46 GMT expires: Thu, 30 May 2019 02:46:46 GMT cache-control: private, max-age=10443 content-type: application/x-javascript; charset=UTF-8 server: HTTP server (unknown) x-xss-protection: 0 x-frame-options: SAMEORIGIN alt-svc: quic=":443"; ma=2592000; v="46,44,43,39" accept-ranges: none vary: Accept-Encoding {"Status": 0,"TC": false,"RD": true,"RA": true,"AD": true,"CD": false,"Question":[ {"name": "example.com.","type": 1}],"Answer":[ {"name": "example.com.","type": 1,"TTL": 10443,"data": "93.184.216.34"},{"name": "example.com.","type": 46,"TTL": 10443,"data": "a 8 2 86400 1559899303 1558087103 23689 example.com. IfelQcO5NqQIX7ZNKI245KLfdRCKBaj2gKhZkJawtJbo/do+A0aUvoDM5A7EZKcF/j8SdtyfYWj/8g91B2/m/WOo7KyZxIC918R1/jvBRYQGreDL+yutb1ReGc6eUHX+NKJIYqzfal+PY7tGotS1Srn9WhBspXq8/0rNsEnsSoA="}],"Additional":[]}
TLS 1.3 dan SNI untuk URL alamat IP
TLS 1.3 mengharuskan klien memberikan Identifikasi Nama Server (SNI).
Ekstensi SNI menentukan bahwa informasi SNI adalah domain DNS (dan bukan alamat IP):
"NamaHost" berisi nama {i>host<i} DNS server yang sepenuhnya memenuhi syarat, seperti yang dipahami oleh klien. Nama host direpresentasikan sebagai string byte menggunakan pengkodean ASCII tanpa tanda titik. Hal ini memungkinkan dukungan dari nama domain internasional melalui penggunaan label A yang ditentukan dalam RFC5890. Nama host DNS tidak peka huruf besar/kecil. Algoritma yang akan dibandingkan nama host dijelaskan dalam RFC5890, Bagian 2.3.2.4.
Alamat IPv4 dan IPv6 literal tidak diizinkan di "HostName".
Persyaratan ini mungkin sulit dipenuhi untuk aplikasi Departemen Kesehatan atau DoT yang ingin memanfaatkan peningkatan keamanan di TLS 1.3. Google Public DNS saat ini menerima koneksi TLS 1.3 yang tidak menyediakan SNI, tetapi kita mungkin perlu mengubah hal ini untuk alasan operasional atau keamanan di masa depan.
Rekomendasi kami untuk permohonan Departemen Transportasi atau Departemen Kesehatan terkait SNI adalah sebagai berikut:
- Kirim nama host dns.google sebagai SNI untuk setiap koneksi ke Google Public DNS DoT atau DoH.
- Jika tidak ada nama host yang tersedia (misalnya, dalam aplikasi yang melakukan oportunistik), lebih baik mengirim alamat IP di SNI daripada daripada membiarkannya kosong.
- Alamat IPv6 harus muncul dalam
[2001:db8:1234::5678]
dalam bentuk kurung di headerHost
, tetapi tanpa tanda kurung di SNI.
Pemotongan Respons DNS
Meskipun Google Public DNS umumnya tidak memotong respons terhadap DoT dan DoH ada dua keadaan ketika hal itu terjadi:
Jika Google Public DNS tidak bisa mendapatkan respons lengkap dan tidak terpotong dari server nama otoritatif, ia menetapkan penanda TC dalam respons.
Dalam kasus di mana respons DNS (dalam bentuk pesan DNS biner) akan melebihi batas 64 KiB untuk pesan DNS TCP, Google Public DNS dapat menyetel TC (pemotongan) jika standar RFC memerlukannya.
Namun, dalam kasus ini, klien tidak perlu mencoba lagi menggunakan TCP polos atau {i>transport<i} lainnya, karena hasilnya akan sama.