Truyền tải an toàn cho DNS

Các truy vấn và phản hồi DNS truyền thống được gửi qua UDP hoặc TCP mà không cần mã hoá, khiến những truy vấn và phản hồi này bị giám sát, giả mạo và lọc Internet dựa trên DNS. Phản hồi cho các ứng dụng từ các trình phân giải công khai như Google Public DNS đặc biệt dễ bị tấn công vì thông báo có thể đi qua nhiều mạng, trong khi thông báo giữa trình phân giải đệ quy và máy chủ định danh đáng tin cậy thường kết hợp các biện pháp bảo vệ bổ sung.

Để giải quyết những vấn đề này, trong năm 2016, chúng tôi ra mắt DNS qua HTTPS (nay gọi là DoH) cung cấp quá trình phân giải DNS xác thực DNSSEC đã mã hoá qua HTTPS và QUIC. Năm 2019, chúng tôi bổ sung dịch vụ hỗ trợ cho DNS qua tiêu chuẩn TLS (DoT) mà tính năng DNS riêng của Android sử dụng.

DoH và DoT giúp tăng cường quyền riêng tư và tính bảo mật giữa ứng dụng và trình phân giải, bổ sung tính năng xác thực DNS Google Public của DNSSEC để cung cấp DNS xác thực hai đầu cho các miền có chữ ký DNSSEC. Với Google Public DNS, chúng tôi cam kết cung cấp quá trình phân giải DNS nhanh chóng, riêng tư và bảo mật cho cả ứng dụng DoH và DoT.

Các phiên bản TLS và bộ mã hoá được hỗ trợ

Google Public DNS hỗ trợ TLS 1.2 và TLS 1.3 cho cả DoH và DoT; không có phiên bản TLS hoặc SSL nào trước đây được hỗ trợ. Chỉ hỗ trợ bộ thuật toán mật mã có khả năng bảo mật chuyển tiếp và Mã hoá đã xác thực với dữ liệu bổ sung (AEAD). Qualys SSL Labs hiển thị tập hợp bộ thuật toán mật mã được hỗ trợ hiện tại.

Điểm cuối

Google Public DNS sử dụng các điểm cuối sau đây cho DoH và DoT:

DoT (cổng 853) dns.google

Mẫu URI DoH (cổng 443)

  • RFC 8484 – https://dns.google/dns-query{?dns}

    • Đối với yêu cầu POST, URL chỉ là https://dns.google/dns-query và phần nội dung của yêu cầu HTTP là tải trọng DNS UDP nhị phân với loại nội dung ứng dụng/dns-message.
    • Đối với GET, đây là https://dns.google/dns-query?dns=BASE64URL_OF_QUERY.
  • API JSON – https://dns.google/resolve{?name}{&type,cd,do,…}

    • Bạn có thể xem thêm các tham số GET trên trang JSON API. Bạn chỉ cần có tham số name.

Khách hàng

Có một số ứng dụng khách sử dụng DoT hoặc DoH

  • Tính năng “Duyệt web riêng tư” trên Android 9 (Pie) – DoT
  • Intra (ứng dụng Android) – DoH

Trang web dnsprivacy.org liệt kê một số ứng dụng khác cho DoT và DoH, nhưng những ứng dụng này thường yêu cầu cấu hình kỹ thuật ở mức vừa phải.

Ví dụ về dòng lệnh

Các ví dụ về dòng lệnh sau đây không nhằm mục đích sử dụng trong ứng dụng thực tế và chỉ là hình minh hoạ sử dụng các công cụ chẩn đoán thường có.

DoT

Các lệnh sau yêu cầu Knot DNS kdig 2.3.0 trở lên; với phiên bản 2.7.4 trở lên, hãy huỷ nhận xét để +tls‑sni gửi SNI theo yêu cầu của 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

BÀI ĐĂNG RFC 8484

Chuỗi được mã hoá Base64Url trong lệnh này là thông báo DNS do dig +noedns example.test A gửi với trường mã nhận dạng DNS được đặt thành 0, theo đề xuất của RFC 8484 phần 4.1. Lệnh shell gửi truy vấn DNS đó dưới dạng nội dung nội dung dữ liệu nhị phân, sử dụng application/dns-message Content-Type.

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 TẢI

Chuỗi được mã hoá Base64Url trong lệnh này là thông báo DNS do dig +noedns example.com A gửi với trường mã DNS được đặt thành 0. Trong trường hợp này, thông số sẽ được chuyển một cách rõ ràng vào 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"

TẢI JSON

Việc này sẽ sử dụng API JSON cho 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 và DEX cho các URL địa chỉ IP

TLS 1.3 yêu cầu ứng dụng phải cung cấp tính năng Nhận dạng tên máy chủ (SNI).

Tiện ích SNI chỉ định rằng thông tin DEX là miền DNS (chứ không phải địa chỉ IP):

"HostName" chứa tên máy chủ DNS đủ điều kiện của máy chủ, như được ứng dụng hiểu. Tên máy chủ được biểu thị dưới dạng chuỗi byte bằng cách sử dụng bộ mã hoá ASCII mà không có dấu chấm ở cuối. Điều này cho phép hỗ trợ tên miền quốc tế thông qua việc sử dụng nhãn A được xác định trong RFC5890. Tên máy chủ DNS không phân biệt chữ hoa chữ thường. Thuật toán so sánh tên máy chủ được mô tả trong RFC5890, Mục 2.3.2.4.

Không được sử dụng các địa chỉ IPv4 và IPv6 (có nghĩa là IPv4 và IPv6) trong "HostName".

Những yêu cầu này có thể khó đáp ứng đối với các ứng dụng DoH hoặc DoT muốn tận dụng các điểm cải tiến về bảo mật trong TLS 1.3. DNS Google Public hiện chấp nhận các kết nối TLS 1.3 không cung cấp OpenSSL, nhưng chúng tôi có thể cần thay đổi điều này vì lý do hoạt động hoặc bảo mật trong tương lai.

Sau đây là các đề xuất của chúng tôi đối với ứng dụng DoT hoặc DoH liên quan đến DEX:

  1. Gửi tên máy chủ dns.google dưới dạng DDEX cho mọi kết nối đến các dịch vụ DoT hoặc DoH của DNS Google Public.
  2. Nếu không có tên máy chủ nào (ví dụ: trong một ứng dụng đang thực hiện DoT cơ hội), bạn nên gửi địa chỉ IP trong SafeFrame thay vì để trống.
  3. Các địa chỉ IPv6 phải xuất hiện ở dạng dấu ngoặc [2001:db8:1234::5678] trong tiêu đề Host, nhưng không có dấu ngoặc trong DEX.

Rút ngắn phản hồi DNS

Mặc dù DNS Google Public thường không cắt bớt các phản hồi cho các truy vấn DoT và DoH, nhưng có hai trường hợp trong trường hợp này:

  1. Nếu DNS Google Public không thể nhận phản hồi hoàn chỉnh và chưa bị cắt bớt từ các máy chủ định danh đáng tin cậy, thì DNS sẽ đặt cờ TC trong phản hồi.

  2. Trong trường hợp phản hồi DNS (ở dạng thông báo DNS nhị phân) vượt quá giới hạn 64 KiB cho các thông báo DNS TCP, Google Public DNS có thể đặt cờ TC (cắt bớt) nếu các tiêu chuẩn RFC yêu cầu làm như vậy.

Tuy nhiên, trong những trường hợp này, ứng dụng không cần phải thử lại bằng TCP thuần tuý hoặc bất kỳ phương thức truyền tải nào khác, vì kết quả sẽ giống nhau.