DNS over HTTPS:让域名解析不再"裸奔"

举报
yd_244592142 发表于 2026/10/30 09:16:20 2026/10/30
【摘要】 一、先聊聊 DNS:互联网的"电话簿"当你在浏览器输入 www.baidu.com 时,计算机并不认识这个名字。它需要把这个域名翻译成 IP 地址(比如 93.184.216.34),这个过程就是 DNS 解析。DNS 自 1983 年诞生以来,基本工作机制一直没变:浏览器 → 本地 DNS 缓存 → 递归解析器(运营商的 DNS 服务器)→ 根域名服务器 → 顶级域名服务器 → 权威域名...

一、先聊聊 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 做了以下转换:

  1. 将 DNS 查询编码为二进制格式(wire format),放入 HTTP 请求体
  2. 通过 HTTPS POST 或 GET 发送到 DoH 服务器(默认路径 /dns-query)
  3. 服务器返回的 DNS 响应也封装在 HTTP 响应体中
  4. 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 的浏览器:

  1. 进入 设置 → 隐私与安全 → DNS over HTTPS
  2. 选择启用,并选择提供商(Cloudflare、NextDNS 等)
  3. 可以设置"当 DNS over HTTPS 不可用时回退到系统 DNS"

Chrome

Chrome 的 DoH 配置:

  1. 进入 设置 → 安全
  2. 开启"使用安全 DNS"
  3. 选择提供商或自定义 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 快速,承诺不记录日志
Google 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 仍在快速演进中,几个值得关注的趋势:

  1. DoQ 起势:随着 QUIC 的普及,DoQ 作为更高效的加密 DNS 方案正在获得关注
  2. Oblivious DoH(ODoH):在 DoH 基础上增加代理层,让 DoH 服务器也无法知道查询来源 IP,进一步增强隐私(RFC 9460)
  3. 浏览器默认 DoH 的博弈:浏览器、ISP、企业、监管机构之间的利益博弈仍在继续
  4. 合规与管控:部分国家已开始要求 DoH 服务器在本国部署或要求可审计
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。