三层结构:内核、客户端与规则集
Clash 生态里的项目可以归成三层:内核负责解析配置、建立连接、执行分流,是唯一真正处理流量的部分;客户端提供窗口、托盘、订阅管理与进程守护,本身不解析规则;规则集与数据文件只是名单,由内核在运行时读取。三层之间通过两种文件交互——一份 YAML 配置,和一批规则数据。
分层的意义在于定位问题。订阅更新失败、连接建立不了、某些域名走错分支,这三类故障分别落在客户端、内核、规则集上。先判断故障属于哪一层,再去对应的仓库找答案,比在客户端里反复点开关有效得多。
先记住一条对应关系
配置能不能跑起来由内核决定,界面好不好用由客户端决定。同一份配置在 A 客户端正常、在 B 客户端报错,先对比两者内置的内核名称与版本,而不是怀疑配置写错了。
内核主线:原版 Clash、Clash Premium 与 mihomo
原版内核与它的维护终点
原版内核指 Dreamacro/clash,Go 编写。现在通用的 proxies、proxy-groups、rules 这套 YAML 结构就是它定下来的,所有客户端读取的配置格式都源自这里。2023 年 11 月前后,原版内核停止更新,仓库转为只读,同一时期 Clash for Windows 也从 GitHub 下线。
它的能力边界需要记清楚:不支持 rule-providers、proxy-providers 与 tun,出站协议以 Shadowsocks、VMess、Trojan、Snell 为主,规则类型集中在 DOMAIN、DOMAIN-SUFFIX、IP-CIDR、GEOIP、MATCH。配置里只要出现 tun: 字段,原版内核会直接报错退出。
Clash Premium:闭源二进制,随主线一起下线
Clash Premium 是原作者发布的闭源免费内核,补上了 tun、script、rule-providers、proxy-providers 四项能力,一度是 macOS 上 TUN 模式的主要选择。它的分发随原版主线一起停止,现在提到它只剩历史价值:教程里如果写「请使用 Premium 内核」,那份文档大概率停在 2023 年之前。
Clash.Meta 与 mihomo:当前的事实主线
MetaCubeX 维护的 Clash.Meta 以原版为基底补齐协议与配置能力,2024 年初更名为 mihomo,仓库地址为 MetaCubeX/mihomo,可执行文件名与默认配置目录同步改为 mihomo。目前仍在更新的客户端,内置内核基本都是它或它的下游。
相对原版,mihomo 的增量集中在四块:
- 出站协议:VLESS、Hysteria、Hysteria2、TUIC、WireGuard、SSH、ShadowTLS;
- 配置能力:
sub-rule、逻辑规则(AND / OR / NOT)、listeners、sniffer、find-process-mode、geox-url; - 规则集格式:除 YAML 与 text 外,支持体积更小、加载更快的
mrs二进制格式; - 数据文件:除
geoip.dat外可用geoip.metadb,支持按 ASN 匹配。
兼容方向是单向的:原版能跑的配置基本可以直接放到 mihomo 上运行,反过来不成立。迁移时先用 mihomo -t -f config.yaml 校验一遍,哪些字段超纲一目了然。
| 配置项 | 原版 Clash | Clash Premium | mihomo |
|---|---|---|---|
| proxies / proxy-groups / rules | 支持 | 支持 | 支持 |
| rule-providers / proxy-providers | 不支持 | 支持 | 支持 |
| tun(虚拟网卡) | 不支持 | 支持 | 支持 |
| script(JavaScript 覆写) | 不支持 | 支持 | 支持 |
| VLESS / Hysteria2 / TUIC | 不支持 | 不支持 | 支持 |
| 逻辑规则 / sub-rule / listeners | 不支持 | 不支持 | 支持 |
| mrs 规则集格式 | 不支持 | 不支持 | 支持 |
客户端层:谁在维护,谁停在 2023 年
客户端不定义配置格式,只决定三件事:内置哪个内核、配置文件放在哪、界面上暴露哪些开关。所以选客户端的第一件事是看内核来源,第二件才是界面习惯。
| 客户端 | 平台 | 内置内核 | 状态 |
|---|---|---|---|
| Clash Verge Rev | Windows / macOS / Linux | mihomo | 活跃 |
| FlClash | Windows / macOS / Linux / Android | mihomo | 活跃 |
| Clash Nyanpasu | Windows / macOS / Linux | mihomo | 维护中 |
| ClashMetaForAndroid | Android | mihomo | 活跃 |
| OpenClash | OpenWrt | mihomo | 活跃 |
| Clash for Windows 0.20.39 | Windows | 原版内核 | 2023 年 11 月停更 |
| ClashX / ClashX Pro | macOS | 原版内核 / Premium | 停更 |
| Clash for Android | Android | 原版内核 | 停更 |
Clash Verge 原仓库停更后由社区接手为 Clash Verge Rev,内核换成 mihomo,订阅管理与 profile 的组织方式延续下来。桌面端如果还在用 Clash for Windows,换到基于 mihomo 的客户端是改动最小的一步:YAML 本身不用动,把配置重新导入一次即可。
iOS 是另一条路径
iOS 上没有直接复用 Clash 内核的客户端。App Store 上的 Stash 一类应用是自己实现规则引擎,只读取 Clash 风格的 YAML。「iOS 能导入 Clash 配置」说的是格式兼容,不是内核相同。判断方式很直接:tun、script、rule-providers 这些字段在 iOS 上支持到什么程度,以各 App 自己的文档为准,不能拿桌面端的经验直接套。
配置目录:内核默认值与客户端托管
内核单独启动时,原版默认读取 ~/.config/clash/,Windows 下展开为 %USERPROFILE%\.config\clash\;mihomo 改为 ~/.config/mihomo/。带界面的客户端通常接管这件事,例如 Clash Verge Rev 把 profile 与规则缓存放在自己的应用数据目录(Windows 下为 %APPDATA%\io.github.clash-verge-rev.clash-verge-rev\),覆盖安装不会清掉订阅。排查问题时,先确认内核实际读的是哪份文件,比反复检查 YAML 更有效。
规则集与数据文件:更新最频繁的一层
规则集是纯名单,不含任何网络实现。内核通过 rule-providers 拉取名单并用 RULE-SET 引用,或者通过 GEOSITE、GEOIP 读取编译好的 dat 文件。这一层更新最频繁,也最容易被误当成内核的一部分。
常用的几个仓库:
Loyalsoldier/clash-rules:按 domain 与 ipcidr 分组的 rule-provider,release 分支提供reject.txt、direct.txt、proxy.txt、gfw.txt、cncidr.txt等文件,可以直接写进rule-providers;blackmatrix7/ios_rule_script:按服务拆分的规则集,路径形如rule/Clash/<服务名>/<服务名>.yaml,流媒体与 AI 服务的细分名单基本都能找到;MetaCubeX/meta-rules-dat:为 mihomo 编译的geosite.dat、geoip.dat、geoip.metadb与country.mmdb,同时提供 mrs 格式的单条规则集,上游数据来自 v2fly 的 domain-list-community;ACL4SSR/ACL4SSR:以ACL4SSR_Online.ini为代表的规则模板,通常配合订阅转换工具使用;tindy2013/subconverter:把非 Clash 格式的订阅链接转换成 Clash YAML,只做格式转换,不参与运行。
rule-providers:
reject:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
cn-domain:
type: http
behavior: domain
format: mrs
url: "https://github.com/MetaCubeX/meta-rules-dat/raw/meta/geo/geosite/cn.mrs"
path: ./ruleset/cn.mrs
interval: 86400
rules:
- RULE-SET,reject,REJECT
- RULE-SET,cn-domain,DIRECT
- GEOSITE,geolocation-!cn,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY
这段配置里,format: mrs 只有 mihomo 能读;interval: 86400 的单位是秒,即每 24 小时检查一次名单更新。rules 段按从具体到宽泛的顺序排列,命中即停,最后一条 MATCH 兜底,这也是判断一份配置是否完整的最低要求。
GEOSITE / GEOIP 与 RULE-SET 的取舍
GEOSITE、GEOIP读本地 dat 文件,匹配在内存中完成,速度快,代价是整包体积大、更新粒度是整份数据库;RULE-SET按 provider 拉取单个名单,粒度细、可替换,代价是每个 provider 一次 HTTP 请求与一份本地缓存;- mihomo 里
geodata-mode: true时 GEOIP 规则读geoip.dat,默认走country.mmdb;配合geox-url可以把数据源指向镜像地址,避免下载失败。
规则集与内核是两条更新线
规则集仓库停更不会让内核报错,只会让新域名走错分支;内核升级也不会自动替换你写死的规则集地址。与其依赖订阅每次自动更新,不如每季度看一眼所引用仓库的最近提交时间。
配置兼容性:一份可执行的检查顺序
- 先看内核名与版本。客户端设置里显示
mihomo或Clash.Meta的属于 Meta 分支;只写Clash、更新时间停在 2023 年的,是原版内核。 - 再查高阶字段。配置里出现
tun、rule-providers、proxy-providers、script、listeners、sub-rule中任意一项,原版内核就会直接报错退出。 - 用内核自带的校验参数跑一遍:
mihomo -t -f config.yaml只解析不启动,原版内核同样支持-t。 - 读日志里的第一条错误。
unsupported proxy type指向协议,unsupported rule type指向规则,两者都是内核版本问题,改配置写法没有用。 - 最后看端口。确认
mixed-port(常见写法 7890)与external-controller(常见写法 127.0.0.1:9090)没有被占用;能打开面板说明内核已经正常启动,剩下的问题都在规则层。
别用「能导入订阅」判断兼容性
导入只验证 YAML 语法能不能解析。tun、协议类型、规则类型这些字段是否被内核识别,要等内核真正启动才会暴露出来。
该关注哪个仓库
按使用场景对应到具体仓库:
- 桌面端日常使用:关注客户端自己的 release 节奏,内核更新跟着客户端走;需要单独升级时,在客户端的设置里找到内核版本区块手动更新。
- 需要 TUN、VLESS、Hysteria2 或逻辑规则:以
MetaCubeX/mihomo仓库与它的官方文档为准,配置字段以文档为准,不要以旧教程为准。 - 路由器:OpenWrt 用 OpenClash,或通过 SSH 部署 ShellClash,两者内置的都是 mihomo。
- 分流准确性:
Loyalsoldier/clash-rules负责按需拉取的名单,MetaCubeX/meta-rules-dat负责 dat 与 mrs 数据,这两个仓库的提交时间决定了新域名能不能被正确分流。 - 订阅格式转换:subconverter 或 Sub-Store,只做格式转换,不参与运行。
判断一个 Clash 相关仓库是否还值得关注,看三点就够了:最近一次提交时间、README 里写明的内核依赖、issue 区是否还有维护者回复。三层结构里任何一层停更,影响范围都只落在这一层——内核停更影响协议与配置字段,客户端停更影响系统集成与界面,规则集停更影响分流准确度。把这三件事分开看,就不会因为某个客户端下线而怀疑整份配置作废。