DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 有什么区别
直接回答
DoH 和 DoT 的核心区别在于传输方式:DoT 用 TLS 直接封装 DNS(端口 853),DoH 把 DNS 塞进 HTTPS 请求(端口 443)。这导致三个关键差异:
- 隐蔽性:DoH 流量和普通网页访问无法区分,DoT 端口 853 一眼就能识别
- 性能:DoT 协议开销更小,延迟低 2-5ms;DoH 多了 HTTP 头部开销
- 可控性: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
协议栈
shellDNS 查询/响应 │ TLS 1.2/1.3(加密层) │ TCP(端口 853)
RFC 7858 定义了 DoT 协议,RFC 8310 定义了其使用策略。
通信流程
- TCP 三次握手(端口 853)
- TLS 握手,协商加密套件,验证服务器证书
- 在加密隧道内发送 DNS 查询/接收响应
- 连接可复用,后续查询无需重新握手
关键特性
| 项目 | 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
协议栈
shellDNS 消息(二进制,封装在 HTTP body) │ HTTP/2(或 HTTP/3) │ TLS 1.2/1.3 │ TCP(端口 443)
RFC 8484 定义了 DoH 协议。请求和响应体都是 application/dns-message 格式。
通信流程
- 与 DoH 服务器建立 HTTPS 连接(端口 443)
- 将 DNS 查询编码为二进制消息
- 通过 HTTP GET(查询参数
dns)或 POST 发送 - 响应体包含 DNS 二进制响应
请求示例
httpPOST /dns-query HTTP/2 Host: cloudflare-dns.com Content-Type: application/dns-message Accept: application/dns-message <33 bytes DNS query wire format>
httpHTTP/2 200 Content-Type: application/dns-message Cache-Control: max-age=120 <65 bytes DNS response wire format>
GET 方式:
shellGET /dns-query?dns=AAABAAAB...base64url... HTTP/2
关键特性
| 项目 | DoH |
|---|---|
| 端口 | 443(与 HTTPS 共享) |
| 传输 | HTTP/2 + TLS(或 HTTP/3) |
| 请求方式 | GET 或 POST |
| 内容类型 | application/dns-message |
| 流量识别 | 与普通 HTTPS 无法区分 |
配置
Firefox:
shellabout:config network.trr.mode = 2 # 2=降级模式, 3=仅DoH network.trr.uri = https://cloudflare-dns.com/dns-query
Chrome:设置 → 隐私和安全 → 安全 → 使用安全 DNS
curl 测试:
bashcurl -sH 'accept: application/dns-message' \ 'https://cloudflare-dns.com/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE' \ --output - | hexdump -C
核心对比
| 维度 | DoT | DoH |
|---|---|---|
| 协议层 | 传输层 | 应用层 |
| 端口 | 853 | 443 |
| 延迟 | 更低(协议简单) | 稍高(HTTP 开销) |
| 流量隐蔽性 | 差(专用端口暴露意图) | 好(混入 HTTPS 流量) |
| 防火墙穿透 | 853 可能被封 | 443 几乎不会被封 |
| 企业审计 | 可以识别并审计 DNS | DNS 流量混入 Web 日志 |
| 部署复杂度 | 低(只需 TLS) | 中(需要 HTTP/2 服务器) |
| 浏览器支持 | 无(系统级) | Firefox/Chrome 原生 |
| 系统级支持 | Android/iOS/Win11 | 依赖浏览器或系统代理 |
| 扩展性 | 有限 | 好(HTTP 生态可扩展) |
| RFC | 7858 + 8310 | 8484 |
性能实测参考
基于公开基准测试数据:
| 指标 | DoT | DoH | DoQ |
|---|---|---|---|
| 首次查询延迟 | ~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 Domain(use-application-dns.net)机制:企业网络中 DNS 解析该域名返回 NXDOMAIN,浏览器检测到后自动禁用 DoH。
主流服务商
| 服务商 | DoH | DoT | 说明 |
|---|---|---|---|
| Cloudflare | https://cloudflare-dns.com/dns-query | 1.1.1.1:853 | 速度最快,承诺不记录 IP |
https://dns.google/dns-query | 8.8.8.8:853 | 稳定,全球节点 | |
| Quad9 | https://dns.quad9.net/dns-query | 9.9.9.9:853 | 恶意域名拦截 |
| 阿里 | https://dns.alidns.com/dns-query | 223.5.5.5:853 | 国内延迟低 |
| DNSPod | https://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 追求性能。