Geleneksel DNS sorguları ve yanıtları, şifreleme olmadan UDP veya TCP üzerinden gönderilir. Bu sayede izleme, adres sahteciliği ve DNS tabanlı internet filtrelemesine tabi tutulur. Mesajların birçok ağ üzerinden iletilebilmesi ve yinelemeli çözümleyiciler ile yetkili alan adı sunucuları arasındaki mesajlar ise genellikle ek korumalar içerdiğinden, istemcilere Google Açık DNS gibi herkese açık çözümleyicilerden gelen istemcilere verilen yanıtlar, bu konuda özellikle savunmasızdır.
Bu sorunları ele almak için 2016'da HTTPS üzerinden DNS'yi kullanıma sunduk (artık DoH olarak adlandırılıyor), HTTPS ve QUIC üzerinden şifrelenmiş DNSSEC doğrulamalı DNS çözümlemesi sunuyoruz. 2019'da ise Android Gizli DNS özelliği tarafından kullanılan TLS üzerinden DNS (DoT) standardı için destek ekledik.
DoH ve DoT, istemciler ve çözümleyiciler arasındaki gizliliği ve güvenliği iyileştirerek DNSSEC'nin Google Açık DNS doğrulamasını tamamlar ve DNSSEC imzalı alanlar için uçtan uca kimlik doğrulaması yapılmış DNS sağlamak amacıyla DNSSEC'nin Google Açık DNS doğrulamasını tamamlar. Google Açık DNS ile hem DoH hem de DoT istemcileri için hızlı, gizli ve güvenli DNS çözümlemesi sunmayı taahhüt ediyoruz.
Desteklenen TLS sürümleri ve şifreleme paketleri
Google Açık DNS, hem DoH hem de DoT için TLS 1.2 ve TLS 1.3'ü destekler. TLS veya SSL'nin önceki sürümleri desteklenmez. Yalnızca ileri düzey güvenliği olan şifre paketleri ve Ek Verilerle Kimliği Doğrulanmış Şifreleme (AEAD) desteklenir. Qualys SSL Labs, desteklenen mevcut şifre paketi grubunu gösterir.
Uç noktalar
Google Açık DNS, DoH ve DoT için aşağıdaki uç noktaları kullanır:
DoT (853 bağlantı noktası) dns.google
DoH (443 numaralı bağlantı noktası) URI şablonları
RFC 8484 -
https://dns.google/dns-query{?dns}
- POST için URL yalnızca
https://dns.google/dns-query
şeklindedir ve HTTP isteğinin gövdesi, uygulama/dns-mesaj içerik türüne sahip ikili UDP DNS yüküdür. - GET için bu:
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- POST için URL yalnızca
JSON API -
https://dns.google/resolve{?name}{&type,cd,do,…}
- JSON API sayfasında daha fazla GET parametresi açıklanmıştır.
Yalnızca
name
parametresi gereklidir.
- JSON API sayfasında daha fazla GET parametresi açıklanmıştır.
Yalnızca
Müşteriler
DoT veya DoH kullanan birkaç istemci uygulaması vardır
- Android 9 (Pie) "Gizli Tarama" özelliği - DoT
- Intra (Android uygulaması) – DoH
dnsprivacy.org web sitesinde DoT ve DoH için başka birkaç istemci listelenmektedir ancak bunlar genellikle orta düzeyde teknik yapılandırma gerektirir.
Komut satırı örnekleri
Aşağıdaki komut satırı örnekleri gerçek bir istemcide kullanım için tasarlanmamıştır ve yalnızca yaygın olarak bulunan teşhis araçlarının kullanımına yönelik çizimlerdir.
DoT
Aşağıdaki komutlar için Knot DNS kdig
2.3.0 veya sonraki sürümler gerekir. 2.7.4 veya sonraki sürümlerde, TLS 1.3'ün gerektirdiği şekilde SNI göndermesi için +tls‑sni
ile ilgili açıklamayı kaldırın.
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 POSTA
Bu komuttaki Base64Url kodlamalı dize, RFC 8484 bölüm 4.1 tarafından önerildiği gibi, dig +noedns example.test A
tarafından DNS Kimliği alanı sıfır olarak ayarlanmış şekilde gönderilen DNS mesajıdır. Kabuk komutu, bu DNS sorgusunu application/dns-message
Content-Type kullanarak ikili veri gövdesi içeriği olarak gönderir.
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 ALMA
Bu komuttaki Base64Url kodlamalı dize, DNS kimliği alanı sıfır olarak ayarlanmış şekilde dig +noedns example.com A
tarafından gönderilen DNS mesajıdır. Bu durumda, URL'de açık bir şekilde iletilir.
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 ALMA
DoH için JSON API'yi kullanır.
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":[]}
IP adresi URL'leri için TLS 1.3 ve SNI
TLS 1.3, istemcilerin Sunucu Adı Tanımlama (SNI) sağlamasını gerektirir.
SNI uzantısı, SNI bilgilerinin bir DNS alanı olduğunu (IP adresi değil) belirtir:
"HostName", istemci tarafından anlaşıldığı şekilde sunucunun tam DNS ana makine adını içerir. Ana makine adı, sonunda nokta olmadan ASCII kodlaması kullanılarak bayt dizesi olarak gösterilir. Bu, RFC5890'da tanımlanan A etiketlerinin kullanımı aracılığıyla uluslararası alan adlarının desteklenmesine olanak tanır. DNS ana makine adları büyük/küçük harfe duyarlı değildir. Adları karşılaştıran algoritma, RFC5890, Bölüm 2.3.2.4'te açıklanmıştır.
"BarındırıcıAdı"nda, gerçek IPv4 ve IPv6 adreslerine izin verilmez.
TLS 1.3'teki güvenlik iyileştirmelerinden yararlanmak isteyen DoH veya DoT uygulamalarının bu gereksinimleri karşılaması zor olabilir. Google Açık DNS, şu anda SNI sağlamayan TLS 1.3 bağlantılarını kabul etmektedir ancak gelecekte operasyonel veya güvenlikle ilgili nedenlerle bu ayarı değiştirmemiz gerekebilir.
SNI ile ilgili DoT veya DoH uygulamalarına yönelik önerilerimiz şunlardır:
- Google Genel DNS DoT veya DoH hizmetlerine olan tüm bağlantılar için dns.google ana makine adını SNI olarak gönderin.
- Ana makine adı yoksa (örneğin, fırsatçı DoT işlemi yapan bir uygulamada) IP adresini boş bırakmak yerine SNI'da göndermek daha iyi olur.
- IPv6 adresleri,
Host
başlığında[2001:db8:1234::5678]
parantez içine alınmış biçimde olmalı, ancak SNI'da köşeli parantezler kullanılmamalıdır.
DNS Yanıtı Kesintisi
Google Açık DNS, genellikle DoT ve DoH sorgularına verilen yanıtları kısaltamasa da bu durum iki şekilde gerçekleşir:
Google Açık DNS, yetkili alan adı sunucularından eksiksiz ve kısaltılmamış yanıtlar alamazsa yanıtta TC işaretini ayarlar.
DNS yanıtının (ikili DNS mesajı biçiminde) TCP DNS mesajları için 64 KiB sınırını aştığı durumlarda, RFC standartları gerektirdiği takdirde Google Açık DNS, TC (kesme) işaretini ayarlayabilir.
Yine de aynı sonuç elde edileceği için bu durumlarda istemcilerin düz TCP veya başka bir taşıma yöntemini kullanarak tekrar denemesine gerek yoktur.