← [ BACK_TO_NOTES ]

DoH

DoH(DNS over HTTPS,RFC 8484)把 DNS wire-format 查询与响应映射为 HTTPS 交换;它保护客户端到 DoH Resolver 的传输,但 Resolver 本身仍可见查询,也不等于 VPN 或 DNSSEC。

#concept #growing #network #dns

[!info] related notes

DoH

一句话定义

DoH(DNS over HTTPS) 是 RFC 8484 定义的 DNS 加密传输方式:客户端把标准 DNS wire-format 查询通过 HTTPS 发送给 DoH Resolver,再通过 HTTPS 收回 DNS 响应。

它改变的主要是:

客户端 ↔ 递归解析器这一段 DNS 报文如何传输。

DNS 的名称、记录类型、递归解析、缓存等基本语义并没有因为 DoH 而消失。

为什么需要它

经典 DNS 常直接通过 UDP/TCP 53 传输。若这一段没有额外保护,链路上的网络设备可能直接观察 DNS 查询内容,也更容易对报文实施篡改或重定向。

DoH 把这一段放进 HTTPS:

传统路径
Client ── DNS message ──> Recursive Resolver

DoH 路径
Client ── HTTPS{DNS message} ──> DoH Resolver

因此普通链路旁观者不能再像观察明文 DNS 那样直接读取每个查询中的域名。

核心心智模型

应用 / DoH Client
      │
      │ 生成普通 DNS Query
      ▼
DNS wire-format message
      │
      │ 映射为 HTTP GET 或 POST
      ▼
HTTPS / TLS
      │
      ▼
DoH Resolver
      │
      │ 取出 DNS Query
      ▼
缓存 / 正常递归 DNS
      │
      ▼
DNS Response
      │
      └── 通过 HTTPS 返回客户端

可以把它理解为:

DNS 语义
  ↓
HTTP 请求/响应
  ↓
TLS 保护
  ↓
网络传输

关键不是“DNS 变成了网页”,而是 DNS message 使用 HTTPS 作为承载。

一次标准 DoH 请求如何发生

RFC 8484 定义了两种标准请求方式。

GET

DNS wire-format 查询先做 base64url 编码,再放入 dns query parameter:

GET /dns-query?dns=<base64url-encoded-DNS-message>
Accept: application/dns-message

POST

DNS wire-format 查询直接作为 HTTP body:

POST /dns-query
Content-Type: application/dns-message
Accept: application/dns-message

<binary DNS wire-format message>

标准 wire-format media type 是:

application/dns-message

[!important] 一些服务商另外提供 JSON DNS API,但 JSON 不是 RFC 8484 所定义的标准 DNS wire-format 表示。因此不能把“GET/POST + JSON 或二进制”当成 DoH 标准模型。

DoH 真正保护了什么

DoH 主要保护:

DoH Client
    │
    │ 加密、完整性保护
    ▼
DoH Resolver

它降低了这一段被普通链路参与者直接读取或任意修改 DNS 查询内容的风险。

但加密终点就是 Resolver,因此:

DoH Resolver 通常仍然能够看到客户端向它提交的 DNS 查询。

如果目标是让单个解析参与者不能同时知道“客户端身份 + 查询内容”,需要看 ODoH 等不同隐私模型。

最小场景:浏览器 Secure DNS

浏览器可以直接实现 DoH:

Browser
   │
   ├── HTTPS 页面请求 ─────────> Website
   │
   └── DoH DNS 请求 ───────────> DoH Resolver

这意味着浏览器的 DNS 路径可能与操作系统其他程序不同。

例如:

Browser     → Public DoH Resolver
PowerShell  → System DNS
Other App   → VPN / Router DNS

因此“系统 DNS 已经改了”并不能证明浏览器一定走这条路径。完整机制见 浏览器安全 DNS。

为什么常见于 443,但不要把 443 当成定义

DoH 使用 HTTPS URI,所以在没有指定其他端口时通常使用 HTTPS 的常见端口 443。

但协议本质是:

DNS over HTTPS

而不是:

“端口 443 上的 DNS”。

这也是为什么仅凭端口通常无法把 DoH 与普通 HTTPS 流量简单区分。

DoH 与专用 TCP 853 的 DoT 在这一点上的完整比较见 DoH vs DoT。

它不解决什么

不是 VPN

DoH 只处理 DNS 解析路径中的传输保护,不会自动把网页、SSH、游戏等所有网络流量装进统一加密隧道。

不会让 Resolver 看不到查询

Resolver 是 HTTPS 的终点,需要取得 DNS message 才能处理查询。

不等于 DNSSEC

DoH 保护的是客户端到 Resolver 的传输;DNSSEC 解决的是 DNS 数据真实性和完整性验证问题,两者职责不同。

不保证整台机器都使用 DoH

浏览器、操作系统、代理客户端和其他应用可以各自选择不同解析路径。

不隐藏所有网络元数据

后续访问目标服务时仍然需要建立真实网络连接。DoH 本身不提供完整的匿名化或流量隐藏。

仍可能存在 Bootstrap

如果 DoH endpoint 本身使用域名,客户端首先要知道如何连接这个 endpoint。这里会出现 DNS Bootstrap 鸡蛋问题。

如何观察和验证

理解 DoH 时优先观察“解析决策发生在哪里”,而不是只看一个 DNS 设置项:

  1. 当前应用是否自行启用了 Secure DNS / DoH?
  2. DoH endpoint 是谁?
  3. 同机其他程序是否使用同一条解析路径?
  4. 抓包时是否还能直接看到对应的明文 DNS Query?
  5. 改变系统 DNS 后,当前应用的结果是否随之变化?

涉及实际故障时进入 系统化 DNS 诊断流程,不要把完整排障流程继续塞进本概念笔记。

学习检查

先合上笔记再回答:

  1. DoH 改变的是 DNS 的哪一部分:DNS 数据模型、递归算法,还是客户端到 Resolver 的传输方式?
  2. 画出一次 DoH 查询从 Client 到 Resolver 再返回的最小路径。
  3. RFC 8484 的标准 DNS media type 是什么?GET 与 POST 分别如何携带 DNS message?
  4. 为什么 DoH Resolver 本身通常仍能看到查询内容?
  5. 为什么“浏览器开启 DoH”不能推出“整台电脑都在使用 DoH”?
  6. DoH 为什么既不是 VPN,也不能替代 DNSSEC?
  7. 如果系统 DNS 修改后 Chrome 的解析结果完全不变,你下一步会检查什么?

掌握验收

  • 能闭卷解释 DoH 的一句话定义和存在理由;
  • 能画出 Client → HTTPS → DoH Resolver → DNS 的工作模型;
  • 能说清 DoH 保护的信任边界以及 Resolver 仍能看到什么;
  • 能解释 RFC 8484 的 GET / POST 与 application/dns-message;
  • 能区分“浏览器使用 DoH”和“系统所有 DNS 都走 DoH”;
  • 能通过 DoH vs DoT 处理一个新的加密 DNS 场景;
  • 隔一段时间后仍能完成以上任务,再根据 学习中的掌握 调整 mastery。

规范与进一步阅读

创建于 2026/7/31 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本