DNS over HTTPS:让域名解析不再"裸奔"
一、先聊聊 DNS:互联网的"电话簿"
当你在浏览器输入 www.baidu.com 时,计算机并不认识这个名字。它需要把这个域名翻译成 IP 地址(比如 93.184.216.34),这个过程就是 DNS 解析。
DNS 自 1983 年诞生以来,基本工作机制一直没变:
浏览器 → 本地 DNS 缓存 → 递归解析器(运营商的 DNS 服务器)→ 根域名服务器 → 顶级域名服务器 → 权威域名服务器
整个查询过程走的是 UDP 协议,53 端口,明文传输。
明文意味着什么?意味着在你和 DNS 服务器之间的每一跳,任何人都可以:
- 看到你查询了什么域名(隐私泄露)
- 篡改返回的 IP 地址(DNS 劫持 / DNS 投毒)
- 记录你的查询日志,用于用户画像、行为分析
这就像你每次打电话前,都要先在大厅里大喊一声"帮我查一下某某的电话号码",所有人都能听见。
二、DoH 是什么:给 DNS 穿上加密外衣
DoH(DNS over HTTPS),定义在 [RFC 8484] 中,核心思想很简单:把 DNS 查询封装在 HTTPS 请求里传输。
工作原理
传统 DNS 查询是一个二进制 UDP 数据包。DoH 做了以下转换:
- 将 DNS 查询编码为二进制格式(wire format),放入 HTTP 请求体
- 通过 HTTPS POST 或 GET 发送到 DoH 服务器(默认路径
/dns-query) - 服务器返回的 DNS 响应也封装在 HTTP 响应体中
- TLS 加密保护整个通信过程
一个典型的 DoH 请求看起来像这样:
POST /dns-query HTTP/1.1
Host: dns.cloudflare.com
Content-Type: application/dns-message
Accept: application/dns-message
<二进制 DNS 查询数据>
或者用 GET 方式:
GET /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB HTTP/1.1
Host: dns.cloudflare.com
Accept: application/dns-message
其中 dns 参数是 Base64URL 编码的 DNS wire format 查询。
关键特性
| 特性 | 传统 DNS | DoH |
|---|---|---|
| 传输协议 | UDP/TCP (端口 53) | HTTPS (端口 443) |
| 加密 | 无 | TLS 1.2+ |
| 端口 | 53 | 443 |
| 混入其他流量 | 不可能 | 可以(和普通 HTTPS 流量混在一起) |
| 防窃听 | ❌ | ✅ |
| 防篡改 | ❌ | ✅ |
| 防重放 | ❌ | ✅ |
三、DoH vs DoT vs DoQ:加密 DNS 的三种方案
DoH 并不是唯一给 DNS 加密的方案。目前主流有三种:
DoT(DNS over TLS)— RFC 7858
- 在 TLS 隧道上直接传输 DNS 查询
- 使用专用端口 853
- 比 DoH 更轻量(没有 HTTP 层开销)
- 但端口 853 容易被防火墙识别和封锁
DoH(DNS over HTTPS)— RFC 8484
- 在 HTTPS 上传输 DNS 查询
- 使用标准端口 443
- 和普通网页流量混在一起,难以区分和封锁
- 有 HTTP 层开销,略多于 DoT
DoQ(DNS over QUIC)— RFC 9250
- 在 QUIC 协议上传输 DNS 查询
- 结合了 UDP 的低延迟和 TLS 的加密
- 支持连接迁移(网络切换不断连)
- 最新的方案,部署还在早期
该选哪个?
如果你是终端用户、需要穿越防火墙 → DoH(端口 443,难以封锁)
如果你是网络管理员、追求效率 → DoT(更轻量,可控性强)
如果你追求极致性能和未来方向 → DoQ(低延迟,连接迁移)
四、DoH 的核心价值
1. 隐私保护
传统 DNS 查询是明文的,你的 ISP(互联网服务提供商)可以完整记录你访问过的每一个域名。这些数据可以用于:
- 用户行为分析
- 精准广告推送
- 数据售卖给第三方
DoH 加密了查询内容,ISP 只能看到你在和某个 DoH 服务器建立 HTTPS 连接,看不到具体查询了什么域名。
2. 防止 DNS 劫持
DNS 劫持是一种常见攻击手段:
- ISP 劫持:当你查询一个不存在的域名时,某些 ISP 不会返回 NXDOMAIN,而是返回一个广告页面的 IP
- 中间人攻击:在公共 WiFi 上,攻击者可以篡改 DNS 响应,把你导向钓鱼网站
- DNS 投毒:向 DNS 缓存注入虚假记录
DoH 通过 TLS 加密和服务器身份验证,让这些攻击变得极其困难。
3. 抗审查与穿越防火墙
因为 DoH 流量和普通 HTTPS 网页流量在端口和协议层面几乎无法区分,基于 DNS 的封锁机制(如 DNS 污染、DNS 阻断)对 DoH 基本无效。
这也是 DoH 最具争议的一点——下文会详细讨论。
五、争议:DoH 不是万能药
DoH 带来了隐私和安全的好处,但也引发了不少争议。
1. 企业网络可见性下降
在企业环境中,IT 安全团队依赖 DNS 日志来:
- 检测恶意软件的 C2 通信(通过恶意域名)
- 实施内容过滤策略
- 监控员工访问行为
DoH 将 DNS 查询加密发送到外部服务器,绕过了企业内部的 DNS 基础设施,安全团队失去了可见性。
这就像员工突然决定不在公司通讯录里查电话,而是自己用加密通讯软件查——IT 部门看不到他联系了谁。
2. 中心化风险
目前主流的 DoH 解析器集中在少数几家:
- Cloudflare(1.1.1.1)
- Google(8.8.8.8)
- Quad9(9.9.9.9)
- AdGuard
这意味着大量用户的 DNS 查询集中流向这几个提供商,形成新的隐私和单点风险。虽然这些提供商承诺不记录查询日志,但"信任承诺"和"技术保证"之间仍有差距。
3. 浏览器的"自作主张"
Firefox 和 Chrome 都已默认或逐步启用 DoH。浏览器绕过操作系统的 DNS 配置,直接向外部 DoH 服务器发起查询,这引发了一些问题:
- 本地域名(如企业内网域名)解析失败
- 分流策略失效
- 用户不知情的情况下流量路由改变
4. 恶意软件也在用 DoH
讽刺的是,DoH 的加密特性也被恶意软件利用。越来越多的恶意软件通过 DoH 与 C2 服务器通信,规避安全检测。安全厂商不得不开发新的检测手段。
六、实战:如何使用 DoH
6.1 浏览器配置
Firefox
Firefox 是最早默认启用 DoH 的浏览器:
- 进入
设置 → 隐私与安全 → DNS over HTTPS - 选择启用,并选择提供商(Cloudflare、NextDNS 等)
- 可以设置"当 DNS over HTTPS 不可用时回退到系统 DNS"
Chrome
Chrome 的 DoH 配置:
- 进入
设置 → 安全 - 开启"使用安全 DNS"
- 选择提供商或自定义 URL
6.2 操作系统配置
Windows 11
设置 → 网络和 Internet → 以太网(或 WiFi)→ DNS 服务器分配 → 编辑
首选 DNS:1.1.1.1
DNS over HTTPS:开启
DoH 模板:https://cloudflare-dns.com/dns-query
Linux(systemd-resolved)
# 编辑 /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com
DNSOverTLS=yes
# 重启服务
sudo systemctl restart systemd-resolved
6.3 常用 DoH 服务器
| 提供商 | DoH URL | 特点 |
|---|---|---|
| Cloudflare | https://cloudflare-dns.com/dns-query |
快速,承诺不记录日志 |
https://dns.google/dns-query |
全球节点,稳定 | |
| Quad9 | https://dns.quad9.net/dns-query |
内置恶意域名拦截 |
| AdGuard | https://dns.adguard-dns.com/dns-query |
广告和追踪域名拦截 |
| 阿里 DNS | https://dns.alidns.com/dns-query |
国内速度快 |
6.4 用 curl 手动测试 DoH
想亲手感受一下 DoH?用 curl 就可以:
# 查询 example.com 的 A 记录
# dns 参数是 DNS wire format 的 Base64URL 编码
curl -s -H "Accept: application/dns-message" \
"https://cloudflare-dns.com/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" \
--output - | xxd | head -20
返回的是二进制 DNS 响应,你可以用 dig 或 Python 解析。
6.5 用 Python 发起 DoH 查询
import requests
import base64
import struct
def build_dns_query(domain: str) -> bytes:
"""构造一个最简单的 DNS 查询(A 记录)"""
# DNS Header: ID=0x1234, RD=1, QDCOUNT=1
header = struct.pack(">HHHHHH", 0x1234, 0x0100, 1, 0, 0, 0)
# Question section
question = b""
for label in domain.split("."):
question += bytes([len(label)]) + label.encode()
question += b"\x00" # 终止符
question += struct.pack(">HH", 1, 1) # QTYPE=A, QCLASS=IN
return header + question
def doh_query(domain: str, doh_url: str = "https://cloudflare-dns.com/dns-query") -> bytes:
"""通过 DoH 查询域名"""
query = build_dns_query(domain)
encoded = base64.urlsafe_b64encode(query).decode().rstrip("=")
resp = requests.get(
f"{doh_url}?dns={encoded}",
headers={"Accept": "application/dns-message"},
)
return resp.content
# 示例
response = doh_query("example.com")
print(f"收到 {len(response)} 字节的 DNS 响应")
print(response.hex())
七、DoH 的未来
DoH 仍在快速演进中,几个值得关注的趋势:
- DoQ 起势:随着 QUIC 的普及,DoQ 作为更高效的加密 DNS 方案正在获得关注
- Oblivious DoH(ODoH):在 DoH 基础上增加代理层,让 DoH 服务器也无法知道查询来源 IP,进一步增强隐私(RFC 9460)
- 浏览器默认 DoH 的博弈:浏览器、ISP、企业、监管机构之间的利益博弈仍在继续
- 合规与管控:部分国家已开始要求 DoH 服务器在本国部署或要求可审计
- 点赞
- 收藏
- 关注作者
评论(0)