第 3 课,共 4 课 · 7 分钟
加密 DNS:DoH 与 DoT
两种标准把 DNS 查询包裹进了加密之中。它们真正隐藏了什么、依然没有隐藏什么,以及 macOS 是如何支持它们的。
上一课把一次普通的 DNS 查询比作一张明信片:沿途经手的任何人都能读到它。有两项 IETF 标准,就是为了把这张明信片装进信封:基于 TLS 的 DNS(DoT,RFC 7858)和基于 HTTPS 的 DNS(DoH,RFC 8484)。二者加密的是同一种查询,主要区别在于它们承载查询的方式不同。
基于 TLS 的 DNS
RFC 7858 直接说明了它的目标:“TLS 提供的加密消除了窃听和路径上篡改 DNS 查询的机会”,以此应对“几乎所有 DNS 查询都是未加密发送的,这使得它们容易被攻击者窃听”这一现实。DoT 使用自己专属的端口 853,而不是通常的 53 端口。该 RFC 解释了原因:“建议不在 853 端口之外的 53 端口上使用基于 TLS 的 DNS,是为了避免在选择是否使用 TLS 时产生混淆,并降低降级攻击的风险。”
基于 HTTPS 的 DNS
RFC 8484 采取了不同的路线:“每一对 DNS 查询与应答都被映射为一次 HTTP 交换”,通过普通 HTTPS 流量所使用的同一个 443 端口传输。该 RFC 指出这带来了一个附带的好处:“HTTPS 默认使用的 443 端口,以及能够把 DoH 流量与同一连接上的其他 HTTPS 流量混合在一起,都能阻止不具备特权的路径中间设备干扰 DNS 操作”,因为当一次查询看起来和其他任何网页请求毫无区别时,就更难被单独挑出来加以屏蔽。
| 基于 TLS 的 DNS(DoT) | 基于 HTTPS 的 DNS(DoH) | |
|---|---|---|
| 端口 | 853,专用于 DoT | 443,与普通 HTTPS 流量共用 |
| 在网络上表现为 | 自成一类、独立可辨的流量(容易被识别,若网络愿意,也容易被屏蔽) | 与普通网页浏览流量混在一起 |
加密隐藏了什么,又依然没有隐藏什么
这两种标准都能阻止网络运营商或 Wi-Fi 窃听者在传输途中读取你的查询。但它们都不会对你发送查询的那个解析器隐藏这些查询。RFC 8484 明确指出,DoH 并不会改变服务器本身能看到什么:它指出“DNS 查询和应答的各种传输方式,本身就提供了可用于关联请求的数据”,而且客户端 IP 地址、Cookie 和 TLS 会话信息等普通网页机制意味着,在服务器端,“目前尚未发现 DoH 会引入超出 HTTPS 本身相关问题之外的新隐患”。RFC 7858 同样指出,DoT “并不解决 DNS 中的其他安全问题”,而且“即便消息已加密,处于有利位置的一方仍有可能通过分析消息的时间和大小来窥探出某些细节”。简而言之:加密 DNS 只是把“谁能看到你的查询”这一问题,转移回了你所选择的那个解析器运营者身上,并没有彻底消除可见性。
还有第二个值得了解的漏洞。仅仅加密 DNS 查询,本身并不能隐藏你接下来要连接的是哪个网站:紧随其后的 TLS 握手,通常会以明文形式包含主机名。正如 Cloudflare 对服务器名称指示(SNI)的解释:“SNI 会在 Client Hello 消息中包含主机名,而这正是 TLS 握手的第一步”——发生在加密建立之前。同一来源解释说,一项名为“加密 SNI”(ESNI)的扩展“在 SNI 扩展的基础上,对 Client Hello 中的 SNI 部分进行加密”,从而“阻止客户端与服务器之间的任何窥探者看到客户端请求的是哪张证书”。但隐藏 SNI 的支持依然取决于浏览器和网站双方是否都同意采用,目前还不是每一条连接的标准做法。
macOS 是如何支持它的
Apple 为 Mac、iPhone 和 iPad 记录了一项“DNS 设置”配置,正是用来做这件事的:它能让设备“通过基于 HTTPS 的 DNS 或基于 TLS 的 DNS,把设备的 DNS 查询路由到一台加密的 DNS 服务器”。它以配置描述文件的形式下发,可以通过“补充匹配域名”把加密解析器限定在特定域名范围内,也可以通过能匹配网络 SSID 等条件的“按需规则”,只在特定网络上生效。
要点
- DoT(RFC 7858)用 TLS 在专属的 853 端口上加密 DNS;DoH(RFC 8484)加密 DNS 并通过 HTTPS 常用的 443 端口传输,与其他网页流量混在一起。
- 两者都能阻止网络路径上的窃听者读取你的查询。
- 两者都不会对你发送查询的那个解析器隐藏这些查询:RFC 8484 自己就说,在服务器端,“尚未发现 DoH 会引入超出 HTTPS 本身相关问题之外的新隐患”。
- 即便使用了加密 DNS,网站本身的 TLS 握手通常仍会以明文形式(SNI)暴露其主机名,除非使用了“加密 SNI”这类扩展。
- macOS 和 iOS 通过一项有文档记录的“DNS 设置”配置描述文件支持加密 DNS,可以指定使用 DoH 或 DoT,并将其限定在特定域名或网络范围内。
自我检测
1. 基于 TLS 的 DNS(DoT)使用哪个端口,为什么要用专属端口?
- 80 端口,与 HTTP 相同
- 853 端口,部分原因是为了避免 53 端口的模糊性可能带来的降级攻击 — 正确。
- 25 端口,与电子邮件相同
- 每次随机使用一个端口
RFC 7858 为 DoT 分配了专属的 853 端口,并解释说不在 53 端口上使用它“能降低降级攻击的风险”。
2. 为什么基于 HTTPS 的 DNS(DoH)使用 443 端口?
- 因为这是唯一空闲的端口
- 因为与普通 HTTPS 流量共用 443 端口,让 DoH 更难被单独挑出来加以屏蔽 — 正确。
- 因为 443 端口比其他端口更快
- DoH 并不使用 443 端口
RFC 8484 指出,在 443 端口上把 DoH 与普通 HTTPS 流量混合在一起,“能阻止不具备特权的路径中间设备干扰 DNS 操作”。
3. DoH 或 DoT 会对你发送查询的解析器隐藏你的 DNS 查询吗?
- 会,完全隐藏
- 不会,它们只是对网络路径隐藏了查询,解析器运营者依然能看到这些查询 — 正确。
- 只有 DoH 会对解析器隐藏
- 只有 DoT 会对解析器隐藏
RFC 8484 指出,在服务器端“尚未发现 DoH 会引入超出 HTTPS 本身相关问题之外的新隐患”,也就是说解析器运营者依然能够看到并关联这些查询。
4. 即便使用了加密 DNS,通常还有什么会暴露你正在连接的网站?
- Wi-Fi 密码
- TLS Client Hello 中以明文形式发送的主机名(SNI),除非使用了“加密 SNI”这类扩展 — 正确。
- 你 Mac 的私有 IP 地址
- DNS 解析器的缓存
Cloudflare 解释说,“SNI 会在 Client Hello 消息中包含主机名”,且发生在加密开始之前;“加密 SNI”(ESNI)就是为了隐藏它而设计的,但目前还不是通用做法。
用 FireAI 动手做
在你自己的 Mac 上练习这节课的内容。
来源
- RFC 7858: Specification for DNS over Transport Layer Security (TLS)
- RFC 8484: DNS Queries over HTTPS (DoH)
- Cloudflare Learning: DNS over TLS vs. DNS over HTTPS
- Cloudflare Learning: What is SNI? / Encrypted Client Hello
- Apple Platform Deployment: DNS settings declarative configuration for Apple devices
在你的 Mac 上实践
免费试用全部功能 17 天,无需绑定银行卡。