Kueri dan balasan DNS tradisional dikirim melalui UDP atau TCP tanpa enkripsi, sehingga tunduk kepada pengawasan, spoofing, dan pemfilteran Internet berbasis DNS. Respons terhadap klien dari resolver publik seperti Google Public DNS sangat rentan terhadap hal ini, karena pesan dapat melewati banyak jaringan, sementara pesan antara resolver rekursif dan server nama otoritatif sering kali menyertakan perlindungan tambahan.
Untuk mengatasi masalah ini, pada tahun 2016 kami meluncurkan DNS melalui HTTPS (sekarang disebut DoH) yang menawarkan resolusi DNS yang memvalidasi DNSSEC terenkripsi melalui HTTPS dan QUIC. Pada tahun 2019, kami menambahkan dukungan untuk standar DNS melalui 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 DNSSEC untuk menyediakan DNS terautentikasi secara menyeluruh untuk domain yang ditandatangani DNSSEC. Dengan Google Public DNS, kami berkomitmen untuk memberikan resolusi DNS yang cepat, pribadi, dan aman untuk klien DoH dan DoT.
Versi TLS dan rangkaian kripto yang didukung
Google Public DNS mendukung TLS 1.2 dan TLS 1.3 untuk DoH dan DoT; tidak ada versi TLS atau SSL sebelumnya yang didukung. Hanya cipher suite dengan keamanan maju dan Enkripsi Terautentikasi dengan Data Tambahan (AEAD) yang didukung. Qualys SSL Labs menampilkan kumpulan cipher suite yang didukung saat ini.
Endpoints
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-nya hanya
https://dns.google/dns-query
dan isi permintaan HTTP adalah payload DNS UDP biner dengan jenis konten application/dns-message. - Untuk GET, ini adalah
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Untuk POST, URL-nya hanya
JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Parameter GET lainnya dijelaskan di halaman JSON API.
Hanya parameter
name
yang wajib diisi.
- Parameter GET lainnya dijelaskan di halaman 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 klien ini biasanya memerlukan konfigurasi yang cukup teknis.
Contoh command line
Contoh command line berikut tidak dimaksudkan untuk digunakan pada klien yang sebenarnya dan hanya merupakan ilustrasi yang menggunakan alat diagnostik yang umum tersedia.
DoT
Perintah berikut memerlukan Knot DNS kdig
2.3.0 atau yang lebih baru; dengan versi 2.7.4 atau
yang lebih baru, hapus tanda komentar +tls‑sni
untuk mengirim SNI seperti yang diperlukan 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
POST RFC 8484
String yang dienkode Base64Url dalam perintah ini adalah pesan DNS yang dikirim oleh
dig +noedns example.test A
dengan kolom ID DNS ditetapkan ke nol, seperti yang direkomendasikan
oleh RFC 8484 bagian 4.1. Perintah shell mengirimkan kueri DNS tersebut sebagai 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, peristiwa ini
diteruskan secara eksplisit 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
Kode 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 mewajibkan klien menyediakan Server Name Identification (SNI).
EkstensiSNI menentukan bahwa informasi SNI adalah domain DNS (dan bukan alamat IP):
"HostName" berisi nama host DNS server yang sepenuhnya memenuhi syarat, seperti yang dipahami oleh klien. Nama host direpresentasikan sebagai string byte menggunakan encoding ASCII tanpa tanda titik di akhir. Hal ini memungkinkan dukungan nama domain yang diinternasionalkan melalui penggunaan label A yang ditentukan dalam RFC5890. Nama host DNS tidak peka huruf besar/kecil. Algoritma untuk membandingkan 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 DoH 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 kami mungkin perlu mengubahnya untuk alasan operasional atau keamanan di masa mendatang.
Rekomendasi kami untuk aplikasi DoT atau DoH terkait SNI adalah sebagai berikut:
- Kirim nama host dns.google sebagai SNI untuk semua koneksi ke layanan Google Public DNS DoT atau DoH.
- Jika tidak ada nama host yang tersedia (misalnya, dalam aplikasi yang melakukan DoT oportunistik), sebaiknya kirim alamat IP dalam SNI, daripada membiarkannya kosong.
- Alamat IPv6 harus muncul dalam bentuk tanda kurung
[2001:db8:1234::5678]
di headerHost
, tetapi tanpa tanda kurung dalam SNI.
Pemotongan Respons DNS
Meskipun Google Public DNS umumnya tidak memotong respons terhadap kueri DoT dan DoH, ada dua situasi saat DNS melakukannya:
Jika Google Public DNS tidak bisa mendapatkan respons yang lengkap dan tidak terpotong dari server nama yang berwenang, Google Public DNS akan menyetel flag TC dalam respons.
Jika respons DNS (dalam bentuk pesan DNS biner) melampaui batas 64 KiB untuk pesan DNS TCP, Google Public DNS dapat menetapkan flag TC (pemotongan) jika standar RFC mengharuskannya.
Namun, dalam kasus ini, klien tidak perlu mencoba lagi menggunakan TCP biasa atau transport lainnya, karena hasilnya akan sama.