پرسشها و پاسخهای DNS سنتی بدون رمزگذاری از طریق UDP یا TCP ارسال میشوند و آنها را در معرض نظارت، جعل و فیلتر اینترنت مبتنی بر DNS قرار میدهند. پاسخها به مشتریان از حلکنندههای عمومی مانند Google Public DNS به ویژه در برابر این آسیبپذیر هستند، زیرا پیامها ممکن است از طریق بسیاری از شبکهها عبور کنند، در حالی که پیامهای بین حلکنندههای بازگشتی و سرورهای نام معتبر اغلب محافظتهای بیشتری را شامل میشوند.
برای پرداختن به این مشکلات، در سال 2016 DNS را از طریق HTTPS (که اکنون DoH نامیده میشود) راهاندازی کردیم که وضوح DNS دارای اعتبار DNSSEC رمزگذاری شده را از طریق HTTPS و QUIC ارائه میکرد. و در سال 2019، ما پشتیبانی از استاندارد DNS بیش از TLS (DoT) را که توسط ویژگی Android Private DNS استفاده میشود، اضافه کردیم.
DoH و DoT حریم خصوصی و امنیت را بین کلاینتها و حلکنندهها افزایش میدهند و تکمیل کننده اعتبارسنجی DNS عمومی Google برای DNSSEC برای ارائه DNS تأیید شده سرتاسر برای دامنههای دارای امضای DNSSEC. با Google Public DNS، ما متعهد به ارائه وضوح DNS سریع، خصوصی و ایمن برای هر دو سرویس گیرنده DoH و DoT هستیم.
نسخه های TLS و مجموعه های رمزنگاری پشتیبانی می شود
Google Public DNS از TLS 1.2 و TLS 1.3 برای DoH و DoT پشتیبانی می کند. هیچ نسخه قبلی TLS یا SSL پشتیبانی نمی شود. فقط مجموعههای رمز با امنیت رو به جلو و رمزگذاری تأیید شده با دادههای اضافی (AEAD) پشتیبانی میشوند. Qualys SSL Labs مجموعه فعلی مجموعه های رمز پشتیبانی شده را نشان می دهد.
نقاط پایانی
Google Public DNS از نقاط پایانی زیر برای DoH و DoT استفاده می کند:
DoT (پورت 853) dns.google
الگوهای URI DoH (پورت 443).
RFC 8484 –
https://dns.google/dns-query{?dns}
- برای POST، URL فقط
https://dns.google/dns-query
است و بدنه درخواست HTTP، بار بار DNS باینری UDP با نوع محتوا application/dns-message است. - برای GET این
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY است.
- برای POST، URL فقط
JSON API –
https://dns.google/resolve{?name}{&type,cd,do,…}
- پارامترهای GET بیشتر در صفحه JSON API توضیح داده شده است. فقط پارامتر
name
مورد نیاز است.
- پارامترهای GET بیشتر در صفحه JSON API توضیح داده شده است. فقط پارامتر
مشتریان
تعدادی از برنامه های مشتری وجود دارد که از DoT یا DoH استفاده می کنند
- ویژگی «مرور خصوصی» اندروید 9 (پای) – DoT
- Intra (برنامه اندروید) – DoH
وبسایت dnsprivacy.org چندین مشتری دیگر را برای DoT و DoH فهرست میکند، اما اینها معمولاً به پیکربندی فنی متوسطی نیاز دارند.
نمونه های خط فرمان
مثالهای خط فرمان زیر برای استفاده در یک کلاینت واقعی در نظر گرفته نشدهاند و صرفاً تصاویری هستند که از ابزارهای تشخیصی رایج در دسترس استفاده میکنند.
DoT
دستورات زیر به Knot DNS kdig
2.3.0 یا جدیدتر نیاز دارند. با 2.7.4 یا جدیدتر، +tls‑sni
برای ارسال SNI همانطور که توسط 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
RFC 8484 POST
رشته کدگذاری شده Base64Url در این دستور، پیام DNS است که توسط dig +noedns example.test A
ارسال میشود که فیلد DNS ID روی صفر تنظیم شده است، همانطور که در بخش 4.1 RFC 8484 توصیه میشود. فرمان پوسته، درخواست DNS را به عنوان محتوای بدنه داده باینری، با استفاده از 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
رشته رمزگذاری شده Base64Url در این دستور، پیام DNS است که توسط dig +noedns example.com A
ارسال می شود که فیلد DNS ID روی صفر تنظیم شده است. در این مورد به صراحت در 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
این از JSON API برای 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 و SNI برای نشانیهای اینترنتی آدرس IP
TLS 1.3 مستلزم آن است که مشتریان شناسه نام سرور (SNI) را ارائه دهند.
پسوند SNI مشخص می کند که اطلاعات SNI یک دامنه DNS (و نه یک آدرس IP) است:
"HostName" حاوی نام میزبان DNS کاملاً واجد شرایط سرور است که توسط مشتری درک می شود. نام میزبان به عنوان یک رشته بایت با استفاده از رمزگذاری ASCII بدون نقطه انتهایی نشان داده می شود. این امکان پشتیبانی از نام های دامنه بین المللی را از طریق استفاده از برچسب های A تعریف شده در RFC5890 فراهم می کند. نام میزبان DNS به حروف بزرگ و کوچک حساس نیست. الگوریتم مقایسه نام میزبان در RFC5890، بخش 2.3.2.4 توضیح داده شده است.
آدرس های IPv4 و IPv6 تحت اللفظی در "HostName" مجاز نیستند.
برآوردن این الزامات برای برنامههای DoH یا DoT که میخواهند از پیشرفتهای امنیتی در TLS 1.3 استفاده کنند، دشوار است. Google Public DNS در حال حاضر اتصالات TLS 1.3 را میپذیرد که SNI را ارائه نمیکنند، اما ممکن است در آینده به دلایل عملیاتی یا امنیتی نیاز به تغییر آن داشته باشیم.
توصیه های ما برای برنامه های DoT یا DoH در مورد SNI به شرح زیر است:
- نام میزبان dns.google را به عنوان SNI برای هر گونه اتصال به سرویسهای DoT یا DoH عمومی DNS Google ارسال کنید.
- اگر نام میزبانی در دسترس نباشد (مثلاً در برنامهای که DoT فرصتطلبانه انجام میدهد)، بهتر است آدرس IP را در SNI ارسال کنید تا اینکه آن را خالی بگذارید.
- آدرسهای IPv6 باید به شکل
[2001:db8:1234::5678]
در هدرHost
ظاهر شوند، اما بدون براکت در SNI.
قطع پاسخ DNS
اگرچه Google Public DNS معمولاً پاسخها به پرس و جوهای DoT و DoH را کوتاه نمیکند، دو حالت وجود دارد:
اگر DNS عمومی Google نتواند پاسخهای کامل و کوتاه نشده را از سرورهای نام معتبر دریافت کند، پرچم TC را در پاسخ تنظیم میکند.
در مواردی که پاسخ DNS (به شکل پیام DNS باینری) از حد 64 کیلوبایت برای پیامهای TCP DNS فراتر میرود، در صورتی که استانداردهای RFC این کار را الزامی کند، ممکن است DNS عمومی Google پرچم TC (قطع) را تنظیم کند.
با این حال، در این موارد، نیازی به تلاش مجدد مشتریان با استفاده از TCP ساده یا هر حمل و نقل دیگری نیست، زیرا نتیجه یکسان خواهد بود.