彻底搞懂 Fake-IP:从 DNS 机制到 OpenClash + AdGuard Home 最优解
前言
随着折腾次数越多,对于DNS的理解也逐渐加深,在新手时期觉得“聪明人不做选择题”,“我全都要”的想法渐渐改变。
特别是在于DNS解析这块,并不是前置解析越快越好,尤其是在OpenClash的FakeIP模式下。
原理概述
其中主要的原因也就是因为网络技术的发展,大多数科学上网都是FakeIP模式,基于这个基础,给还在使用FakeIP模式的同学一点建议。
工作原理与核心区别
Redir-Host(真实 IP 模式)
在传统代理模式下,客户端发起网络请求的完整流程如下:
本地解析: 客户端请求解析
example.com,代理内核拦截并向远端/上游 DNS 发起查询。返回真实 IP: 代理内核获取到该域名的真实 IP(例如
93.184.216.34)并返回给客户端。发起连接: 客户端向
93.184.216.34发起 TCP/UDP 握手,流量被代理内核拦截。反向推断与分流: 代理内核需要检查这个 IP 对应哪个域名,判断是否走代理节点(如果匹配不到规则,可能需要节点端再次解析)。
Fake-IP(伪造/虚假 IP 模式)
Fake-IP 打破了先查 DNS 再连网络的逻辑:
即时分配假 IP: 客户端请求解析
example.com时,代理内核完全不向上游查询,而是立刻从保留私网地址池(如198.18.0.0/16)中随机分配一个未被占用的伪造 IP(例如198.18.0.2)返回给客户端。记录映射关系: 内核在本地内存中存下一张临时映射表:
198.18.0.2 <-> example.com。发起连接: 客户端毫不犹豫地向
198.18.0.2发起 TCP/UDP 连接,流量到达代理内核。域名级代理转发: 内核查表还原出原始域名
example.com,命中规则后直接把域名打包发给远端代理服务器,由远端服务器在境外机房完成 DNS 解析并建连。
为什么 Fake-IP 明显比 Redir-Host 更快?
DNS 响应几乎瞬间完成
fake-ip 模式下,核心收到查询后不立刻去上游查真实 IP,而是直接从本地假 IP 池分配一个并返回。客户端马上就能发起 TCP/UDP 连接。
redir-host 必须等上游 DNS(nameserver / fallback)返回真实结果,这个过程有网络往返延迟(实测常见 45–120 ms)。可能节省一次本地解析
如果最终判定需要走代理,真实解析可以放到远端节点完成,本地就少了一次 DNS 查询。对需要代理的站点,首包时间更短。
规则匹配更直接、减少等待
域名信息一直保留在核心内部映射表里,DOMAIN 类规则命中更快、更准,减少因为 IP 变化或污染导致的重试。
实测情况就是:Fake-IP 首次 DNS 解析延迟接近 0,而 Redir-Host 有明显等待;吞吐量和内存差异很小。
对比及区别
| 对比项 | Fake-IP | Redir-Host |
|---|---|---|
| 返回给客户端的 IP | 假 IP(通常是 198.18.0.0/15 或 /16 私有段) |
真实 IP(上游 DNS 解析结果) |
| 真实解析时机 | 客户端发起连接后,由核心根据规则再解析(可在出口节点解析) | 客户端发起 DNS 查询时就立刻真实解析 |
| 规则匹配依据 | 直接用域名匹配(DOMAIN / DOMAIN-SUFFIX 等),最精确 | 先拿到真实 IP,再靠反向映射或嗅探(SNI/Host)恢复域名,精度略低 |
| DNS 泄漏风险 | 极低(本地几乎不发起真实域名查询) | 较高(本地会真实查询,需额外规则/加密 DNS 防护) |
| 兼容性 | 少数应用/设备对假 IP 不兼容(需 fake-ip-filter 排除) |
更好,接近传统 DNS 行为 |
| CDN / GEOIP | 依赖出口解析,国内 CDN 可能略差 | 拿到真实 IP 后 GEOIP 更准确 |
| 首次请求延迟 | 接近 0(本地直接返回假 IP) | 需要等上游 DNS 返回(通常几十到上百 ms) |
当然也不是Fake-IP就一定好,只是大多数情况下,首选都是Fake-IP,可能遇到的问题是部分银行App 无法登录(至少目前我没有遇到过这类问题),就需要单独再配置 fake-ip-filter 来解决,而使用Redir-Host相对兼容性更强。
FakeIP模式DNS的建议
了解了上面的基础之后,我们就可以得到一个结论:
两者目标冲突,在纯 fake-ip 模式下,直接把 SmartDNS / MosDNS 当上游通常是多余的,甚至有害。它们的设计目标是“在本地选出最优的真实 IP”。但在 Fake-IP 模式下,本地根本不产生真实 IP(对于代理流量),优化目标自然就不存在了。 它们更适合作为 Redir-Host 模式的上游,或者用来处理必须直连的域名(作为 fake-ip-filter 的解析器)。
很多人喜欢把MosDNS放在 Clash 前面做前置分流: MosDNS 先根据域名列表决定“国内域名返回真实 IP、国外域名返回假 IP”,再把假 IP 流量交给 Clash。这种“fakeip 分流大法”能让国内流量完全绕过代理核心,体验更好,但配置复杂,得到的收益也不明显,我个人而言不建议。
FakeIP模式DNS的应用
OpenClash独立使用
OpenClash的 nameserver 填写国内公共DNS即可,fallback + nameserver-policy不填,并且开启DNS劫持即可。
这是最基础的应用,只要科学上网即可。
OpenClash搭配AdguarHome广告过滤
安装AdguardHome;
将OpenWrt的DNS监听端口改为其他,比如
5353;打开AdguardHome配置界面
设置DNS监听端口为
53上游DNS设置为OpenClash的
127.0.0.1:7874关闭DNS缓存(FakeIP模式下不需要缓存,因为都是假IP)
备用DNS不要填,留空
Bootstrap DNS填写运营商DNS或者国内公共DNS
关闭OpenClash的DNS劫持
OpenClash的
nameserver填写国内公共DNS,fallback+nameserver-policy不填
这套架构之所以能完美运转,是因为它把网络逻辑切分成了两个明确的阶段:
阶段 1(DNS 查询层): 由 AdGuard Home 先行拦截做规则过滤,放行后的请求交给 OpenClash 赋予 Fake-IP;
阶段 2(流量转发层): 客户端拿到 Fake-IP 发起真正的网络连接时,由 OpenClash 依照分流规则把流量推向代理或直连。
因此,达到科学上网的同时又能兼顾广告过滤的效果。
这套架构在我的ESXI虚拟设备上完美运行。
但是在我办公室那台用红米AX6000刷的OpenWrt设备上,需要重启一下才行。
结论
网络架构的搭建从来不是“插件套得越多就越快”,清晰的边界与合理的职责划分才是稳定和低延迟的基石。
回顾整片文章,其高效的核心逻辑在于“各司其职,把 DNS 做减法”:
AdGuard Home 专注于判定与拦截: 站在流量的最前端,通过纯粹的黑名单规则阻断广告域名,将不需要的无效请求直接掐死在摇篮里;
Fake-IP 消除了首屏等待: 代理内核不再进行繁冗的本地双重解析,以小于 1ms 的极速响应生成假 IP,将真正的海外 DNS 解析彻底转交至远端节点,天然杜绝了本地污染;
砍掉冗余的 DNS 中间件: 不再引入 SmartDNS 或 MosDNS 搞多层并发测速,既规避了国内 CDN 乱跳、跨运营商调度的负优化,也彻底消除了潜在的 DNS 环路风险。
当 AdGuard Home 做好门卫、OpenClash 接管路由,整套拓扑便能在兼顾去广告与科学上网的同时,榨干宽带的每一毫秒延迟。很多时候,软路由网络配置最好的优化,恰恰就是学会做减法。
