DoH 和 DoT 概述
DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 都是为了解决传统 DNS 的安全问题而设计的加密 DNS 协议。它们通过加密 DNS 查询和响应,防止中间人攻击、窃听和 DNS 劫持。
为什么需要加密 DNS
传统 DNS 的安全问题
shell┌─────────┐ 明文 UDP 53 ┌─────────┐ │ 客户端 │ ◄──────────────────► │ DNS 服务器│ └─────────┘ └─────────┘ ↑ 中间人可以窃听和篡改
风险:
- DNS 查询被窃听,暴露用户访问的网站
- DNS 响应被篡改,导致访问钓鱼网站
- ISP 可以记录和分析用户的 DNS 查询
DNS over TLS (DoT)
工作原理
DoT 使用 TLS 协议 加密 DNS 查询,在标准 DNS 协议之上添加 TLS 加密层。
shell┌─────────┐ TLS 加密隧道 ┌─────────┐ │ 客户端 │ ◄──────────────────► │ DoT 服务器│ │ │ 端口 853 │ │ └─────────┘ └─────────┘
协议栈:
shell应用层: DNS 查询/响应 传输层: TLS 加密 网络层: TCP
技术特点
| 特性 | 说明 |
|---|---|
| 传输协议 | TCP |
| 端口 | 853(专用端口) |
| 加密方式 | TLS 1.2 或 TLS 1.3 |
| 证书验证 | 需要验证服务器证书 |
通信流程
shell1. 客户端与 DoT 服务器建立 TCP 连接(端口 853) 2. 进行 TLS 握手,协商加密参数 3. 验证服务器证书 4. 在加密隧道中发送 DNS 查询 5. 接收加密的 DNS 响应
配置示例
systemd-resolved 配置:
ini[Resolve] DNS=8.8.8.8 8.8.4.4 DNSOverTLS=yes
Android 配置(Private DNS):
shell专用 DNS 提供商主机名: dns.google
DNS over HTTPS (DoH)
工作原理
DoH 将 DNS 查询封装在 HTTPS 请求 中,使用标准的 HTTP/2 协议传输。
shell┌─────────┐ HTTPS 请求/响应 ┌─────────┐ │ 客户端 │ ◄──────────────────► │ DoH 服务器│ │ │ 端口 443 │ │ └─────────┘ └─────────┘
协议栈:
shell应用层: DNS 消息(封装在 HTTP body 中) 传输层: HTTP/2 安全层: TLS 1.2/1.3 网络层: TCP
技术特点
| 特性 | 说明 |
|---|---|
| 传输协议 | HTTP/2 over TLS |
| 端口 | 443(与 HTTPS 相同) |
| 请求方法 | GET 或 POST |
| 内容类型 | application/dns-message |
通信流程
shell1. 客户端与 DoH 服务器建立 HTTPS 连接(端口 443) 2. 将 DNS 查询编码为 DNS 消息格式 3. 通过 HTTP POST 或 GET 发送请求 4. 服务器返回包含 DNS 响应的 HTTP 响应 5. 客户端解析 HTTP body 中的 DNS 响应
请求示例
POST 请求:
httpPOST /dns-query HTTP/1.1 Host: cloudflare-dns.com Content-Type: application/dns-message Content-Length: 33 <binary DNS query message>
响应:
httpHTTP/1.1 200 OK Content-Type: application/dns-message Content-Length: 65 <binary DNS response message>
配置示例
Firefox 配置:
shellabout:config network.trr.mode = 2 network.trr.uri = https://cloudflare-dns.com/dns-query
Chrome 配置:
shell设置 → 隐私和安全 → 安全 → 使用安全 DNS 选择: Cloudflare (1.1.1.1)
DoH vs DoT 详细对比
| 对比项 | DoT | DoH |
|---|---|---|
| 协议层 | 传输层(TLS) | 应用层(HTTPS) |
| 端口 | 853(专用) | 443(与 HTTPS 共享) |
| 流量特征 | 容易被识别为 DNS 流量 | 与正常 HTTPS 流量混合 |
| 部署难度 | 较简单 | 需要 HTTP 服务器支持 |
| 性能 | 略优(协议开销小) | 略差(HTTP 开销) |
| 防火墙穿透 | 可能被企业防火墙阻止 | 难以被阻止(与 HTTPS 相同) |
| 日志记录 | 专门的 DNS 日志 | 混合在 Web 访问日志中 |
各自的优缺点
DoT 的优点
✅ 协议简单:直接在 DNS 上添加 TLS 层 ✅ 性能较好:协议开销小,延迟低 ✅ 专用端口:清晰的流量划分 ✅ 易于监控:网络管理员可以区分 DNS 流量
DoT 的缺点
❌ 易被识别:专用端口 853 容易被防火墙阻止 ❌ 隐私性较差:ISP 可以知道你在使用加密 DNS ❌ 企业环境受限:可能被企业安全策略阻止
DoH 的优点
✅ 隐蔽性强:流量与正常 HTTPS 无法区分 ✅ 防火墙友好:端口 443 通常开放 ✅ 易于部署:复用现有 Web 基础设施 ✅ 隐私保护:ISP 无法区分 DNS 查询和 Web 访问
DoH 的缺点
❌ 协议复杂:需要 HTTP/2 协议栈 ❌ 性能开销:HTTP 头部增加额外开销 ❌ 难以监控:企业网络管理员无法审计 DNS 查询 ❌ 日志混合:DNS 日志与 Web 日志混合
主流 DoH/DoT 服务商
| 服务商 | DoH 地址 | DoT 地址 | 特点 |
|---|---|---|---|
| Cloudflare | https://cloudflare-dns.com/dns-query | 1.1.1.1:853 | 速度快,隐私优先 |
| 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 | - | 腾讯旗下 |
如何选择 DoH 还是 DoT
选择 DoT 的场景
- 企业网络环境,需要监控 DNS 流量
- 追求最佳性能,减少协议开销
- 网络管理员需要审计 DNS 查询
- 防火墙策略允许 853 端口
选择 DoH 的场景
- 公共 WiFi 等不可信网络
- 需要绕过 DNS 审查或劫持
- 追求最高隐私保护
- 企业防火墙阻止了 853 端口
实际建议
shell个人用户(隐私优先): DoH 企业用户(管理需求): DoT 移动设备(网络多变): DoH 服务器环境(性能优先): DoT
面试常见问题
Q: DoH 和 HTTPS 有什么区别?
A: DoH 是使用 HTTPS 作为传输层来传输 DNS 消息。普通 HTTPS 传输的是 Web 内容(HTML、JS 等),而 DoH 传输的是 DNS 查询和响应消息(二进制格式)。
Q: 为什么 DoH 比 DoT 更难被防火墙阻止?
A: 因为 DoH 使用标准的 HTTPS 端口 443,流量特征与普通 Web 访问完全相同。而 DoT 使用专用端口 853,容易被识别和阻止。
Q: DoH/DoT 能完全防止 DNS 劫持吗?
A: 能防止传输过程中的劫持和窃听,但不能防止以下情况:
- 客户端被恶意软件篡改配置
- DoH/DoT 服务器本身被攻击
- 本地 hosts 文件被修改
总结
| 方面 | DoT | DoH |
|---|---|---|
| 核心协议 | TLS | HTTPS |
| 最佳场景 | 企业网络、性能优先 | 隐私保护、绕过审查 |
| 部署难度 | 低 | 中 |
| 隐私保护 | 良 | 优 |
| 性能 | 优 | 良 |
| 防火墙穿透 | 差 | 优 |
趋势:目前 DoH 更受浏览器厂商青睐(Firefox、Chrome 默认支持),而 DoT 更受系统级和网络设备厂商支持。两者都是加密 DNS 的有效方案,选择取决于具体场景需求。