bigywater.tech
网络协议 · 72

DoT 与 DoH:加密 DNS 与它们的代价

DNS 默认是明文的,路径上的任何设备都能看到你查了什么,也能抢先给你一个假答案。DoT 和 DoH 把 DNS 放进 TLS 里。这篇测它到底挡住了什么、没挡住什么、新建一次连接要多花多少,也记录了在这个网络里主流的海外加密 DNS 根本连不上。

5 / 5 超时
五个海外公共解析器 DoT 端点(Cloudflare ×2、Google、Quad9、AdGuard)中 TCP 连接超时的个数;阿里 223.5.5.5 连得上
80 → 8.6 ms
DoT 新建连接与复用连接的耗时中位数(UDP 53 为 11.4 ms)
2 包 → 20 包
一次问答在线上的 IP 包数:UDP 53 与 DoH 新连接

能不能连上

实测 · 本机执行输出
  Cloudflare DoT         1.1.1.1:853:TCP 连接失败(TimeoutError,4002 ms)
  Cloudflare DoT         1.0.0.1:853:TCP 连接失败(TimeoutError,4001 ms)
  Google DoT             8.8.8.8:853:TCP 连接失败(TimeoutError,4002 ms)
  Quad9 DoT              9.9.9.9:853:TCP 连接失败(TimeoutError,4003 ms)
  AdGuard DoT            94.140.14.14:853:TCP 连接失败(TimeoutError,4007 ms)
  阿里 DoT                 223.5.5.5:853:TCP 连上 9 ms,TLS 握手成功 13 ms(TLSv1.3)
  Cloudflare DoH         1.1.1.1:443:TCP 连接失败(TimeoutError,4002 ms)
  Google DoH             8.8.8.8:443:TCP 连接失败(TimeoutError,4008 ms)
  Quad9 DoH              9.9.9.9:443:TCP 连接失败(TimeoutError,4002 ms)
  阿里 DoH                 223.5.5.5:443:TCP 连上 10 ms,TLS 握手成功 13 ms(TLSv1.3)
  对照:example.com 的 HTTPS 104.20.23.154:443:TCP 连上 185 ms,TLS 握手成功 195 ms(TLSv1.3)
  结论只限于这台机器所在的网络:能握手的才能拿来做后面的对比,所以后面用阿里的 223.5.5.5(UDP 53、DoT、DoH 都通)

这个网络里 Cloudflare、Google、Quad9、AdGuard 的 DoT 和 DoH 都超时;阿里 223.5.5.5 通。结论只限这个网络。

耗时

实测 · 本机执行输出
  UDP 53                          :[13.9, 11.4, 11.3, 10.2, 12.0, 9.0] ms,中位 11.4 ms
  DoT 新连接(TCP+TLS+查询)             :[79.1, 86.6, 41.3, 65.0, 83.3, 81.2] ms,中位 80.2 ms
  DoT 复用连接                        :[7.1, 8.2, 9.1, 8.2, 10.7, 11.5] ms,中位 8.6 ms
  DoH 新连接(TCP+TLS+HTTP+查询)        :[79.3, 82.3, 81.2, 81.9, 78.4, 88.9] ms,中位 81.5 ms
  DoH 复用连接                        :[58.8, 60.0, 58.3, 66.9, 58.3, 59.5] ms,中位 59.2 ms
  DoH 复用连接(按 IP 连,不发 SNI)         :[8.3, 7.0, 7.5, 11.3, 10.2, 9.0] ms,中位 8.6 ms
  DoH 响应:HTTP 200,头 [('Cache-Control', 'max-age=8'), ('Content-Type', 'application/dns-message')];DNS 响应体 72 字节;DNS 里 A 记录的 TTL = [8]

新建连接约 80 ms,复用连接约 8.6 ms,与 UDP 相当;DoH 带 SNI 复用比按 IP 连慢 50 ms,原因没查明。

连接细节

实测 · 本机执行输出
  端口 853:TLSv1.3,套件 TLS_AES_128_GCM_SHA256,ALPN 协商结果 None;证书主体 *.alidns.com,签发者 GlobalSign nv-sa,有效期 Dec  1 12:41:16 2025 GMT ~ Jan  2 12:41:15 2027 GMT;SAN 共 18 项,含本 IP True
  端口 443:TLSv1.3,套件 TLS_AES_128_GCM_SHA256,ALPN 协商结果 h2;证书主体 *.alidns.com,签发者 GlobalSign nv-sa,有效期 Dec  1 12:41:16 2025 GMT ~ Jan  2 12:41:15 2027 GMT;SAN 共 18 项,含本 IP True

TLS 1.3;DoH 协商 h2;证书的 SAN 里有服务器 IP,可以只用 IP 连接并验证。

观察者能看到什么

实测 · 本机执行输出
  UDP 53 :2 个 IP 包,共 211 字节(上行 66 / 下行 145);包含查询名字(随机的第一段标签)明文的包 2 个;包里能找到服务器名 "dns.alidns.com"(TLS 的 SNI)的:否
  DoT    :21 个 IP 包,共 6758 字节(上行 2175 / 下行 4583);包含查询名字(随机的第一段标签)明文的包 0 个;包里能找到服务器名 "dns.alidns.com"(TLS 的 SNI)的:是
  DoH    :20 个 IP 包,共 7172 字节(上行 2321 / 下行 4851);包含查询名字(随机的第一段标签)明文的包 0 个;包里能找到服务器名 "dns.alidns.com"(TLS 的 SNI)的:是
  UDP 53 把名字原样暴露给路径上的任何设备;DoT / DoH 的名字被加密,但目标 IP、端口、TLS 的 SNI(服务器名)、包的大小和时间仍然可见

名字被加密,但服务器 IP、SNI、包大小和时间仍然可见。

答案是否真实

实测 · 本机执行输出
  www.bbc.co.uk:
    1.1.1.1 UDP 53    :    45 ms,A 记录 ['31.13.85.2']
    223.5.5.5 UDP 53  :    17 ms,A 记录 ['157.240.20.18']
    223.5.5.5 DoT     :   158 ms,A 记录 ['199.59.148.7']
    223.5.5.5 DoH     :   118 ms,A 记录 ['157.240.20.18']
  example.com:
    1.1.1.1 UDP 53    :   293 ms,A 记录 ['104.20.23.154', '172.66.147.243']
    223.5.5.5 UDP 53  :    12 ms,A 记录 ['104.20.23.154', '172.66.147.243']
    223.5.5.5 DoT     :    53 ms,A 记录 ['104.20.23.154', '172.66.147.243']
    223.5.5.5 DoH     :    90 ms,A 记录 ['104.20.23.154', '172.66.147.243']

www.bbc.co.uk 经加密传输拿到的答案与明文同类且每次不同;加密不能保证上游答案真实。

分步演示

DoT 与 DoH
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64(Apple 芯片)/ Python 3.14.8 / tcpdump(libpcap)/ scapy 2.8 / dpkt / dnspython / h2 / aioquic / OpenSSL / curl 8.7.1;抓包在 lo0(环回)上做,少数实验用真实网卡 en0(这台机器上 en0 是 Wi-Fi,tcpdump 看到的是系统转成以太网格式的帧,所以文中的“以太网头”都指这个 14 字节的头)或访问公网(会在文章里注明);需要丢包 / 延迟 / 限速时,用一个只作用于 lo0 端口 9400-9499 的 dummynet 辅助脚本(netlab);所有服务端都是本机自己起的进程;时间戳取自 tcpdump 的 -tt,数字每次运行会有小幅抖动。向 223.5.5.5 发起 UDP 53、DoT、DoH 查询,用 en0 抓包;DoH 用 HTTP/1.1 POST 测耗时(ALPN 协商是 h2,但没有用 HTTP/2 测);DoH 复用连接带 SNI 慢的原因没有查明;“海外加密 DNS 连不上”的结论只限这台机器所在的网络,原因没有查
    • 没有验证:HTTP/2 上的 DoH;GET 方式的 DoH(?dns= base64url);DoH 的 padding(RFC 8467)与长度隐藏;加密 ClientHello(ECH)能否隐藏 SNI;DNS over QUIC(DoQ);客户端证书校验失败 / 被中间人替换的行为;阿里解析器上游为什么给出异常答案
    京ICP备2026067502号-1京公网安备11010502063487号