机场 DNS 污染、解析失败与 DNS 泄漏怎么解决?fake-ip 配置完全指南
代理环境下的 DNS 问题几乎都源于「谁来解析这个域名」没配清楚。搞懂 fake-ip,配一份带 DoH 的分流解析,三类问题一起解决。
代理环境下的 DNS 问题几乎都可以归结为一句话:「这个域名该由谁来解析」没有配清楚。
最快的解决方案:在客户端里启用 fake-ip 模式,并配置一份「国内域名走国内解析器、境外域名走境外 DoH」的分流解析。这一份配置同时解决污染、解析失败和泄漏三类问题,本文后面给出可以直接复制的片段。
三类 DNS 问题的症状对照
先确认你遇到的是哪一类:
| 症状 | 问题类型 | 根因 |
|---|---|---|
| 某些网站一直打不开,换节点也没用 | 污染 | 解析结果被替换成无效 IP |
| 提示「无法访问此网站」「DNS_PROBE_FINISHED」 | 解析失败 | 解析器不可达或超时 |
| 国内网站能开但很慢 | 解析走错 | 国内域名被解析到境外 CDN |
| 检测页面显示本地运营商的解析服务器 | 泄漏 | 查询没经过代理 |
| 网页首屏很慢,加载后流畅 | 解析慢 | 解析器响应慢或重复查询 |
| 代理开着时打不开,关掉反而能开 | 配置冲突 | fake-ip 与某些应用不兼容 |
代理环境下,域名是谁解析的?
理解这个流程,后面的配置就不用死记。当你访问一个网站:
- 应用(浏览器)需要知道域名对应的 IP。
- 如果开了系统代理,浏览器通常把域名原样交给代理客户端,由客户端负责解析——这种情况不容易泄漏。
- 如果开了 TUN 模式,DNS 查询会以 UDP 53 端口的形式被虚拟网卡截获,交给客户端内置的 DNS 服务器处理。
- 如果某些程序绕过了代理(写死了 DNS 服务器地址、用了 DoH 内置解析),它们的查询直接发到本地网络——这就是泄漏的来源。
客户端拿到查询后,按自己的 dns 配置决定发给哪个上游解析器,以及是否返回假 IP。所有 DNS 问题都发生在这两个决策上。
fake-ip 和 redir-host 该用哪个?
这是 Clash/Mihomo 的两种 DNS 工作模式,理解它们的差别是配好 DNS 的前提。
redir-host:客户端真的去解析域名,拿到真实 IP 后再按规则决定走代理还是直连。
fake-ip:客户端不做真实解析,直接返回一个保留段里的假 IP(默认 198.18.0.1/16),同时在内部记下「这个假 IP 对应哪个域名」。当流量真正发起时,客户端用这个映射还原出域名,按域名规则分流,再把域名交给节点去解析。
| 对比项 | fake-ip | redir-host |
|---|---|---|
| 是否本地解析域名 | 否 | 是 |
| 首次连接延迟 | 极低(无需等待解析) | 受解析速度影响 |
| 抗污染能力 | 强(根本不解析) | 依赖解析器质量 |
| 泄漏风险 | 低 | 较高 |
| 分流准确度 | 高(按域名判断) | 受解析结果影响 |
| 兼容性 | 少数应用不兼容 | 好 |
| 推荐程度 | 默认选它 | 有兼容问题时用 |
结论:默认用 fake-ip。 它几乎消灭了污染问题——你本地压根不做解析,污染无从下手。只有当某些特定应用(部分游戏的 UDP 直连、局域网设备发现、某些内网服务)拿到假 IP 后无法工作时,才把这些域名加进 fake-ip-filter 例外列表。
一份可以直接用的 DNS 配置
放进 Clash Verge Rev 的 Merge 文件(或 Clash Meta for Android 的覆写),其他 Mihomo 系客户端同理:
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localdomain"
- "+.pool.ntp.org"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
- "localhost.ptlogin2.qq.com"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://223.5.5.5/dns-query
- https://1.12.12.12/dns-query
fallback:
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
- tls://8.8.4.4:853
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
nameserver-policy:
"+.cn":
- 223.5.5.5
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
逐字段说明:
| 字段 | 作用 | 注意事项 |
|---|---|---|
enable | 启用客户端内置 DNS | TUN 模式下必须为 true |
listen | 内置 DNS 监听地址 | 端口不要和已有服务冲突 |
ipv6 | 是否返回 AAAA 记录 | 宽带无 IPv6 时设 false,能避免大量无效连接 |
enhanced-mode | fake-ip 或 redir-host | 默认 fake-ip |
fake-ip-filter | 不使用假 IP 的域名 | 内网、时间同步、网络检测域名必须放进来 |
default-nameserver | 解析上游 DoH 域名本身用的 DNS | 必须填明文 IP,否则死循环 |
nameserver | 主解析器 | 建议用国内 DoH,速度快 |
fallback | 备用解析器 | 用境外 DoH/DoT,抗污染 |
fallback-filter | 决定采用哪边的结果 | geoip 为真时,国内 IP 结果用 nameserver,否则用 fallback |
nameserver-policy | 按域名指定解析器 | 最精确的分流手段 |
default-nameserver 是最容易配错的一项:如果你的 nameserver 写的是 https://dns.google/dns-query,客户端需要先解析 dns.google 这个域名本身,而这一步必须靠明文 IP 的解析器完成。这里只能填 IP,不能填域名。
DoH 和 DoT 有什么区别?该选哪个?
两者都是加密 DNS,目的一样:让查询内容不被中间环节看到和篡改。
- DoH(DNS over HTTPS):走 443 端口,流量和普通 HTTPS 混在一起,最不容易被识别和阻断。写法
https://1.1.1.1/dns-query。 - DoT(DNS over TLS):走独立的 853 端口,实现更简单,但 853 端口本身就是特征,在限制严格的网络里可能被封。写法
tls://1.1.1.1:853。
优先用 DoH,把 DoT 作为备用列在后面。如果你的网络环境连 443 都被深度检查,加密 DNS 本身也可能受影响,这时 fake-ip 的价值就更明显——它根本不需要在本地做境外域名解析。
常见的可选上游:国内方向用 223.5.5.5、119.29.29.29、1.12.12.12 的 DoH 端点;境外方向用 1.1.1.1、dns.google、9.9.9.9 的 DoH 端点。不要把所有域名都丢给境外解析器,那会让国内网站变慢。
DNS 泄漏:怎么检测和修复
检测:打开任意一个 DNS 泄漏检测页面,看它报告的解析服务器。
- 显示境外解析器 → 正常。
- 显示你本地运营商的服务器 → 存在泄漏。
- 显示多个不同归属地的服务器 → 部分泄漏,通常是某些程序绕过了代理。
修复清单:
- 启用 fake-ip。这是最有效的一步,本地不再做境外域名解析。
- 开启 TUN 模式。系统代理模式下,不遵守代理设置的程序会直接发 DNS 查询到本地网络;TUN 能在网络层截获它们。
- 打开 TUN 的 DNS 劫持。Clash Verge Rev 的 TUN 设置里有
dns-hijack,保持默认的any:53,它会把所有发往 53 端口的查询都拉进客户端处理。 - 关闭浏览器自带的安全 DNS。Chrome 和 Firefox 有内置的 DoH 开关,开着会绕过客户端。在浏览器设置里搜索「安全 DNS」并关闭。
- 关闭 Android 的「私人 DNS」。系统设置 → 网络 → 私人 DNS,设为「关闭」,否则会和客户端的 DNS 配置打架。
- 检查 hosts 文件。手写条目优先级最高,残留的错误条目会导致解析到错误地址。
分平台清理 DNS 缓存
改完配置后务必清缓存,否则测的还是旧结果:
Windows
ipconfig /flushdns
macOS
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Linux(systemd-resolved)
sudo resolvectl flush-caches
浏览器:Chrome 系在地址栏访问内部的 DNS 设置页面清理,或者直接完全退出浏览器再打开。
客户端自身:重载配置或重启客户端。
路由器:重启。如果你在路由器上配过 DNS,它的缓存会影响全家设备。
按症状解决
某些网站一直打不开,换节点也没用
典型的污染。如果你还在用 redir-host,改成 fake-ip 基本立刻解决。已经是 fake-ip 仍然不行,检查该域名是不是被误加进了 fake-ip-filter,或者有 hosts 条目残留。
国内网站能打开但很慢
分流解析没配好,国内域名被境外解析器解析到了境外 CDN。用上面配置里的 nameserver-policy 把国内域名明确指向国内解析器,并确认 fallback-filter 的 geoip 为 true。
提示 DNS 解析失败 / DNS_PROBE_FINISHED_NXDOMAIN
先看 default-nameserver 是不是填了域名而非 IP(死循环),再看配置里的 DoH 地址能否访问。临时把 nameserver 改成明文 223.5.5.5 测试,能通就说明是 DoH 上游的问题。
开着代理时内网设备、NAS、打印机访问不了
fake-ip 把内网域名也返回了假 IP。把 *.lan、*.local 和你的内网域名后缀加进 fake-ip-filter,同时在规则里加上内网网段的直连规则(记得带 no-resolve),写法见 自定义规则教程。
某个游戏或语音软件在代理下异常
这类软件常用 UDP 直连并依赖真实 IP。把它的服务器域名加进 fake-ip-filter,并在规则里给它指定合适的策略。
订阅更新时提示无法解析主机
机场订阅域名的解析出了问题。临时把 DNS 改成明文公共解析器再试,或直接用「经过代理更新」绕开本地解析,详见 订阅更新失败怎么办。
最容易配错的五个地方
default-nameserver填了域名。必须填明文 IP,否则解析上游时陷入死循环,表现为客户端启动后完全无法解析任何域名。- 把所有域名都交给境外 DoH。国内网站会变慢且可能解析到境外 CDN,见 延迟高、网速慢怎么办。
- fake-ip-filter 忘了加网络检测域名。系统的网络连通性检测会失败,Windows 可能显示「无 Internet 访问」,尽管你实际能上网。
- 开着 IPv6 但宽带没有 IPv6。大量 AAAA 解析结果不可达,连接要等超时后回退,首屏明显变慢。没有真正的 IPv6 就设
ipv6: false。 - 改完不重载配置。DNS 配置属于内核级设置,不重载不生效,很多人以为配置没用其实是根本没生效。
配完之后,用一次泄漏检测和几个之前打不开的网站验证效果。如果开着客户端连国内网站都打不开,那不是 DNS 问题,看 Clash 开了却上不了网。