---
title: 'DNS 隐私: DoH, DoT, DoQ, ODoH'
url: https://doc.liz6.com/networking/04-DNS/03-dns-privacy-doh-dot-doq-odoh
locale: zh
area: networking
tags:
- networking
- DNS
date: 2026-06-30
modified: 2026-06-30
description: DNS 原本是明文协议——ISP 和中间网络能看到查了什么域名。DoT/DoH/DoQ 把 DNS 查询放入加密通道,ODoH 进一步通过 proxy-resolver 分离实现"谁在查"和"查什么"的隐私隔离。四种协议在隐私强度、部署模式和中间件兼容性上各有取舍。
---

# DNS 隐私: DoH, DoT, DoQ, ODoH

> DNS 原本是明文协议——ISP 和中间网络能看到查了什么域名。DoT/DoH/DoQ 把 DNS 查询放入加密通道,ODoH 进一步通过 proxy-resolver 分离实现"谁在查"和"查什么"的隐私隔离。四种协议在隐私强度、部署模式和中间件兼容性上各有取舍。

## 概述

DNS 最初是明文协议（UDP port 53），ISP 和中间网络可以看到你查询了哪些域名——即使网站内容本身通过 HTTPS 加密。DoT（DNS over TLS）和 DoH（DNS over HTTPS）将 DNS 查询放入加密通道，提供机密性。DoH 因与标准 HTTPS 流量不可区分而特别受隐私关注者欢迎。DoQ（DNS over QUIC）进一步减少握手延迟。ODoH（Oblivious DoH）通过 proxy-resolver 分离实现"谁在查"和"查什么"的隐私分离。

## DoT: DNS over TLS (port 853)

DNS wire format 直接在 TLS 连接上传输。独立端口 (853) 使网络管理员容易识别和 QoS 分类，但也容易被封锁。

```
Client → server port 853:
  TLS handshake (1-RTT with ECH if enabled + encrypted SNI)
  → 连接上: 2-byte length prefix + DNS message (RFC 1035 wire format)
     length: big-endian, 不包括 prefix 自己 (最大 65535)
```

## DoH: DNS over HTTPS (port 443)

DNS 混在标准 HTTPS 流量中——与网站流量不可区分。

```
Client → https://dns.example.com/dns-query:
  POST: Content-Type: application/dns-message
         Body: DNS wire format (同 RFC 1035)
  GET:  ?dns=<base64url(DNS wire format)>

  HTTP/2: stream multiplexing → 多查询共享一个 TCP 连接
  HTTP/3: QUIC → 0-RTT for cached DNS resolver

内容协商 (可选):
  Accept: application/dns-message → IDNA wire format (二进制, 默认)
  Accept: application/dns-json → JSON (Google/Cloudflare 特有)
```

## DoQ: DNS over QUIC (port 853)

DoQ 使用 QUIC 代替 TCP+TLS，解决 DoT 的握手延迟和 TCP HOL blocking:

```
QUIC connection (UDP 853):
  Stream 0: client-initiated, bidirectional → DNS messages
  Stream 4: client-initiated, unidirectional → for server to send data
  Stream 8: client-initiated, unidirectional → for client to send data

每 stream: STREAM frame 含 DNS message (no length prefix needed, QUIC stream 自带边界)
```

## ODoH (Oblivious DNS over HTTPS, RFC 9230)

问题: DoH 仍然暴露"谁在查什么"。resolver 看到 client IP + DNS query。

ODoH 将 proxy 和 resolver 解耦:

```
Client → Proxy (Oblivious Proxy):
  加密 POST https://proxy/dns-query
  Body: encrypted DNS query (用 resolver 的 HPKE 公钥加密)
  → Proxy 知道 client IP 但看不到查询内容

Proxy → Target (Oblivious Target = DNS resolver):
  加密 POST https://resolver/dns-query
  Body: encrypted DNS query (same, proxy 无法解密)
  → Target/resolver 看到查询内容但不知道 client IP (只看得到 proxy IP)

Proxy 和 Target 不能勾结 (勾结 = 仍然可追踪)
```

## 四者对比

| | 端口 | 传输 | 握手指令 | 可封锁性 | 隐私 (query) | 隐私 (client IP) |
|---|---|---|---|---|---|---|
| Do53 | 53 UDP | UDP | 0 | 极低 | 无 | 无 |
| DoT | 853 | TCP+TLS | 1-2 RTT | 高 (独立端口) | 部分 (TLS) | 无 |
| DoH | 443 | HTTP/2 or /3 | 1-2 RTT (h2), 0-1 RTT (h3) | 极低 (与 HTTPS 混) | 部分 (HTTPS) | 无 |
| DoQ | 853 | QUIC/UDP | 0-1 RTT | 中 | 部分 (QUIC) | 无 |
| ODoH | 443 | HTTP + HPKE | 2 RTT (proxy then resolver) | 低 | 有 (双层) | 有 (resolver 看不到) |

## 参考

- **RFC**: 7858, 8484, 9250, 9230
- **AdGuard**: adguard-dns.io/encryption.html

*Keywords: DoH, DoT, DoQ, ODoH, DNS privacy, encrypted DNS, HPKE, oblivious proxy*
