tradycyjne zapytania i odpowiedzi DNS są wysyłane przez UDP lub TCP bez szyfrowania, przez który chronimy je przed inwigilacją, podszywaniem się i filtrowaniem internetu opartym na DNS. Odpowiedzi na klienty z publicznych resolverów, takich jak publiczny DNS Google, są szczególnie narażone na to, ponieważ wiadomości mogą przechodzić przez wiele sieci, między rekurencyjnymi resolverami a wiarygodnymi serwerami nazw często dodatkowe zabezpieczenia.
Aby rozwiązać te problemy, w 2016 roku wprowadziliśmy protokół DNS-over-HTTPS (obecnie DoH). oferuje szyfrowanie DNS z weryfikacją DNS przy użyciu HTTPS i QUIC. W 2019 r. dodaliśmy obsługę standardu DNS przez TLS (DoT) używanego przez funkcja Prywatny DNS na Androidzie.
DoH i DoT zwiększają prywatność i bezpieczeństwo klientów oraz resolverów. uzupełniające walidację publicznego DNS Google dla DNSSEC w celu zapewnienia kompleksowej obsługi. uwierzytelniony DNS dla domen podpisanych przez DNSSEC. Dzięki publicznemu DNS Google staramy się zapewnić szybkie, prywatne i bezpieczne rozpoznawanie nazw DNS zarówno w DoH, jak i klientów DoT.
Obsługiwane wersje TLS i pakiety kryptowalut
Google Public DNS obsługuje TLS 1.2 i TLS 1.3 zarówno dla DoH, jak i DoT. nie wcześniej obsługiwane są różne wersje TLS lub SSL. Tylko zestawy szyfrów z zabezpieczeniami przed przekazywaniem danych i uwierzytelnione szyfrowanie z dodatkowymi danymi (AEAD). Qualys SSL Labs zawiera listę obsługiwanych zestawów szyfrów.
Punkty końcowe
Publiczny DNS Google używa tych punktów końcowych dla DoH i DoT:
DoT (port 853) dns.google
Szablony URI DoH (port 443)
RFC 8484 –
https://dns.google/dns-query{?dns}
- W przypadku metody POST adres URL to tylko
https://dns.google/dns-query
, a treścią żądanie HTTP to binarny ładunek DNS UDP z typem treści application/dns-message. - W przypadku metody GET jest to
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- W przypadku metody POST adres URL to tylko
Interfejs JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Więcej parametrów GET znajdziesz na
JSON API.
Wymagany jest tylko parametr
name
.
- Więcej parametrów GET znajdziesz na
JSON API.
Wymagany jest tylko parametr
Klienty
Istnieje wiele aplikacji klienckich, które korzystają z DoT lub DoH,
- Funkcja „Przeglądanie prywatne” w Androidzie 9 (Pie) – kropka
- Intra (aplikacja na Androida) – DoH
Na stronie dnsprivacy.org znajduje się lista kilku innych klientów współpracujących z domeną DoT i DoH, ale wymagają zwykle umiarkowanej konfiguracji technicznej.
Przykłady wiersza poleceń
Poniższe przykłady wiersza poleceń nie są przeznaczone do użytku w rzeczywistym kliencie i są jedynie ilustracjami przy użyciu powszechnie dostępnych narzędzi diagnostycznych.
DoT
Te polecenia wymagają Knot DNS kdig
w wersji 2.3.0 lub nowszej; w wersji 2.7.4 lub
później usuń znacznik komentarza z pola +tls‑sni
, aby wysłać SNI zgodnie z wymaganiami 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
Ciąg znaków zakodowany w Base64Url w tym poleceniu to wiadomość DNS wysłana przez
dig +noedns example.test A
z polem identyfikatora DNS ustawionym na 0, zgodnie z zaleceniami
zgodnie ze standardem RFC 8484, sekcja 4.1. Polecenie powłoki wysyła zapytanie DNS jako
treść danych binarnych za pomocą 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
Ciąg znaków zakodowany w Base64Url w tym poleceniu to wiadomość DNS wysłana przez
dig +noedns example.com A
z polem identyfikatora DNS ustawionym na 0. W tym przypadku
jest jawnie przekazywane w adresie 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
Wykorzystuje interfejs JSON API dla 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":[]}
Protokół TLS 1.3 i SNI dla adresów URL adresów IP
TLS 1.3 wymaga, aby klienty SNI (Server Name Identification).
Rozszerzenie SNI określa, że informacje SNI są domeną DNS (a nie adresem IP):
„HostName” zawiera w pełni kwalifikowaną nazwę hosta DNS serwera, w sposób zrozumiały dla klienta. Nazwa hosta jest reprezentowana jako ciąg bajtów używając kodowania ASCII, bez kropki na końcu. Umożliwia to obsługę umiędzynarodowionych nazw domen za pomocą etykiet A zdefiniowanych w RFC5890. Wielkość liter w nazwach hostów DNS nie jest rozróżniana. Algorytm do porównania nazwy hostów zostały opisane w dokumencie RFC5890, sekcja 2.3.2.4.
Literowe adresy IPv4 i IPv6 nie są dozwolone w polu „HostName”.
Spełnienie tych wymagań może być trudne w przypadku aplikacji DoH lub DoT, które korzystać z ulepszeń zabezpieczeń TLS 1.3. Obecnie publiczny DNS Google akceptuje połączenia TLS 1.3, które nie udostępniają SNI, ale może być konieczne ze względów operacyjnych lub związanych z bezpieczeństwem w przyszłości.
Nasze zalecenia w związku z rozliczeniami DoT i DoH w związku z SNI:
- Wysyłaj nazwę hosta dns.google jako SNI dla wszystkich połączeń z serwerem Google Public Usługi DNS DoT lub DoH.
- Jeśli nazwa hosta nie jest dostępna (na przykład w aplikacji, która oportunistycznej kropki), lepiej wysłać adres IP w SNI, niż pozostawianie pustego pola.
- Adresy IPv6 powinny być zapisane w nawiasie kwadratowym
[2001:db8:1234::5678]
nagłówekHost
, ale w SNI bez nawiasów.
Obcinanie odpowiedzi DNS
Chociaż Google Public DNS zwykle nie skraca odpowiedzi na DoT i DoH, zapytań, zachodzą 2 sytuacje:
Jeśli publiczny DNS Google nie może uzyskać pełnych ani nieobciętych odpowiedzi z serwerów nazw, ustawia w odpowiedzi flagę przejrzystości i zgody na przetwarzanie danych.
W sytuacji, gdy odpowiedź DNS (w formie binarnego komunikatu DNS) spowodowałaby przekroczenie limitu 64 KiB dla wiadomości TCP DNS, publiczny DNS Google może ustawić flagę TC (obcinanie), jeśli wymagają tego standardy RFC.
W takich przypadkach nie ma jednak potrzeby ponawiania prób przez klienty przy użyciu zwykłego protokołu TCP. lub innego środka transportu, bo wynik będzie taki sam.