什么是 DoH(DNS over HTTPS)?一文读懂 iOS 开发者眼中的安全 DNS 解析
前言
在 iOS 网络开发中,我们常常依赖 URLSession
、AFNetworking
等库来发起网络请求,而这些请求背后第一步就是域名解析(DNS Resolution)。传统的 DNS 查询是明文的,这意味着它很容易被监听、篡改甚至劫持。
而随着网络安全需求的提升,DNS over HTTPS(DoH)
正式登上舞台,逐步成为更安全、更可靠的域名解析方式。
本文将从 iOS 开发的视角,深入解析 DoH 的原理、优点、使用方式,以及在 App 中应用 DoH 的实践思路。
什么是 DoH?
DoH(DNS over HTTPS) 是一种通过 HTTPS 协议传输 DNS 查询和响应的机制,核心目标是保护 DNS 查询的隐私性与完整性。
✅ 特点:
- 加密传输:避免被中间人嗅探 DNS 请求内容。
- 防篡改:HTTPS 保证了内容不会被劫持或修改。
- 更适合移动网络:在不可信网络下(如公共 Wi-Fi)尤其重要。
为什么 iOS 开发者需要关心 DoH?
在传统 DNS 模式下,系统会自动使用 Wi-Fi 或蜂窝网络配置的 DNS 服务器(通过 DHCP 获取或手动设置),而这些服务器:
- 可能被运营商拦截或注入广告。
- 可能遭遇 DNS 劫持(中间人返回错误 IP 地址)。
- 查询数据是明文,用户隐私无法保障。
作为开发者,你需要保证 App 的网络请求没有被劫持、准确访问目标服务器、不泄露隐私信息。使用 DoH,是提升 App 网络安全性的重要手段。
DoH 工作原理概览
以下是 DoH 的基础流程:
- 客户端构建一个 DNS 查询(如查询
example.com
的 A 记录)。 - 使用 HTTPS POST 或 GET 请求将这个查询发送到 DoH 服务器(如
https://cloudflare-dns.com/dns-query
)。 - DoH 服务器返回加密的 DNS 响应。
- 客户端从响应中提取 IP,发起真正的网络请求。
这整个过程完全基于 HTTPS 加密链路,在应用层完成 DNS 查询。
主流 DoH 服务提供商
以下是一些稳定可靠的 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.com/dns-query |
如何在 iOS 中使用 DoH?
iOS 并没有原生直接支持 DoH 查询的 API,因此我们可以考虑:
1. 使用 URLSession
进行 DoH 查询
你可以自己构造一个 DNS 查询包,然后以 application/dns-message
作为 Content-Type
发送 POST 请求到 DoH 服务器。如下是伪代码示意:
var request = URLRequest(url: URL(string: "https://cloudflare-dns.com/dns-query")!)
request.httpMethod = "POST"
request.addValue("application/dns-message", forHTTPHeaderField: "Content-Type")
request.httpBody = constructDNSQuery(for: "example.com")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
let ips = parseDNSResponse(data)
// 使用解析到的 IP 发起后续请求
}
}
task.resume()
⚠️ 注意:你需要构造和解析 DNS 数据包,这通常依赖第三方库或自行实现 DNS message 格式的编解码。
2. 使用现有开源库(推荐)
如:
实战应用场景
-
检测 DNS 劫持
获取真实可信的 DoH IP 集合,与URLSessionTaskMetrics
返回的 IP 比对,检测是否遭遇劫持。 -
防止中间人攻击(MitM)
使用 DoH 查询 IP,再结合TLS pinning
实现双重验证机制。 -
构建自定义 DNS 解析策略
比如你的 App 需要绕开系统 DNS,使用 CDN 自定义调度。
DoH 与 iOS System DNS 的区别
特性 | iOS 系统 DNS | DoH |
---|---|---|
加密性 | ❌ 明文传输 | ✅ HTTPS 加密 |
可扩展性 | ❌ 不可控,取决于网络环境 | ✅ 可接入任意 DoH 服务 |
中间人攻击防御 | ❌ 易被监听或劫持 | ✅ HTTPS 防止劫持 |
使用方便程度 | ✅ 系统自动解析 | ⚠️ 需开发者接入 |
精准性与控制力 | ❌ 容易受 ISP 干预 | ✅ 完全自控解析流程 |
附录:模拟 DoH 查询工具推荐
你可以用以下方式在线调试 DoH 请求:
- Cloudflare DoH playground
curl
命令行示例:
curl -X POST -H 'Content-Type: application/dns-message' --data-binary @query.bin 'https://cloudflare-dns.com/dns-query'
总结
DoH 作为新一代的 DNS 解析方式,为 iOS 开发者提供了更安全、更可靠的网络基础设施。虽然接入略微复杂,但其在抵御劫持、保障隐私方面的价值不容忽视。
如果你的 App 依赖高安全级别的网络访问,或者希望在不可信网络环境下保障用户体验,DoH 将是你的不二之选。