Herkömmliche DNS-Abfragen und -Antworten werden ohne Verschlüsselung über UDP oder TCP gesendet. Dadurch werden sie überwacht, Spoofing und DNS-basierter Internetfilterung unterzogen. Antworten von Clients von öffentlichen Resolvern wie Google Public DNS sind besonders anfällig ist, da Nachrichten viele Netzwerke durchlaufen können, während zwischen rekursiven Resolvern und autoritativen Nameservern zusätzliche Schutzmaßnahmen.
Um diese Probleme zu beheben, haben wir 2016 DNS over HTTPS (jetzt DoH) eingeführt. bietet verschlüsselte DNSSEC-validierende DNS-Auflösung über HTTPS und QUIC. 2019 haben wir Unterstützung für den DoT-Standard (DNS over TLS) hinzugefügt, der von den die Android-Funktion Privates DNS
DoH und DoT verbessern den Datenschutz und die Sicherheit zwischen Kunden und Resolvern, die Google Public DNS-Validierung von DNSSEC ergänzt, um eine End-to-End- authentifiziertes DNS für DNSSEC-signierte Domains. Mit Google Public DNS eine schnelle, private und sichere DNS-Auflösung sowohl für DoH als auch DoT-Clients.
Unterstützte TLS-Versionen und Krypto-Suites
Google Public DNS unterstützt TLS 1.2 und TLS 1.3 sowohl für DoH als auch für DoT. nein früher Versionen von TLS oder SSL unterstützt werden. Nur Cipher Suites mit Forward Security Authentifizierte Verschlüsselung mit zusätzlichen Daten (Authenticated Encryption with Umgebungs-Daten, AEAD) unterstützt. Qualys SSL Labs zeigt die aktuellen unterstützten Cipher Suites an.
Endpunkte
Google Public DNS verwendet die folgenden Endpunkte für DoH und DoT:
DoT (Port 853) dns.google
DoH (Port 443) URI-Vorlagen
RFC 8484 –
https://dns.google/dns-query{?dns}
- Bei POST-Anfragen ist die URL nur
https://dns.google/dns-query
und der Textkörper Die HTTP-Anfrage ist die binäre UDP-DNS-Nutzlast mit Inhaltstyp. application/dns-message. - Für GET ist dies
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Bei POST-Anfragen ist die URL nur
JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Weitere GET-Parameter sind in der
JSON API.
Nur der Parameter
name
ist erforderlich.
- Weitere GET-Parameter sind in der
JSON API.
Nur der Parameter
Clients
Es gibt eine Reihe von Clientanwendungen, die DoT oder DoH verwenden.
- Funktion „Privates Surfen“ unter Android 9 (Pie) – DoT
- Intra (Android-App) – DoH
Auf der Website dnsprivacy.org sind mehrere andere Clients für DoT und DoH aufgeführt, die jedoch erfordern diese in der Regel eine mäßig technische Konfiguration.
Befehlszeilenbeispiele
Die folgenden Befehlszeilenbeispiele sind nicht für die Verwendung in einem tatsächlichen Client vorgesehen und dienen lediglich dazu, allgemein verfügbare Diagnosetools zu verwenden.
DoT
Für die folgenden Befehle ist Knot DNS kdig
2.3.0 oder höher erforderlich. mit 2.7.4 oder
Entfernen Sie die Kommentarzeichen von +tls‑sni
später, um SNI gemäß TLS 1.3 zu senden.
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
RFC 8484-POST-Anfrage
Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von
dig +noedns example.test A
, wobei das Feld für die DNS-ID auf null gesetzt ist, wie empfohlen
gemäß RFC 8484, Abschnitt 4.1. Der Shell-Befehl sendet diese DNS-Abfrage
Binärdatentext unter Verwendung des 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"
RFC 8484 GET
Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von
dig +noedns example.com A
, wobei das Feld für die DNS-ID auf null gesetzt ist. In diesem Fall
explizit in der URL übergeben wird.
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
Dabei wird die JSON API für DoH verwendet.
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 und SNI für IP-Adress-URLs
Für TLS 1.3 müssen Clients Server Name Identification (SNI) bereitstellen.
Die SNI-Erweiterung gibt an, dass die SNI-Informationen eine DNS-Domain und keine IP-Adresse sind:
„Hostname“ enthält den voll qualifizierten DNS-Hostnamen des Servers, wie vom Kunden verstanden. Der Hostname wird als Bytestring dargestellt. mit ASCII-Codierung ohne abschließenden Punkt. So kann die Unterstützung von internationalisierten Domainnamen durch die Verwendung von A-Labels, RFC5890. Bei DNS-Hostnamen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Der zu vergleichende Algorithmus Hostnamen sind in RFC5890, Abschnitt 2.3.2.4 beschrieben.
Literale IPv4- und IPv6-Adressen sind in „HostName“ nicht zulässig.
Für DoH- oder DoT-Anwendungen, die profitieren Sie von den Sicherheitsverbesserungen in TLS 1.3. Google Public DNS derzeit akzeptiert TLS 1.3-Verbindungen ohne SNI, dies müssen jedoch möglicherweise geändert werden. aus betrieblichen oder sicherheitsbedingten Gründen.
Unsere Empfehlungen für DoT- oder DoH-Anwendungen bezüglich SNI lauten wie folgt:
- Senden Sie bei allen Verbindungen zu Google Public den Hostnamen „dns.google“ als SNI. DNS DoT- oder DoH-Diensten
- Wenn kein Hostname verfügbar ist, z. B. in einer Anwendung, opportunistisches DoT), ist es besser, die IP-Adresse im SNI zu senden, einfach leer lassen.
- IPv6-Adressen sollten in
[2001:db8:1234::5678]
in Klammern angezeigt werden in: den HeaderHost
, aber ohne Klammern im SNI.
Kürzung von DNS-Antworten
Obwohl Google Public DNS Antworten auf DoT und DoH im Allgemeinen nicht kürzt Abfragen gibt es zwei Umstände:
Wenn Google Public DNS keine vollständigen und nicht abgeschnittenen Antworten von autoritativen Nameservern in der Antwort das TC-Flag fest.
Wenn die DNS-Antwort (in binärer DNS-Nachrichtenform) 64 KiB für TCP-DNS-Nachrichten überschreiten, legt Google Public DNS möglicherweise TC (abgeschnitten) markieren, wenn dies gemäß RFC-Standards erforderlich ist.
In diesen Fällen müssen die Clients jedoch keine neuen Versuche über TCP ausführen oder ein anderes Transportmittel ein, da das Ergebnis das gleiche ist.