حمل و نقل ایمن برای DNS

پرسش‌ها و پاسخ‌های 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 است.
  • JSON API – https://dns.google/resolve{?name}{&type,cd,do,…}

    • پارامترهای GET بیشتر در صفحه JSON API توضیح داده شده است. فقط پارامتر name مورد نیاز است.

مشتریان

تعدادی از برنامه های مشتری وجود دارد که از DoT یا DoH استفاده می کنند

  • ویژگی «مرور خصوصی» اندروید 9 (پای) – DoT
  • Intra (برنامه اندروید) – DoH

وب‌سایت dnsprivacy.org چندین مشتری دیگر را برای DoT و DoH فهرست می‌کند، اما اینها معمولاً به پیکربندی فنی متوسطی نیاز دارند.

نمونه های خط فرمان

مثال‌های خط فرمان زیر برای استفاده در یک کلاینت واقعی در نظر گرفته نشده‌اند و صرفاً تصاویری هستند که از ابزارهای تشخیصی رایج در دسترس استفاده می‌کنند.

نقطه

دستورات زیر به 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 به شرح زیر است:

  1. نام میزبان dns.google را به عنوان SNI برای هر گونه اتصال به سرویس‌های DoT یا DoH عمومی DNS Google ارسال کنید.
  2. اگر نام میزبانی در دسترس نباشد (مثلاً در برنامه‌ای که DoT فرصت‌طلبانه انجام می‌دهد)، بهتر است آدرس IP را در SNI ارسال کنید تا اینکه آن را خالی بگذارید.
  3. آدرس‌های IPv6 باید به شکل [2001:db8:1234::5678] در هدر Host ظاهر شوند، اما بدون براکت در SNI.

قطع پاسخ DNS

اگرچه Google Public DNS معمولاً پاسخ‌ها به پرس و جوهای DoT و DoH را کوتاه نمی‌کند، دو حالت وجود دارد:

  1. اگر DNS عمومی Google نتواند پاسخ‌های کامل و کوتاه نشده را از سرورهای نام معتبر دریافت کند، پرچم TC را در پاسخ تنظیم می‌کند.

  2. در مواردی که پاسخ DNS (به شکل پیام DNS باینری) از حد 64 کیلوبایت برای پیام‌های TCP DNS فراتر می‌رود، در صورتی که استانداردهای RFC این کار را الزامی کند، ممکن است DNS عمومی Google پرچم TC (قطع) را تنظیم کند.

با این حال، در این موارد، نیازی به تلاش مجدد مشتریان با استفاده از TCP ساده یا هر حمل و نقل دیگری نیست، زیرا نتیجه یکسان خواهد بود.