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 mã hoá, khiến chúng trở thành mục tiêu bị giám sát, giả mạo và lọc qua Internet dựa trên DNS. Phản hồi cho khách hà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ì tin nhắn có thể truyền qua nhiều mạng, trong khi tin nhắn giữa trình phân giải đệ quy và máy chủ định danh có thẩm quyền thường kết hợp biện pháp bảo vệ bổ sung.
Để giải quyết những vấn đề này, vào năm 2016, chúng tôi đã triển khai DNS-over-HTTPS (hiện được gọi là DoH) cung cấp quy trình phân giải DNS xác thực DNSSEC được mã hoá qua HTTPS và QUIC. Và trong năm 2019, chúng tôi đã hỗ trợ thêm cho tiêu chuẩn DNS qua TLS (DoT) mà tính năng DNS riêng của Android.
DoH và DoT 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 DNSSEC cho Google Public để cung cấp hệ thống hoàn chỉnh DNS đã xác thực cho những miền có chữ ký DNSSEC. Với DNS Google Public, chúng tôi cam kết cung cấp giải pháp phân giải DNS nhanh, riêng tư và bảo mật cho cả 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 sớm hơn phiên bản TLS hoặc SSL đều được hỗ trợ. Chỉ bộ thuật toán mật mã có cơ chế bảo mật chuyển tiếp và Mã hoá xác thực với dữ liệu bổ sung (AEAD) đều được hỗ trợ. 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
DNS của Google Public 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 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 có loại nội dung application/dns-message. - Để GET, địa chỉ này là
https://dns.google/dns-query?dns=
BASE64URL_OF_QUERY.
- Đối với POST, URL chỉ là
API JSON –
https://dns.google/resolve{?name}{&type,cd,do,…}
- Thêm tham số GET được mô tả trên
trang API JSON.
Chỉ có tham số
name
là bắt buộc.
- Thêm tham số GET được mô tả trên
trang API JSON.
Chỉ có tham số
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 ở chế độ riêng tư” của 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 tính nă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ụ dòng lệnh sau không nhằm sử dụng trong ứng dụng thực tế và chỉ là những minh hoạ sử dụng các công cụ chẩn đoán thông dụng.
DoT
Các lệnh sau yêu cầu Knot DNS kdig
2.3.0 trở lên; với 2.7.4 hoặc
sau đó, huỷ nhận xét về +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
với trường mã DNS được đặt thành 0, theo khuyến nghị
theo RFC 8484 mục 4.1. Lệnh shell sẽ gửi truy vấn DNS đó dưới dạng
nội dung nội dung của dữ liệu nhị phân, sử dụng 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"
TẢI RFC 8484
Chuỗi được mã hoá Base64Url trong lệnh này là thông báo DNS do
dig +noedns example.com A
với trường mã DNS được đặt thành 0. Trong trường hợp này,
được chuyển 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
Thao tác này 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à SNI cho URL địa chỉ IP
TLS 1.3 yêu cầu các ứng dụng cung cấp Nhận dạng tên máy chủ (SNI).
Đuôi SNI chỉ định rằng thông tin SNI là miền DNS (chứ không phải địa chỉ IP):
"Tên máy chủ" chứa tên máy chủ DNS đủ điều kiện của máy chủ, theo cách mà khách hàng hiểu. Tên máy chủ được biểu thị dưới dạng chuỗi byte sử dụng 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ế hoá 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, Phần 2.3.2.4.
Không được phép sử dụng địa chỉ IPv4 và IPv6 theo nghĩa đen trong "HostName".
Những yêu cầu này có thể khó đáp ứng đối với những đơn đăng ký của Bộ Quốc phòng và Bộ Môi trường (DoH) muốn tận dụng các cải tiến về bảo mật trong TLS 1.3. DNS Google Public hiện tại chấp nhận các kết nối TLS 1.3 không cung cấp SNI, nhưng chúng tôi có thể cần phải thay đổi điều này vì lý do vận hành hoặc bảo mật trong tương lai.
Sau đây là một số đề xuất của chúng tôi đối với các ứng dụng của DoT hoặc DoH liên quan đến SNI:
- Gửi tên máy chủ dns.google dưới dạng SNI cho mọi kết nối đến Google Public Dịch vụ DNS DoT hoặc DoH.
- 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 SNI hơn là hơn là để trống trường này.
- Địa chỉ IPv6 phải xuất hiện ở dạng
[2001:db8:1234::5678]
trong dấu ngoặc vuông trong tiêu đềHost
nhưng không có dấu ngoặc trong SNI.
Rút ngắn phản hồi DNS
Mặc dù DNS Google Public thường không cắt ngắn phản hồi cho DoT và DoH thì có hai trường hợp:
Nếu Google Public DNS không thể nhận được phản hồi hoàn chỉnh và không bị cắt bớt từ máy chủ định danh có thẩm quyền, công cụ này sẽ đặt cờ TC trong phản hồi.
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 đối với thông báo DNS của TCP, DNS Google Public có thể đặt giá trị Gắn cờ TC (cắt bớt) nếu tiêu chuẩn RFC yêu cầu phải thực hiện việc này.
Tuy nhiên, trong những trường hợp này, máy khách không cần thử lại bằng TCP thuần tuý hoặc bất kỳ phương pháp vận chuyển nào khác, vì kết quả đều giống nhau.