默认情况下,DNS 是通过明文连接发送的。DNS over TLS (DoT) 是一种在加密连接上发送 DNS 查询的方法。Cloudflare 在标准端口 853 上支持 DNS over TLS,并符合 RFC 7858 ↗。
DoT 将标准的 DNS 流量包裹在 TLS 加密的 TCP 连接中。这可以防止位于您的设备和解析器之间的任何人读取或修改您的 DNS 查询。
Cloudflare 在端口 853 上的 1.1.1.1、1.0.0.1 以及对应的 IPv6 地址(2606:4700:4700::1111 和 2606:4700:4700::1001)上支持 DNS over TLS (DoT)。如果您的 DoT 客户端不支持 IP 地址,还可以通过主机名 one.one.one.one 访问 Cloudflare 的 DoT 端点。
存根解析器 (stub resolver) 是您设备上的 DNS 客户端软件,它向 DNS 解析器发送查询。使用 DoT 时,存根解析器通过 TLS 连接与解析器建立连接:
- 在连接之前,DNS 存根解析器会存储 1.1.1.1 的 TLS 证书指纹。该指纹是证书公钥信息的 base64 编码 SHA-256 哈希值,被称为主体公钥信息 (SPKI) 固定销 (pin)。存根解析器使用此 pin 来验证其连接的是真实的 1.1.1.1 服务器。
- DNS 存根解析器与
1.1.1.1:853建立 TCP 连接。 - DNS 存根解析器发起 TLS 握手——在此过程中,双方就加密参数达成一致,且客户端验证服务器的身份。
- 在 TLS 握手中,1.1.1.1 出示其 TLS 证书。
- TLS 连接建立后,DNS 存根解析器即可在加密连接上发送 DNS,从而防止窃听和篡改。
- 在 TLS 连接上发送的所有 DNS 查询必须符合通过 TCP 发送 DNS ↗ 的规范。
kdig -d @1.1.1.1 +tls-ca +tls-host=one.one.one.one example.com
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(1.1.1.1), port(853), protocol(TCP)
;; DEBUG: TLS, imported 138 system certificates
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG: #1, C=US,ST=California,L=San Francisco,O=Cloudflare\, Inc.,CN=cloudflare-dns.com
;; DEBUG: SHA-256 PIN: GP8Knf7qBae+aIfythytMbYnL+yowaWVeD6MoLHkVRg=
;; DEBUG: #2, C=US,O=DigiCert Inc,CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1
;; DEBUG: SHA-256 PIN: e0IRz5Tio3GA1Xs4fUVWmH1xHDiH2dMbVtCBSkOIdqM=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, The certificate is trusted.
;; TLS session (TLS1.3)-(ECDHE-X25519)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 3395
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1
;; EDNS PSEUDOSECTION:
;; Version: 0; flags: ; UDP size: 1232 B; ext-rcode: NOERROR
;; PADDING: 408 B
;; QUESTION SECTION:
;; example.com. IN A
;; ANSWER SECTION:
example.com. 75897 IN A 93.184.216.34
;; Received 468 B
;; Time 2023-06-23 18:05:42 PDT
;; From 1.1.1.1@853(TCP) in 12.1 msCloudflare 的 DNS over TLS 支持 TLS 1.3 和 TLS 1.2。