Transportasi aman untuk DNS

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.
  • JSON API – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Parameter GET lainnya dijelaskan di halaman JSON API. Hanya parameter name yang wajib diisi.

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:

  1. Kirim nama host dns.google sebagai SNI untuk semua koneksi ke layanan Google Public DNS DoT atau DoH.
  2. Jika tidak ada nama host yang tersedia (misalnya, dalam aplikasi yang melakukan DoT oportunistik), sebaiknya kirim alamat IP dalam SNI, daripada membiarkannya kosong.
  3. Alamat IPv6 harus muncul dalam bentuk tanda kurung [2001:db8:1234::5678] di header Host, 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:

  1. 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.

  2. 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.