DNS 泄露与防御:从域名解析到代理配置
本文从一次网站访问的过程出发,解释 DNS 查询如何进行、查询由谁处理,以及电脑如何选择 DNS 服务器。随后通过具体例子说明 DNS 泄露发生在哪一步、哪些信息会暴露、检测网站如何发现泄露,最后介绍防御措施与验证方法。
一、DNS查询与DNS配置方式
1. 从输入域名到连接网站
- 假设准备访问
www.baidu.com,浏览器使用电脑的系统 DNS,并且直接连接网站。下面先不考虑代理,假设电脑也没有可用的 DNS 缓存。 - 本例中,电脑将家里的路由器作为 DNS 查询入口,路由器使用运营商提供的 DNS。
- 整个过程可以分成两步:查询网站地址,然后连接网站。
查询地址:
浏览器请求操作系统查询 www.baidu.com 的 IP 地址。
操作系统向家里的路由器发送查询,路由器将查询转发给运营商 DNS。
浏览器 → 操作系统 → 家里的路由器 → 运营商 DNS
获取地址并访问网站:
运营商 DNS 通过路由器返回 IP,操作系统将结果交给浏览器。
浏览器使用这个 IP 连接百度服务器,获取并显示网页。
运营商 DNS → 家里的路由器 → 操作系统 → 浏览器 → 百度服务器
← 返回网页DNS 服务器负责帮助电脑找到网站地址,网站服务器负责提供网页内容。查询地址和访问网站,是两个不同的动作。
2. 谁提供 DNS 服务
- DNS 服务可以由网络运营商提供,也可以由公共 DNS 服务商提供。
- 选择 DNS 服务,就是选择把域名查询交给谁处理。
| 提供方 | DNS 地址示例 |
|---|---|
| 电信、联通、移动等运营商 | 地址因网络而异,通常随网络配置提供 |
| 阿里公共 DNS | 223.5.5.5 |
| 腾讯 DNSPod | 119.29.29.29 |
| Cloudflare | 1.1.1.1 |
8.8.8.8 |
3. DNS配置方式
电脑使用哪台 DNS,通常取决于网络自动提供的配置、用户手动设置,以及软件自身的处理方式。
第一种:使用网络自动提供的 DNS 配置。
- 电脑连接家庭 Wi-Fi 并自动获取 DNS 时,路由器可以将自身地址设为电脑的 DNS 查询入口。
查询地址:
操作系统向家里的路由器查询 www.google.com 的 IP 地址。
路由器将查询转发给运营商 DNS。
你的电脑 → 家里的路由器 → 运营商 DNS
访问网站:
客户端获得 IP 地址后,通过美国代理连接 Google。
你的客户端 → 美国代理服务器 → Google 服务器第二种:使用你手动设置的 DNS。
- 例如,在电脑的网络设置中,将 DNS 修改为 223.5.5.5。 即使宽带由电信提供,电信网络仍可以负责传送数据,而域名查询交给阿里 DNS 处理。
设置 DNS:
你将电脑的 DNS 地址填写为 223.5.5.5。
操作系统采用这项设置。
查询域名:
浏览器请求操作系统查询域名。
操作系统向阿里 DNS 发送查询。
你的电脑 → 阿里 DNS(223.5.5.5)第三种:使用浏览器或代理软件指定的 DNS。
- 浏览器可以使用自己的 DNS 服务。例如,浏览器启用独立的 DoH,也就是通过 HTTPS 发送 DNS 查询。
- 代理软件也可能接管电脑的 DNS 查询,再按照代理软件的配置处理。
浏览器使用独立 DNS:
浏览器向自身设置中的 DNS 服务发送查询。
浏览器 → 浏览器指定的 DNS 服务
代理软件接管查询:
电脑发起 DNS 查询,代理软件接管这次查询,
再按照代理软件的配置处理。
电脑的 DNS 查询 → 代理软件 → 按配置处理重要
宽带运营商是谁,并不能单独决定电脑使用哪家 DNS。 判断一次查询使用了什么 DNS,需要确认:查询由哪个程序处理,这个程序最终把查询交给了谁。
二、DNS 泄露是怎样发生的
1. DNS 查询为什么会绕过代理
- 网站连接和 DNS 查询是两个不同的动作。代理软件可能处理了网站连接,却没有接管客户端在本地发出的 DNS 查询。
假设通过代理访问 www.google.com。本例中,浏览器先通过操作系统查询域名,但代理软件没有接管这次查询。
查询地址:
浏览器请操作系统查询 www.google.com 的 IP。
操作系统沿用原来的 DNS 设置,通过路由器向运营商 DNS 查询。
浏览器 → 操作系统 → 家里的路由器 → 运营商 DNS
获取地址并访问网站:
运营商 DNS 返回 IP,操作系统将结果交给浏览器。
浏览器通过代理服务器连接 Google,获取并显示网页。
浏览器 → 代理服务器 → Google 服务器重要
泄露发生在查询地址这一步。 用户希望查询经过代理,电脑却直接将查询交给了运营商 DNS。查询暴露的是域名,通常不包含网页完整路径、密码或聊天内容。
2. 网站怎样识别 DNS 服务商
- 普通网站连接不会自动告诉网站,电脑使用了哪家 DNS。
- 服务商可以让浏览器查询一个专用测试域名,再观察哪台 DNS 服务器前来询问。
假设 Google 控制一个测试域名,并为你这次访问生成专用地址 abc123.example.com。这里的域名仅用于示意。
触发查询:
Google 页面让浏览器请求 abc123.example.com。
浏览器请操作系统解析这个域名,操作系统向运营商 DNS 查询。
浏览器 → 操作系统 → 运营商 DNS
查询正式记录:
运营商 DNS 没有这个专用域名的缓存,
于是向 Google 控制的权威 DNS 查询。
运营商 DNS → Google 控制的权威 DNS
关联结果:
Google 控制的权威 DNS 记录查询来源 IP。
Google 根据 abc123.example.com,将记录关联到你的本次访问,
再结合 IP 归属信息,判断参与查询的 DNS 服务商。重要
服务商需要额外的检测机制,才能将 DNS 查询与某次访问关联起来。 识别出参与查询的解析器,不等于获得了用户的真实 IP 或全部域名查询记录。
三、怎样防御 DNS 泄露
Mihomo是Go 语言编写的、基于规则的网络代理内核
1. 解决方案
将下面配置合并到现有 Mihomo 配置中,将 你的代理节点 替换为实际节点名称。已有同名配置项时,修改原配置,避免重复添加。
tun:
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
dns:
enable: true
ipv6: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 119.29.29.29
- 223.5.5.5
nameserver:
- 'https://example.cloudflare-gateway.com/dns-query'
fallback:
- 'https://example.cloudflare-gateway.com/dns-query'
fallback-filter:
geoip: true
geoip-code: CN2.配置说明
Mihomo 需要查询域名的真实 IP 时,通过 HTTPS 向 Cloudflare Gateway 发送查询。Cloudflare 负责解析,并将结果返回本机 Mihomo。查询和回答通过 HTTPS 加密传输,这种方式叫 DoH。
查询示例
假设 Mihomo 需要查询 www.google.com 的真实 IP:
发送查询:
Mihomo 问:“www.google.com 的 IP 是多少?”
Mihomo 通过 HTTPS 加密连接,将查询发送给 Cloudflare Gateway。
Mihomo → Cloudflare Gateway DNS
处理并返回结果:
Cloudflare 有可用缓存时,直接回答;
没有可用缓存时,继续向负责该域名的权威 DNS 查询。
得到 Google 的 IP 后,Cloudflare 通过原连接,
将结果返回给电脑上的 Mihomo。
Cloudflare Gateway DNS → Mihomo关键技术
1. DoH:加密查询和回答。
- DoH 使用 HTTPS 加密传输域名查询和解析结果,保护传输过程中的内容。例如,Mihomo 向 Cloudflare 查询
www.google.com的 IP,查询和回答都通过加密连接传输。
nameserver:
- 'https://example.cloudflare-gateway.com/dns-query'| 内容 | 作用 |
|---|---|
nameserver | 指定处理域名查询的 DNS 服务 |
https:// | 使用 HTTPS 加密传输查询和回答 |
example.cloudflare-gateway.com | Cloudflare Gateway 服务域名,使用时替换为自己的地址 |
/dns-query | 接收 DoH 查询的接口路径 |
2. 辅助 DNS:先找到 Cloudflare Gateway 的 IP。
- Cloudflare Gateway 的服务地址也是域名。Mihomo 需要先查询它的 IP,才能建立连接。
default-nameserver指定这次查询交给哪台 DNS 服务器。
default-nameserver:
- 119.29.29.29
- 223.5.5.5| 配置 | 作用 |
|---|---|
default-nameserver | 查询 DNS 服务自身域名对应的 IP |
119.29.29.29 | 腾讯 DNSPod |
223.5.5.5 | 阿里公共 DNS |
3. DNS 接管:将普通域名查询交给 Mihomo。
- TUN 启用后,电脑发出的普通域名查询进入 TUN,
dns-hijack将匹配的查询交给 Mihomo,改由 Mihomo 处理。
tun:
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
dns:
enable: true| 配置 | 作用 |
|---|---|
auto-route: true | TUN 启用后,自动设置流量进入 TUN 的路由 |
auto-detect-interface: true | 自动选择实际联网的网卡,例如 Wi-Fi 网卡 |
any:53 | 将进入 TUN、发往 UDP 53 端口的连接交给内部 DNS |
dns.enable: true | 启用 Mihomo 内部 DNS,处理接管的查询 |
4. Fake-IP:用虚拟地址识别域名。
Fake-IP帮助 Mihomo 识别连接对应的域名,方便按域名规则分流。由于多个域名可能共用真实 IP,Mihomo 为域名分配虚拟地址,用对应关系区分连接目标。
dns:
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16| 配置 | 作用 |
|---|---|
enhanced-mode: fake-ip | 启用虚拟 IP 与域名映射 |
fake-ip-range | 指定虚拟 IPv4 地址池 |
浏览器使用虚拟 IP 198.18.0.10 发起连接。
Mihomo 内核根据这个地址找到 www.google.com,
需要真实 IP 时,再查询该域名对应的地址。
虚拟 IP → 谷歌域名 → 真实 IP
198.18.0.10 → www.google.com → 按需解析得到的 IP5. 后备解析:按条件选择解析结果。
nameserver提供常规解析结果,fallback提供后备结果。Mihomo 根据fallback-filter的条件,决定采用哪一边的结果。
fallback:
- 'https://example.cloudflare-gateway.com/dns-query'
fallback-filter:
geoip: true
geoip-code: CN| 配置 | 作用 |
|---|---|
fallback | 指定提供后备解析结果的 DNS 服务 |
geoip: true | 根据解析结果的 IP 归属地进行判断 |
geoip-code: CN | 常规结果属于中国时采用它,否则采用后备结果 |
6. IPv6:允许查询 IPv6 地址。
ipv6: true允许 Mihomo 查询域名的 IPv6 地址,也就是 AAAA 记录。
dns:
ipv6: true3. 运行完整流程
重要
完整链路: 浏览器请操作系统查询 www.google.com 的 IP。查询进入 TUN,由 dns-hijack 交给 Mihomo。Mihomo 先返回虚拟 IP,并保存它与 www.google.com 的对应关系。
浏览器连接这个虚拟 IP 时,Mihomo 根据对应关系找回 www.google.com,匹配网站规则,选定后续连接方式。此时还没有连接网站服务器。
需要由 Mihomo 查询真实 IP 时,如果没有可用的 Cloudflare Gateway 地址缓存,Mihomo 先通过 default-nameserver 查询 Cloudflare Gateway 服务自身的 IP。随后,Mihomo 连接 Cloudflare Gateway,通过 DoH 查询 www.google.com 的真实 IP,查询和回答都通过 HTTPS 加密传输。
Mihomo 根据 fallback-filter 选择解析结果,取得网站的真实 IP。浏览器此前已经向虚拟 IP 发起连接,Mihomo 也已根据对应关系找到网站域名。真实 IP 返回后,Mihomo 使用它连接网站服务器,再将网站返回的网页数据转发给浏览器。
版权所有
版权归属:念宇
