深入剖析 Clash / Mihomo Fake-IP 与 TUN 模式:从 DNS 泄露根治到全链路数据流实战

深入剖析 Clash / Mihomo Fake-IP 与 TUN 模式:从 DNS 泄露根治到全链路数据流实战
kikock现象切入:一个令无数开发者困惑的排网谜团
在配置好本地 Clash Verge Rev / Mihomo 并开启内核 TUN 模式后,在终端执行以下网络诊断命令:
1 | # 查询自定义域名解析 |
然而在浏览器中输入该网址,却能瞬间顺畅秒级渲染!
为什么 nslookup 拿到的是一个奇特的 198.18.x.x 地址?为什么指定阿里 DNS 223.5.5.5 依然查不出来?真实的 IP(182.136.15.18)到底在什么时候由谁去查询的?DNS 泄露又是如何被根除的?
本文将通过动态流转沙盒与原生 GUI 全景联动控制台,带你从 Windows 内核、TUN 网卡驱动、Clash 虚拟内存池到境外 VPS 出口,彻底拆解这套现代网络核心架构。
🚀 交互式数据流沙盒 (支持「海外代理」与「国内直连」双场景模拟)
操作提示:点击下方「🌍 海外模式」或「🇨🇳 国内模式」按钮切换场景,再点击「开始模拟」,即可动态见证 Fake-IP 在境外代理(本机 0 DNS 查询,海外 VPS 代查)与境内直连(延迟真实解析,握手时查国内 DoH)之间的本质分水岭:
⚡ 端到端数据流转动态仿真 (双路由沙盒)
直观对比:海外代理 与 国内直连 在 Fake-IP 模式下的关键分水岭
测试域名:
分流策略: 走海外代理策略组
1
应用发起解析
getaddrinfo 发起 DNS
2
Clash 分配假 IP
0ms 秒回 198.18.1.144
3
TUN 内核劫持
向假 IP 建立 TCP 握手
4
核心逆向查表
假 IP 还原原始域名
5
海外 VPS 远端代查
域名进加密隧道出海
[READY] 系统仿真器就绪,当前为【海外模式】。点击右上角「开始模拟」或切换模式。
一、为什么会有 Fake-IP?(解决什么根本痛点)
在早期传统的代理客户端中,普遍采用的是 Redir-Host 模式:
- 致命的握手时延:浏览器想要访问
google.com,本地必须先通过公网发起一次真正的 DNS 解析。即便通过代理查远端 DNS,也必须先承担一个完整的跨国 RTT(200~400ms)才能拿到真实 IP 开始建立连接。 - 严重的 DNS 泄露与污染:如果向本地运营商发起解析,访问的目标网站明文瞬间在本地宽带被记录,并极易遭遇投毒阻断。
- 域名丢失:当应用程序拿到真实 IP 发出网络包后,网卡上只有四层目标 IP,原始域名丢失,代理软件只能吃力地依赖反向域名嗅探(Sniffing)。
Fake-IP 的颠覆性设计哲学:【假 IP 换真时效,延迟真实解析】
- Clash 在本机直接充当首选 DNS 服务器。
- 任何应用来查 DNS 时,Clash 根本不向公网发出任何查询包,而是直接从保留网段
198.18.0.0/16抓取一个未占用的假 IP(如198.18.1.144),并在本地内存构建映射字典:
$$\text{198.18.1.144} \longleftrightarrow \text{870306666.xyz}$$ - 这一过程完全发生在本地内存中,耗时通常小于 0.5 毫秒!
二、端到端完整链路生命周期(TUN 模式实战)
图表渲染说明:本节包含交互式动态时序图与 10 大核心流转阶段深度拆解。
📊 TUN + Fake-IP 全链路时序流转图
Mermaid 矢量实时渲染
sequenceDiagram
autonumber
actor User as 用户程序 (如 Chrome)
participant Kernel as Windows 内核网络栈 / TUN 虚拟网卡
participant ClashDNS as Clash 内置 Fake-IP DNS 引擎
participant ClashCore as Clash 核心分流路由引擎
participant Remote as 目标服务器 / 远端 VPS 代理节点
User->>Kernel: 1. 解析 870306666.xyz
Kernel->>ClashDNS: 2. 劫持 DNS 查询 (UDP 53)
Note over ClashDNS: 本地内存池分配假 IP
198.18.1.144 映射 870306666.xyz ClashDNS-->>User: 3. 0ms 秒级返回 198.18.1.144 User->>Kernel: 4. 向 198.18.1.144:443 发起 TCP SYN Kernel->>ClashCore: 5. TUN 驱动在内核级抓取该数据包送入 Clash Note over ClashCore: 核心逆向查表还原!
198.18.1.144 => 870306666.xyz alt 规则判定走代理 (海外节点) ClashCore->>Remote: 6a. 将原始域名直接打包进加密隧道发给海外 VPS Remote->>Remote: 7a. 由海外 VPS 在当地出口发起真实无污染解析 else 规则判定走直连 (DIRECT) ClashCore->>ClashCore: 6b. Clash 在握手瞬间调用国内 DoH 查询真实 IP (182.136.15.18) ClashCore->>Remote: 7b. 本机物理网卡与真实 IP 直连握手 end Remote-->>ClashCore: 8. 数据双向回传 ClashCore-->>Kernel: 9. 伪装回 198.18.1.144 的响应报文 Kernel-->>User: 10. 用户程序无缝收到网页内容
198.18.1.144 映射 870306666.xyz ClashDNS-->>User: 3. 0ms 秒级返回 198.18.1.144 User->>Kernel: 4. 向 198.18.1.144:443 发起 TCP SYN Kernel->>ClashCore: 5. TUN 驱动在内核级抓取该数据包送入 Clash Note over ClashCore: 核心逆向查表还原!
198.18.1.144 => 870306666.xyz alt 规则判定走代理 (海外节点) ClashCore->>Remote: 6a. 将原始域名直接打包进加密隧道发给海外 VPS Remote->>Remote: 7a. 由海外 VPS 在当地出口发起真实无污染解析 else 规则判定走直连 (DIRECT) ClashCore->>ClashCore: 6b. Clash 在握手瞬间调用国内 DoH 查询真实 IP (182.136.15.18) ClashCore->>Remote: 7b. 本机物理网卡与真实 IP 直连握手 end Remote-->>ClashCore: 8. 数据双向回传 ClashCore-->>Kernel: 9. 伪装回 198.18.1.144 的响应报文 Kernel-->>User: 10. 用户程序无缝收到网页内容
📌 链路 10 大核心阶段技术解剖表
| 阶段序号 | 发生位置 | 执行动作 | 关键技术机制 | 耗时/网络开销 |
|---|---|---|---|---|
| ① 发起解析 | 用户层 (浏览器) | 调用系统 getaddrinfo 解析域名 |
浏览器按标准 Socket 逻辑查询本机配置的首选 DNS | 极微 |
| ② 内核劫持 | Windows 内核 | TUN 网卡驱动拦截系统发往 53 端口的 UDP 包 | 流量强制送入 Clash 内置 DNS 监听端口 (如 :1053) |
< 0.1ms |
| ③ 分配假 IP | Clash 内存表 | 发现不在黑名单中,秒级应答 198.18.1.144 |
不发任何公网 DNS 包,在内存建立键值对 198.18.1.144 ↔ 870306666.xyz |
0ms (内存) |
| ④ 应用连接 | 操作系统网络栈 | 应用程序信任假 IP,向 198.18.1.144:443 发送 TCP SYN |
假 IP 充当会话句柄(Token),应用以为连接正在建立 | 0ms |
| ⑤ TUN 捕获 | TUN 驱动 / Wintun | 捕获所有 198.18.0.0/16 三层数据包并注入 Clash 核心 |
绕过 Windows 本地代理设置,捕获全局所有进程的流量 | < 0.2ms |
| ⑥ 核心查表 | Clash 路由引擎 | 提取目标 IP 198.18.1.144,反查内存表还原为原始域名 |
彻底解决真实四层流量域名丢失问题,恢复出原始字符串 | 0ms (哈希反查) |
| ⑦a 代理出海 | 海外 VPS 出口 | 原始域名打包进 Shadowsocks / Trojan / Hysteria2 密文包 | 由远端海外 VPS 在境外执行真实无污染 DNS 解析并建立连接 | 1 RTT (跨国) |
| ⑦b 直连握手 | 本地物理网卡 | 若命中 geosite:cn 直连,握手瞬间查国内 DoH |
获得国内真实 IP 182.136.15.18,物理网卡直连国内服务器 |
1 RTT (国内) |
| ⑧-⑩ 双向回传 | Clash 核心回传 | 远端服务器响应数据包经 Clash 核心解密后,伪装回传给应用 | 应用程序完全无感知,顺畅接收到真正的网页与数据 | 极速秒开 |
三、为什么 nslookup 会报错?
- TUN 驱动的全局劫持:开启 TUN 模式后,虚拟网卡抓取全机
0.0.0.0/0的全部出站数据包。即使你显式指定nslookup 870306666.xyz 223.5.5.5,该数据包也根本飞不出物理网卡,而是被 TUN 驱动塞进了 Clash。 - 标准应用 vs 专用诊断工具:
- 浏览器、curl、微信等调用的是标准系统 Socket API(
getaddrinfo),拿到假 IP 后顺畅通过 TUN 与 Clash 完成还原; nslookup属于底层网络诊断工具,它跳过系统 API 自己构造原生 Raw DNS 报文,对报文头部的权威应答标志(AA/RA Flags)有极其严苛的校验,遇到拦截代理环境容易因格式差异抛出Server failed。
- 浏览器、curl、微信等调用的是标准系统 Socket API(
四、Fake-IP 是如何彻底根治 DNS 泄露的?
很多用户常问:“我的本地宽带运营商能不能知道我访问了哪些境外网站?”
在 Fake-IP 模式下,DNS 泄露在物理逻辑上被彻底扼杀:
- 本地发包量为 0:在访问境外域名时,本地电脑根本没有向外界发送任何 DNS 数据包,运营商抓包结果为 0。
- 代理协议远端代查 (Remote DNS):流量送入 Shadowsocks / Trojan / Hysteria2 / TUIC 时,Clash 打包的是原始域名字符串(
DOMAINNAME)。整个数据包通过 TLS 高强度加密飞向海外 VPS,由海外服务器在境外出口完成真实解析。 - 4 大防泄露黄金配置:
no-resolve参数:在 IP 规则上加上GEOIP,LAN,DIRECT,no-resolve,避免规则匹配时在本地提前触发真实解析;- **
ipv6: false**:坚决关闭 IPv6 解析,彻底堵死国内宽带运营商通过 IPv6 旁路窃取明文 DNS 的后门; nameserver-policy+ DoH:国内直连域名走加密的https://dns.alidns.com/dns-query,全程运行在 HTTPS 443 密文中,旁路无法窥探;- 兜底规则走代理:配置末尾保持
MATCH,🌍选择代理节点,未命中域名的流量统一加密出海。
五、终极解惑:真实 DNS 究竟在什么时候、由谁去查?
| 访问目标类型 | 命中分流规则 | 真正查询 DNS 的时刻 | 由谁执行真正的查询? | 本地运营商能否抓到明文? |
|---|---|---|---|---|
| 境外 / 代理域名 | 代理策略组 | 远端 VPS 收到代理包的瞬间 | 海外 VPS 节点(本机完全不查) | 完全无法探知(0 本地 DNS 流量) |
| 境内 / 直连域名 | DIRECT |
浏览器发起 TCP 握手的瞬间 | 本地 Clash 内核 | 仅看到向阿里/腾讯 DoH 的 443 密文 |
| 带 no-resolve 的规则 | GEOIP,LAN,DIRECT,no-resolve |
不触发解析,直接按 IP 匹配 | 不查询 | 无 |
🖼️ Clash Verge Rev 原生界面 (GUI) 与 底层 YAML 实时等高联动对比
操作提示:左侧为 1:1 复刻的 Clash Verge Rev 原生长控制台,右侧为底层 YAML 代码。点击左侧长面板中的任意一个开关或输入框,右侧 YAML 代码将自动平滑滚动并高亮相应的配置字段,并浮现深度技术避坑指南:
六、24 项核心参数深度对照速查表
| 板块 | 界面控件名称 (来自图片) | 客户端长图状态 | 生产配置文件对应行 | 状态评估与架构建议 |
|---|---|---|---|---|
| 基础设置 | 启用 DNS | 🔵 开启 | enable: true (L29) |
完全一致 |
| 基础设置 | DNS 监听地址 | :53 |
listen: "0.0.0.0:1053" (L30) |
推荐保持 1053(避开 53 端口冲突) |
| 基础设置 | 增强模式 | fake-ip |
enhanced-mode: "fake-ip" (L36) |
完全一致 |
| 基础设置 | Fake IP 范围 | 198.18.0.1/16 |
fake-ip-range: "198.18.0.1/16" (L37) |
完全一致 |
| 基础设置 | Fake IP 范围 (IPv6) | fdfe:dcba:.../64 |
未配置 (缺省) | 因关闭 IPv6 不生效,无需配置 |
| 基础设置 | Fake IP 过滤模式 | blacklist |
未显式配置 (内核默认 blacklist) | 实际等效 |
| 基础设置 | IPv6 解析开关 | ⚪ 关闭 | ipv6: false (L31) |
坚决保持关闭(防泄露关键) |
| 基础设置 | 优先使用 HTTP/3 | ⚪ 关闭 | prefer-h3: false (L32) |
完全一致(防 UDP 443 丢包) |
| 基础设置 | 遵循路由规则 | 🔵 开启 | respect-rules: true (L33) |
完全一致 |
| 基础设置 | 使用 Hosts | 🔵 开启 | 未显式配置 (默认 true) | 完全一致 |
| 基础设置 | 使用系统 Hosts | ⚪ 关闭 | use-system-hosts: false (L34) |
完全一致(防系统旧 hosts 污染) |
| 域名分流 | Fake IP 过滤 | 常规列表 | fake-ip-filter: [...] (L38-L50) |
生产配置更优(防 Windows 感叹号) |
| 域名分流 | 域名服务器策略 | 内外 DoH 分流 | nameserver-policy: ... (L62-L68) |
完全一致 |
| 域名分流 | 直连遵循策略 | ⚪ 关闭 | 未配置 (默认 false) | 无需配置 |
| 域名分流 | 默认域名服务器 | 223.5.5.5, 119.29.29.29 | default-nameserver: [...] (L51-L53) |
完全一致 |
| 域名分流 | 域名服务器 | Google / CF DoH | nameserver: [...] (L54-L56) |
完全一致 |
| 回退与代理 | GeoIP 过滤 | 🔵 开启 | 未配置 (Fake-IP 下不依赖) | 由 GEOSITE 精准分流代替 |
| 回退与代理 | GeoIP 国家代码 | CN |
未配置 | 由 GEOSITE 分流代替 |
| 回退与代理 | 回退 IP CIDR | 240.0.0.0/4 等 | 未配置 | 由 GEOSITE 分流代替 |
| 回退与代理 | 回退域名 | Google, FB 等 | 未配置 | 由规则库直接命中,更精确 |
| 回退与代理 | 回退服务器 | (留空) | 未配置 | 均保持留空 |
| 回退与代理 | 代理节点 DNS | 223.5.5.5, 阿里/腾讯 DoH | proxy-server-nameserver: [...] (L57) |
完全一致(拉取节点核心保障) |
| 回退与代理 | 直连域名服务器 | (留空) | 未配置 | 均保持留空 |
| Hosts | Hosts 映射 | 示例占位符 | hosts: {} |
完全一致(日常留空) |
七、总结与最佳实践
- 认准真假 IP:在开启 Fake-IP 后,
nslookup查到198.18.x.x是完全符合协议设计的正常行为,不需要惊慌。 - **切勿在 Windows 强行监听
:53**:在 TUN 模式下,将监听端口改为1053,依靠 TUN 驱动从内核层转发,是兼顾稳定性与权限的最优实践。 - 保持 DNS 覆写关闭:如客户端长图顶部提示所言,直接以维护良好的订阅 YAML 文件为准运行,既能保证节点订阅动态更新,又不会产生未知的配置覆盖冲突。



