Traditionelle DNS-Abfragen und -Antworten werden unverschlüsselt über UDP oder TCP gesendet. Sie unterliegen daher Überwachung, Spoofing und DNS-basierte Internetfilterung. Dies ist besonders anfällig für Antworten von Clients mit öffentlichen Resolvern wie Google Public DNS, da Nachrichten möglicherweise über viele Netzwerke geleitet werden, während Nachrichten zwischen rekursiven Resolvern und autoritativen Nameservern häufig zusätzliche Schutzmaßnahmen enthalten.
Zur Behebung dieser Probleme haben wir 2016 DNS über HTTPS eingeführt (jetzt DoH), das eine verschlüsselte DNSSEC-validierende DNS-Auflösung über HTTPS und QUIC anbietet. Im Jahr 2019 haben wir außerdem den DoH-Standard (DoH) unterstützt, der von der Android-Funktion Privates DNS verwendet wird.
DoH und DoT verbessern den Datenschutz und die Sicherheit zwischen Clients und Resolvern. Sie ergänzen die Google Public DNS-Validierung von DNSSEC, um ein End-to-End-authentifiziertes DNS für DNSSEC-signierte Domains bereitzustellen. Mit Google Public DNS möchten wir eine schnelle, private und sichere DNS-Auflösung sowohl für DoH- als auch für DoT-Clients bieten.
Unterstützte TLS-Versionen und Crypto-Suiten
Google Public DNS unterstützt TLS 1.2 und TLS 1.3 für DoH und DoT. Es werden keine früheren Versionen von TLS oder SSL unterstützt. Es werden nur Cipher Suites mit Forward Security und Authentifizierte Verschlüsselung mit zusätzlichen Daten (AEAD) unterstützt. Qualys SSL Labs enthält die aktuell unterstützten Cipher Suites.
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}
- Für POST lautet die URL nur
https://dns.google/dns-query
und der Text der HTTP-Anfrage ist die binäre UDP-DNS-Nutzlast mit dem Inhaltstyp „application/dns-message“. - Für GET ist dies
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Für POST lautet die URL nur
JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Weitere GET-Parameter werden auf der Seite JSON API beschrieben.
Nur der Parameter
name
ist erforderlich.
- Weitere GET-Parameter werden auf der Seite JSON API beschrieben.
Nur der Parameter
Im Namen der Kunden meines Arbeitgebers
Es gibt eine Reihe von Clientanwendungen, die DoT oder DoH verwenden
- Funktion „Privates Surfen“ für Android 9 (Pie) – DoT
- Intra (Android-App) – DoH
Auf der Website dnsprivacy.org sind mehrere andere Clients für DoT und DoH aufgelistet. Diese erfordern jedoch normalerweise eine moderate technische Konfiguration.
Befehlszeilenbeispiele
Die folgenden Befehlszeilenbeispiele sind nicht zur Verwendung in einem tatsächlichen Client vorgesehen und dienen lediglich der Veranschaulichung mithilfe von allgemein verfügbaren Diagnosetools.
Punkt
Für die folgenden Befehle ist Knot DNS kdig
2.3.0 oder höher erforderlich. Wenn Sie Version 2.7.4 oder höher verwenden, entfernen Sie die Kommentarzeichen aus +tls‑sni
, 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
Logo: DoH
RFC 8484-POST
Der Base64Url-codierte String in diesem Befehl ist die DNS-Nachricht, die von dig +noedns example.test A
gesendet wird, wobei das DNS-ID-Feld auf null gesetzt ist. Dies wird in RFC 8484, Abschnitt 4.1 empfohlen. Der Shell-Befehl sendet diese DNS-Abfrage mit dem Inhaltstyp application/dns-message
als binären Datentext.
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
gesendet wurde, wobei das Feld „DNS-ID“ auf null gesetzt ist. In diesem Fall wird sie explizit in der URL übergeben.
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
Dies verwendet die JSON API für 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 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 SNI-Informationen eine DNS-Domain und keine IP-Adresse ist:
"HostName" enthält den vollständig qualifizierten DNS-Hostnamen des Servers, wie vom Client erkannt. Der Hostname wird als Bytestring mit ASCII-Codierung ohne abschließenden Punkt dargestellt. Dies ermöglicht die Unterstützung internationalisierter Domainnamen mithilfe von A-Labels, die in RFC5890 definiert sind. Bei DNS-Hostnamen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Der Algorithmus zum Vergleichen von Hostnamen wird in RFC5890, Abschnitt 2.3.2.4 beschrieben.
Literale IPv4- und IPv6-Adressen sind in „HostName“ nicht zulässig.
Diese Anforderungen können für DoH- oder DoT-Anwendungen, die Sicherheitsvorteile in TLS 1.3 nutzen möchten, schwer zu erfüllen sein. Google Public DNS akzeptiert derzeit TLS 1.3-Verbindungen, die kein SNI bieten. Dies kann jedoch aus geschäftlichen oder Sicherheitsgründen in Zukunft geändert werden.
Unsere Empfehlungen für DoT- oder DoH-Anwendungen in Bezug auf SNI:
- Senden Sie den Hostnamen „dns.google“ als SNI für alle Verbindungen zu den DoT- oder DoH-Diensten von Google Public DNS.
- Wenn kein Hostname verfügbar ist (z. B. in einer Anwendung, die Opportunity-DoT verwendet), ist es besser, die IP-Adresse im SNI zu senden, statt sie leer zu lassen.
- IPv6-Adressen sollten im
[2001:db8:1234::5678]
Header im HeaderHost
in Klammern gesetzt werden, jedoch ohne Klammern im SNI.
Abschneiden von DNS-Antworten
Obwohl Google Public DNS im Allgemeinen keine Antworten auf DoT- und DoH-Abfragen kürzt, kann es zwei Situationen geben:
Wenn Google Public DNS keine vollständigen und nicht abgeschnittenen Antworten von autoritativen Nameservern abrufen kann, wird das TC-Flag in der Antwort festgelegt.
In Fällen, in denen die DNS-Antwort (im binären DNS-Nachrichtenformat) das Limit von 64 KiB für TCP-DNS-Nachrichten überschreiten würde, kann Google Public DNS das TC-Flag (Abschneiden) festlegen, wenn dies gemäß RFC-Standards erforderlich ist.
In diesen Fällen ist es jedoch nicht erforderlich, dass Clients einen einfachen TCP-Datenverkehr oder einen anderen Transportvorgang wiederholen, da das Ergebnis das gleiche ist.