5月28日 02:21

DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 有什么区别

直接回答

DoH 和 DoT 的核心区别在于传输方式:DoT 用 TLS 直接封装 DNS(端口 853),DoH 把 DNS 塞进 HTTPS 请求(端口 443)。这导致三个关键差异:

  1. 隐蔽性:DoH 流量和普通网页访问无法区分,DoT 端口 853 一眼就能识别
  2. 性能:DoT 协议开销更小,延迟低 2-5ms;DoH 多了 HTTP 头部开销
  3. 可控性:DoT 容易被防火墙拦截但也方便企业审计,DoH 难拦截但也绕过了企业安全策略

追问:那 DNS over QUIC (DoQ) 呢?——DoQ 基于 QUIC/UDP,减少了 TCP 握手延迟,RFC 9250 已发布,是加密 DNS 的下一代候选。

为什么需要加密 DNS

传统 DNS 走 UDP 53 端口,明文传输:

shell
客户端 ──── 明文 UDP 53 ────► DNS 服务器 中间人可窃听/篡改

三个直接威胁:

  • 窃听:ISP 能看到你访问了哪些域名,即使 HTTPS 加密了页面内容
  • 篡改:DNS 响应可以被中间人修改,把你导向钓鱼站点
  • 审查:网络管理员可以按域名过滤,直接返回 NXDOMAIN

加密 DNS 解决的是"查询过程"的隐私和完整性,不解决 DNS 服务器本身的可信度问题。

DoT:TLS 直封装 DNS

协议栈

shell
DNS 查询/响应 TLS 1.2/1.3(加密层) TCP(端口 853

RFC 7858 定义了 DoT 协议,RFC 8310 定义了其使用策略。

通信流程

  1. TCP 三次握手(端口 853)
  2. TLS 握手,协商加密套件,验证服务器证书
  3. 在加密隧道内发送 DNS 查询/接收响应
  4. 连接可复用,后续查询无需重新握手

关键特性

项目DoT
端口853(IANA 专用分配)
传输TCP + TLS
连接复用支持,长连接
协议开销小(仅 TLS 记录层)
流量识别端口 853 易被识别

配置

systemd-resolved(Linux):

ini
[Resolve] DNS=8.8.8.8 8.8.4.4 DNSOverTLS=yes

Android Private DNS

shell
设置 → 网络 → 专用 DNS → dns.google

Windows 11:设置 → 网络 → DNS → 选择 DoT 服务器

DoH:DNS 伪装成 HTTPS

协议栈

shell
DNS 消息(二进制,封装在 HTTP body) HTTP/2(或 HTTP/3) TLS 1.2/1.3 TCP(端口 443

RFC 8484 定义了 DoH 协议。请求和响应体都是 application/dns-message 格式。

通信流程

  1. 与 DoH 服务器建立 HTTPS 连接(端口 443)
  2. 将 DNS 查询编码为二进制消息
  3. 通过 HTTP GET(查询参数 dns)或 POST 发送
  4. 响应体包含 DNS 二进制响应

请求示例

http
POST /dns-query HTTP/2 Host: cloudflare-dns.com Content-Type: application/dns-message Accept: application/dns-message <33 bytes DNS query wire format>
http
HTTP/2 200 Content-Type: application/dns-message Cache-Control: max-age=120 <65 bytes DNS response wire format>

GET 方式:

shell
GET /dns-query?dns=AAABAAAB...base64url... HTTP/2

关键特性

项目DoH
端口443(与 HTTPS 共享)
传输HTTP/2 + TLS(或 HTTP/3)
请求方式GET 或 POST
内容类型application/dns-message
流量识别与普通 HTTPS 无法区分

配置

Firefox

shell
about:config network.trr.mode = 2 # 2=降级模式, 3=仅DoH network.trr.uri = https://cloudflare-dns.com/dns-query

Chrome:设置 → 隐私和安全 → 安全 → 使用安全 DNS

curl 测试

bash
curl -sH 'accept: application/dns-message' \ 'https://cloudflare-dns.com/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE' \ --output - | hexdump -C

核心对比

维度DoTDoH
协议层传输层应用层
端口853443
延迟更低(协议简单)稍高(HTTP 开销)
流量隐蔽性差(专用端口暴露意图)好(混入 HTTPS 流量)
防火墙穿透853 可能被封443 几乎不会被封
企业审计可以识别并审计 DNSDNS 流量混入 Web 日志
部署复杂度低(只需 TLS)中(需要 HTTP/2 服务器)
浏览器支持无(系统级)Firefox/Chrome 原生
系统级支持Android/iOS/Win11依赖浏览器或系统代理
扩展性有限好(HTTP 生态可扩展)
RFC7858 + 83108484

性能实测参考

基于公开基准测试数据:

指标DoTDoHDoQ
首次查询延迟~40ms~55ms~30ms
后续查询(连接复用)~15ms~20ms~12ms
协议开销(每请求)~20 bytes~200+ bytes~15 bytes

DoQ(DNS over QUIC,RFC 9250)基于 UDP,省掉了 TCP 握手,延迟最低。但当前客户端支持最弱。

隐蔽性的两面性

DoH 的隐蔽性是双刃剑:

对个人用户——好事。公共 WiFi 下 ISP 无法知道你在查什么域名,也无法劫持 DNS。

对企业安全团队——麻烦。企业 DNS 策略(恶意域名拦截、内容过滤)依赖中间 DNS 解析器。浏览器默认启用 DoH 后,这些策略直接失效。为此出现了 Canary Domainuse-application-dns.net)机制:企业网络中 DNS 解析该域名返回 NXDOMAIN,浏览器检测到后自动禁用 DoH。

主流服务商

服务商DoHDoT说明
Cloudflarehttps://cloudflare-dns.com/dns-query1.1.1.1:853速度最快,承诺不记录 IP
Googlehttps://dns.google/dns-query8.8.8.8:853稳定,全球节点
Quad9https://dns.quad9.net/dns-query9.9.9.9:853恶意域名拦截
阿里https://dns.alidns.com/dns-query223.5.5.5:853国内延迟低
DNSPodhttps://doh.pub/dns-query腾讯旗下

选择决策

shell
需要绕过 DNS 审查/劫持? ── 是 → DoH 企业环境需审计 DNS? ───── 是 → DoT 追求最低延迟? ────────── 是 → DoT(或 DoQ) 浏览器直接用,不想配系统? ─ DoH

实际经验:

  • 个人日常用 DoH,浏览器开箱即用
  • 服务器/运维用 DoT,协议简洁、开销小、日志清晰
  • 移动端网络多变,DoH 在受限网络中更可靠
  • 中国网络环境下 DoT 端口 853 可能被运营商 QoS 降速,DoH 更稳定

补充:DNS over QUIC (DoQ)

DoQ(RFC 9250)是加密 DNS 的新选项:

  • 基于 QUIC(UDP),消除 TCP 队头阻塞
  • 0-RTT 恢复连接,延迟接近传统 UDP DNS
  • 端口 853(与 DoT 共用,通过 ALPN 协商区分)
  • 当前支持有限,AdGuard DNS 已部署

DoQ 没有替代 DoH/DoT,而是三者并存:DoT 走系统级、DoH 走浏览器、DoQ 追求性能。

标签:DNS