Le query e le risposte DNS tradizionali vengono inviate tramite UDP o TCP senza crittografia e sono quindi soggette a sorveglianza, spoofing e filtri internet basati su DNS. Le risposte ai client da parte di resolver pubblici come Google Public DNS sono particolarmente vulnerabili a questo problema, poiché i messaggi possono passare attraverso molte reti, mentre i messaggi tra resolver ricorsivi e server dei nomi autorevoli incorporano spesso protezioni aggiuntive.
Per risolvere questi problemi, nel 2016 abbiamo lanciato il DNS tramite HTTPS (ora chiamato DoH) offrendo una risoluzione DNS criptata con convalida delle DNSSEC tramite HTTPS e QUIC. Nel 2019 abbiamo aggiunto il supporto per lo standard DNS su TLS (DoT) utilizzato dalla funzionalità DNS privato di Android.
DoH e DoT migliorano la privacy e la sicurezza tra client e resolver, integrando la convalida delle DNSSEC Google Public DNS per fornire un DNS end-to-end autenticato per i domini firmati con DNSSEC. Con Google Public DNS, ci impegniamo a fornire una risoluzione DNS veloce, privata e sicura per i client DoH e DoT.
Versioni e suite di crittografia TLS supportate
Google Public DNS supporta TLS 1.2 e TLS 1.3 sia per DoH che per DoT; non sono supportate versioni precedenti di TLS o SSL. Sono supportate solo le suite di crittografia con sicurezza di forwarding e AEAD (Authenticated Encryption with Additional Data). Qualys SSL Labs mostra l'insieme corrente di suite di crittografia supportate.
Endpoint
Il DNS pubblico di Google utilizza i seguenti endpoint per DoH e DoT:
DoT (porta 853) dns.google
Modelli URI DoH (porta 443)
RFC 8484 -
https://dns.google/dns-query{?dns}
- Per POST, l'URL è solo
https://dns.google/dns-query
e il corpo della richiesta HTTP è il payload DNS UDP binario con tipo di contenuto application/dns-message. - Per GET è
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Per POST, l'URL è solo
API JSON –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Altri parametri GET sono descritti nella pagina
dell'API JSON.
È richiesto solo il parametro
name
.
- Altri parametri GET sono descritti nella pagina
dell'API JSON.
È richiesto solo il parametro
Clienti
Esistono numerose applicazioni client che utilizzano DoT o DoH
- Funzionalità "Navigazione privata" di Android 9 (Pie) - DoT
- Intra (app Android) - DoH
Sul sito web dnsprivacy.org sono elencati diversi altri client per DoT e DoH, che in genere richiedono una configurazione moderatamente tecnica.
Esempi di righe di comando
I seguenti esempi di riga di comando non sono destinati all'utilizzo in un client reale e sono semplicemente illustrazioni che utilizzano strumenti di diagnostica comunemente disponibili.
DoT
I seguenti comandi richiedono Knot DNS kdig
2.3.0 o versioni successive; con 2.7.4 o versioni successive, rimuovi il commento +tls‑sni
per inviare SNI come richiesto da 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
La stringa codificata in Base64Url in questo comando è il messaggio DNS inviato da dig +noedns example.test A
con il campo ID DNS impostato su zero, come consigliato dalla sezione 4.1 di RFC 8484. Il comando shell invia la query DNS come contenuto del corpo dei dati binari, utilizzando il tipo di contenuto 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"
RFC 8484 OTTIENI
La stringa codificata in Base64Url in questo comando è il messaggio DNS inviato da dig +noedns example.com A
con il campo ID DNS impostato su zero. In questo caso, viene passato esplicitamente
nell'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"
JSON GET
Viene utilizzata l'API JSON per 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 e SNI per URL di indirizzi IP
TLS 1.3 richiede che i client forniscano l'identificazione SNI (Server Name Identification).
L'estensione SNI specifica che le informazioni SNI sono un dominio DNS (e non un indirizzo IP):
"Nomehost" contiene il nome host DNS completo del server, così come è inteso dal client. Il nome host è rappresentato come una stringa di byte con codifica ASCII senza punto finale. Ciò consente il supporto di nomi di dominio internazionalizzati attraverso l'uso di etichette A definite in RFC5890. I nomi host DNS non fanno distinzione tra maiuscole e minuscole. L'algoritmo per confrontare i nomi host è descritto in RFC5890, Sezione 2.3.2.4.
Gli indirizzi IPv4 e IPv6 letterali non sono consentiti in "HostName".
Questi requisiti possono essere difficili da soddisfare per le applicazioni DoH o DoT che vogliono sfruttare i miglioramenti della sicurezza di TLS 1.3. Al momento Google Public DNS accetta connessioni TLS 1.3 che non forniscono SNI, ma in futuro potrebbe essere necessario modificare questa impostazione per motivi operativi o di sicurezza.
I nostri consigli per le applicazioni DoT o DoH in relazione a SNI sono i seguenti:
- Invia il nome host dns.google come SNI per qualsiasi connessione ai servizi Google Public DNS DoT o DoH.
- Se non è disponibile alcun nome host (ad esempio, in un'applicazione che esegue un DoT opportunità), è meglio inviare l'indirizzo IP nella casella SNI anziché lasciarlo vuoto.
- Gli indirizzi IPv6 devono apparire in forma tra parentesi
[2001:db8:1234::5678]
nell'intestazioneHost
, ma senza parentesi nella SNI.
Troncamento risposta DNS
Sebbene Google Public DNS in genere non tronca le risposte alle query DoT e DoH, ci sono due casi in cui lo fa:
Se il DNS pubblico di Google non è in grado di ricevere risposte complete e non troncate da server dei nomi autorevoli, imposta il flag TC nella risposta.
Nei casi in cui la risposta DNS (nel modulo di messaggio DNS binario) supererebbe il limite di 64 KiB per i messaggi DNS TCP, Google Public DNS potrebbe impostare il flag TC (troncamento) se gli standard RFC lo richiedono.
Tuttavia, in questi casi, non è necessario che i client ripetano l'utilizzo del protocollo TCP normale o di qualsiasi altro trasporto, poiché il risultato sarà lo stesso.