Windows 11 上折腾 Mihomo Party 和 FlClash:一次 DNS / WebRTC 泄露排查记录
自用备忘|记录于 2026-11-05
环境:Windows 11;Mihomo Party(也常被称为 Clash Party);FlClash 0.9.x;Mihomo 内核。
使用项目:Niklaus88 / Clash-Config。
本文根据一次真实排查整理,菜单名称可能随客户端版本变化。截图中的公网 IP 已做遮挡。
先说结论:下次只记住这 5 点
- 开启 TUN 不等于 DNS / UDP 就一定不会绕过代理。 尤其 Windows 11,值得检查
strict-route。 - 使用 Niklaus88 的分流脚本时,要用「规则(Rule)」模式,而不是「全局(Global)」模式。 全局模式下不能指望脚本中的 WebRTC 拦截分流规则生效。
- Mihomo Party: 将 JS 覆写绑定到现有机场订阅,切换到规则模式后,这次的 DNS 检测从国内解析出口变成了 Cloudflare,WebRTC 测试没有再返回真实公网 IP。
- FlClash 0.9.x: 脚本策略组出现不代表 DNS 接管一定正常。这次最终配置已经有 Cloudflare DNS,但开启 「严格路由」 后,检测才从中国联通变成 Cloudflare;同时补齐了 UDP / TCP 的 53 端口劫持。
- WebRTC 显示「连接错误」不一定是坏事。 如果
WebRTC防护选的是REJECT-DROP,STUN 探测被阻断可能正是预期效果;重点是不要再显示真实公网 IP。
注意:DNS 检测显示 Cloudflare、WebRTC 探测连接失败,只能说明这次测试未发现相应泄露,并不等于所有程序、协议和网络环境都获得绝对防护。
一、从哪里开始:加载 Niklaus88 的 JS 规则
项目地址:https://github.com/Niklaus88/Clash-Config
通用脚本:https://raw.githubusercontent.com/Niklaus88/Clash-Config/main/clash-script.js
我原本已经有机场订阅,只想在现有节点上增加分流、DNS 与 WebRTC 防护,因此使用通用 JS 覆写脚本,而不是直接用仓库里的完整 YAML 替换机场配置。
这份 JS 并非只追加一两条规则:它会生成/改写代理组、分流规则及 DNS 等配置。动手前先备份原订阅配置,别把它当成零风险的“小补丁”。
在 Mihomo Party(Clash Party)中
- 打开左侧 「覆写」,通过链接或本地文件导入
clash-script.js。 - 进入 「订阅管理」,找到现有机场订阅,点右上角 「⋮」→「编辑信息」。
- 在 「覆写」 一栏选中刚导入的 JS 脚本,保存,再重新激活该订阅。
- 进入 「代理组」,确认出现
WebRTC防护、节点选择、漏网之鱼等策略组。 - 选择真实可用的节点,将运行模式设为 「规则(Rule)」,
WebRTC防护选REJECT-DROP。 - 启用 TUN(虚拟网卡);不要同时运行另一个可能争夺系统代理或 TUN 的客户端。
这次踩到的坑: 刚开始用「全局模式」排查,虽然网页公网 IP 已经是台湾出口,但 DNS / WebRTC 仍有异常。切回「规则模式」后,DNS 检测变为 Cloudflare,WebRTC 探测显示连接错误。这是我在 Mihomo Party 上最终保留的模式。
二、我看到的“DNS 泄露”和 WebRTC 异常是什么样
一开始 DNS 检测返回中国联通的解析出口,和所选境外代理出口不一致。

之后曾出现更明显的对照:浏览器网页出口在台湾,但 WebRTC STUN 测试返回中国联通公网地址;DNS 同时显示中国大陆解析出口。 这证明仅看网页 IP 正常是不够的。


随后在规则模式 + WebRTC防护 = REJECT-DROP 的检测中,几个 STUN 服务器返回「连接错误」,没有返回中国联通公网地址。

这种报错需要结合策略来判断:如果我们主动丢弃 STUN,连接错误可能意味着阻断奏效,不是“测试出错所以一定发生了泄露”;反过来,它也不能保证其他 WebRTC 场景或其他应用绝不泄露。WebRTC 会议/通话可能因拦截而受影响。
三、FlClash 0.9.x:脚本策略组有了,DNS 怎么还是中国联通?
换到 FlClash 后,JS 脚本的策略组已经出现,但 DNS 检测还是中国联通。我最初怀疑 FlClash 没加载好 DNS,想在 「工具 → 进阶配置 → DNS」 中手动添加 Nameserver。
后来发现:这个 DNS 覆写页面是空的,并不代表没有 DNS 配置。 FlClash 0.9.x 采用逐项覆写机制;在这里新增字段,反而可能覆盖 JS 或订阅已有的值。

于是我检查了当前订阅的 「最终配置(Final config)」。主要 DNS 字段已经正确写入:
# 从当时的最终配置摘取,省略无关字段
dns:
enable: true
listen: "127.0.0.1:1053"
enhanced-mode: "fake-ip"
respect-rules: true
nameserver:
- "https://1.1.1.1/dns-query"
- "https://8.8.8.8/dns-query"
- "https://8.8.4.4/dns-query"
proxy-server-nameserver:
- "https://223.5.5.5/dns-query"
- "https://doh.pub/dns-query"
direct-nameserver:
- "https://223.5.5.5/dns-query"
- "https://doh.pub/dns-query"
nameserver-policy:
geosite:private,cn:
- "https://223.5.5.5/dns-query"
- "https://doh.pub/dns-query"
这里的 listen: 127.0.0.1:1053 是 Mihomo 本地 DNS 服务监听端口,不等于 TUN 无法劫持 53 端口。而 nameserver 有 Cloudflare / Google,也不意味着每次 DNS 查询都会用它们:direct-nameserver、proxy-server-nameserver 和 nameserver-policy 还专门指定了国内上游。
因此不能只根据“中国 DNS 出现了”就认定某一个字段错了。接下来要看 TUN 实际接管方式。
四、真正有效的修复:FlClash 打开「严格路由」
当时 FlClash 的最终 TUN 配置大致是:
# 修改前的关键项
tun:
enable: true
device: "FlClash"
stack: "gvisor"
dns-mode: ""
dns-hijack:
- "any:53"
auto-route: true
auto-detect-interface: true
# 当时没有 strict-route: true
我做了两处调整:
① 打开「严格路由(Strict Route)」
FlClash → 工具 → 进阶配置 → TUN(部分界面归在网络配置)→ 添加覆写项 → 严格路由 → 开启。

② DNS 劫持保留两项
点击 「DNS 劫持」,保留 any:53,再增加 tcp://any:53,点击右上角 ✓ 保存。

最终需要在「最终配置」中核对这些关键值(只是片段,不要替换整份配置):
tun:
enable: true
stack: gvisor
auto-route: true
auto-detect-interface: true
strict-route: true
dns-mode: ""
dns-hijack:
- any:53
- tcp://any:53
实测结果:在开启严格路由后,FlClash 的 DNS 检测从中国联通变成了 Cloudflare,WebRTC 的 STUN 测试也显示「连接错误」且未返回真实公网 IP。 我同时补齐了 TCP 53 劫持,所以不把本次结果写成“单独某一项百分之百解决一切”;不过从操作与结果的先后顺序看,严格路由是这次最明显的转折点。
两个容易搞错的点
dns-mode: ""并不表示 Windows 下 DNS 模式错误。 Mihomo 文档说,在 Windows 上启用auto-route时,留空默认采用旧版hijack行为;这次没有改它。- 不建议顺手删掉
route-exclude-address的局域网网段。 它们可能涉及局域网设备、路由器等可达性;如果真的怀疑路由器 DNS 绕行,应结合 Windows 实际 DNS 地址与连接日志验证。
五、我最终保留的配置速查表
| 项目 | Mihomo Party | FlClash 0.9.x |
|---|---|---|
| JS 规则 | 绑定 clash-script.js 覆写 | 当前配置已正确应用同一 JS 脚本 |
| 模式 | 规则(Rule) | 规则(Rule) |
| 代理节点 | 选择真实可用节点 | 选择真实可用节点 |
| TUN | 开 | 开 |
自动路由 auto-route | 检查开启 | true |
严格路由 strict-route | Windows 上建议检查 | true(这次的关键改动) |
| DNS 劫持 | 检查 UDP/TCP 53 | any:53、tcp://any:53 |
| WebRTC 防护 | REJECT-DROP | REJECT-DROP |
| DNS 最终配置 | 由 JS / 客户端合并生成 | 已确认载入 Cloudflare / Google DoH |
| 检测结果 | DNS 显示 Cloudflare,STUN 阻断 | DNS 显示 Cloudflare,STUN 阻断 |
本文没有保存修复后的 DNS 检测截图;“恢复为 Cloudflare”是当时重新检测后记录的结果。上面的国内 DNS 截图均为修复之前的状态,不要误当成最终效果。
六、以后出问题,按这个顺序排查
第 1 步:先确认网页公网 IP。 使用 IPCheck.ing 或 IP.SB,看是否为自己选择的代理出口。检测网页 IP 正常不代表 DNS / WebRTC 也正常。
第 2 步:确认处于规则模式。 特别是脚本里依赖 DST-PORT、DOMAIN-KEYWORD 等规则阻断 STUN 的场景。全局模式不会按普通规则列表进行这类分流。
第 3 步:看策略组有没有。 如果没有 WebRTC防护、漏网之鱼 等组,先检查 JS 覆写是否绑定并成功运行;如果有,再检查最终 dns: 和 tun:,别急着叠加新的覆写。
第 4 步:Windows 上检查 TUN、严格路由和 DNS 劫持。 重点是 auto-route: true、strict-route: true,以及 UDP/TCP 53;如果启用严格路由后局域网、虚拟机或其他 VPN 异常,就撤销这一项并进一步排查路由冲突。
第 5 步:检查浏览器自身的 DNS。 Chrome/Edge 可能启用安全 DNS(DoH);常规 53 端口劫持无法直接拦截所有加密 DNS。必要时临时关闭浏览器安全 DNS 做对照测试,测完再决定是否恢复。
第 6 步:WebRTC 看 IP,不要只看红字。 REJECT-DROP 下连接失败可能是合理结果;但如果显示了与代理出口不同的真实公网 IP,就要排查 UDP 路径、代理模式和浏览器设置。
第 7 步:一次只运行一个代理客户端。 Mihomo Party 和 FlClash 不要同时争夺 TUN、系统代理或 DNS 接管。每次修改后保存、重新应用配置,必要时重启浏览器再测。
七、这次真正学到的东西
过去我以为“网页 IP 已经变成境外 + TUN 开启 = 没有泄露”。这次实测才发现,节点出口、分流模式、DNS 上游、系统 DNS 劫持、WebRTC UDP 拦截,是不同层面的问题。同一份 JS 在两个客户端上,最终效果也可能因为客户端配置合并、Windows 路由设置不同而不一样。
下一次如果重新安装 Windows、重装 FlClash 或更换机场,我就按这篇文章的速查表恢复,不再盲目堆 DNS 地址或反复切换全局模式。
参考资料
- Niklaus88 / Clash-Config 项目与脚本说明
- Mihomo Party:覆写使用说明
- FlClash 官网与 0.9.0 更新说明
- Mihomo 官方文档:TUN、Strict Route、DNS Hijack
说明:这是一份个人环境中的排障记录,不是所有 Windows 11 / Clash 客户端的通用安全保证;不同版本或网络环境可能需要调整。