规则版mihomoWindowsmacOSLinux安卓
Clash 规则怎么写:从上往下匹配,域名、IP、规则集三类够用
消息头一条 Clash 规则写成「类型,匹配内容,策略」三段,mihomo 从列表顶端逐条比对、命中即停,所以越具体的规则越要往前放,末尾用 MATCH 兜底。
分步
- 先确定要分流的对象是域名、IP 段还是某个程序,选对应的规则类型。
- 按 类型,内容,策略 的格式写一行,策略填 DIRECT、REJECT 或订阅里某个代理组的名字。
- IP 类规则不需要为域名做解析时,在行尾加上 no-resolve。
- 成批的域名或 IP 段改用 rule-providers 引入规则集,再用 RULE-SET 引用。
- 在 Clash Verge Rev 里右键订阅卡片选 编辑规则,把自定义规则加为前置规则;保存后到「连接」页看这条连接命中的是哪条规则。
10 月 17 日讯 自定义规则写进 Clash Verge Rev 的「编辑规则」、Clash Party 的「覆写」或 FlClash 的「扩展」才能长期保留,直接改订阅文件的话,改动会在下次自动更新时被整份覆盖。
一条规则由三段组成
Clash Verge Rev、Clash Party、FlClash、Clash Meta for Android 用的都是 mihomo 内核,规则语法是同一套。配置文件的 rules 下面每一行就是一条规则:
rules:
- DOMAIN-SUFFIX,github.com,节点选择
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,节点选择
逗号隔开的三段分别是:规则类型、匹配内容、命中后交给谁处理(策略)。策略有三种写法:
- DIRECT:不经过代理,从本机网络直接出去。
- REJECT:拒绝这个连接,常用来挡广告和跟踪域名。
- 代理组名:订阅里 proxy-groups 下某个组的 name,比如「节点选择」「自动选择」,流量交给这个组当前选中的节点。代理组是什么见代理组。
有些类型还能在末尾跟一个附加参数,常见的是 no-resolve,后面讲。
顺序:从上往下,命中即停
mihomo 拿到一个连接,会从 rules 的头一行开始逐条比对,碰到能匹配的那条就按它的策略处理,后面的规则不再看。由此有三条写法上的习惯:
- 具体的放前面,宽泛的放后面。 想让 api.example.com 直连、example.com 其余子域名走代理,DOMAIN 那条就得写在 DOMAIN-SUFFIX 那条之前。
- 域名类放在 IP 类前面。 IP 类规则可能触发 DNS 解析,先用域名规则把能判断的连接处理掉,解析次数少,速度也快。
- MATCH 只放在末尾。 它不带条件、匹配一切,放在中间会把后面的规则全部架空。
mihomo 文档还提到一个细节:如果是 UDP 请求,而命中规则指向的节点不支持 UDP,会继续往下匹配。
域名类:四种写法的匹配范围
| 类型 | 写法示例 | 匹配什么 |
|---|---|---|
| DOMAIN | DOMAIN,api.example.com,DIRECT |
只匹配这一个完整域名 |
| DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,节点选择 |
example.com 本身和它所有的子域名 |
| DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,节点选择 |
域名里出现这个词就算 |
| GEOSITE | GEOSITE,cn,DIRECT |
预先整理好的一类域名,数据来自 v2fly 的 domain-list-community |
DOMAIN-SUFFIX 是按「点」分段比的,DOMAIN-SUFFIX,google.com 能匹配 www.google.com 和 google.com,但不会误伤 content-google.com。DOMAIN-KEYWORD 则只看字符串里有没有这个词,范围大,容易匹配到不相干的域名,能用 SUFFIX 就别用 KEYWORD。需要通配或正则时,mihomo 另外提供 DOMAIN-WILDCARD 和 DOMAIN-REGEX。
GEOSITE 后面填的是分类名,如 cn、youtube、category-ads-all,具体有哪些分类可以到 domain-list-community 仓库的 data 目录里查。
IP 类:IP-CIDR、GEOIP 和 no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- GEOIP,CN,DIRECT
IP-CIDR 匹配一个地址段,常用来让局域网、公司内网直连;GEOIP 按 IP 所属国家或地区判断,GEOIP,CN,DIRECT 是绝大多数订阅里都有的一行。
关键在 no-resolve。一个访问域名的请求走到 IP 类规则时,mihomo 要先把域名解析成 IP 才能比对,这一步会额外发起 DNS 查询。加上 no-resolve,这条规则就只对本来就是 IP 的连接生效,域名请求直接跳过它往下走。局域网段、内网段这类规则几乎都应该加;GEOIP,CN 要不要加,取决于你是否希望「解析后落在国内 IP 的域名」也被它判为直连:不加就会解析后再判断,加了就只管纯 IP 连接。
按程序、按端口
- PROCESS-NAME,Telegram.exe,节点选择
- PROCESS-NAME,com.example.app,DIRECT
- DST-PORT,22,DIRECT
PROCESS-NAME 在 Windows 上写 exe 文件名,macOS、Linux 上写进程名,安卓上写应用包名。它依赖内核能查到是哪个进程发起的连接:Clash Party 的内核设置和 FlClash 的设置里都有「查找进程」一项,关掉时这类规则不会生效。DST-PORT 按目标端口匹配,例如让 SSH 的 22 端口一律直连。
更复杂的条件可以用 AND、OR、NOT 组合,例如 AND,((DOMAIN-SUFFIX,example.com),(NETWORK,UDP)),REJECT 只拦截这个域名的 UDP 流量,注意括号要成对。
规则集:rule-providers 加 RULE-SET
成百上千个域名不可能一条条写。rule-providers 让 mihomo 从网上定时下载一份规则集,rules 里只用一行 RULE-SET 引用。下面接的是 Loyalsoldier/clash-rules,它的 README 列出的兼容客户端里包括 Clash Verge Rev、Clash Party 和 Clash Meta for Android:
rule-providers:
reject:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
cncidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
rules:
- RULE-SET,reject,REJECT
- RULE-SET,direct,DIRECT
- RULE-SET,cncidr,DIRECT,no-resolve
- MATCH,节点选择
几个字段的含义:
- type:http 表示从 url 下载,file 表示读本地文件,inline 表示规则直接写在 payload 里。
- behavior:规则集内容的类型,domain、ipcidr 或 classical,填错了规则集会读不出来。
- format:yaml、text 或 mrs,不写默认 yaml。mrs 是 mihomo 的二进制格式,体积小,但只支持 domain 和 ipcidr 两种 behavior。
- interval:多少秒重新下载一次,86400 就是一天。
Loyalsoldier 的 README 给了两种组合:白名单模式(没命中任何规则集的流量走代理,适合大多数人)和黑名单模式(只有 gfw、tld-not-cn 这类列表里的域名走代理,其余直连)。上面的例子按白名单思路写,完整的规则集清单以它的 README 为准。
写在哪,订阅更新时才不会丢
三款客户端存放自定义规则的位置如下:
| 客户端 | 写在哪 | 要注意 |
|---|---|---|
| Clash Verge Rev | 订阅卡片右键「编辑规则」,填好类型、内容和策略后加为前置或后置规则 | 前置规则排在订阅规则之前,自定义规则一般放这里;规则类型下拉里有 RULE-SET |
| Clash Verge Rev | 右键「扩展覆写配置」写 rule-providers | 扩展覆写里写 rules 会把整个列表替换掉,规则本身还是放进「编辑规则」 |
| Clash Party | 「覆写」页新建 YAML,用 +rules: 插到原规则前面,rules+: 追加到后面 |
覆写要在订阅的「编辑信息」里选中,或者给这份覆写打开「全局启用」,才会生效 |
| FlClash | 配置卡片菜单 →「扩展」→ 添加规则 | 附加规则是在订阅基础上追加的,自动更新不影响它 |
改完以后,到客户端的「连接」页看看目标网站的连接,规则一栏会写出它命中的是哪一条。和预期不一致,多半是前面有一条更宽泛的规则先把它截走了。
规则之外,还要一条订阅
规则只决定流量往哪走,节点得从订阅里来。没有订阅的话,一翻云的轻享版每月 ¥20、流量 150GB(信源:一翻云价目页,10 月 9 日),订阅地址要付款后向客服领,注册时不会自动给;新账号下单填 1FLYYUN 可以打 9 折。它的订阅自带分组和规则,在此基础上加自己的前置规则就行。其他机场的订阅格式和给法,见机场总表。
想看规则配合节点选择怎么用,接下来可以读 Clash Verge 节点怎么选;TUN 模式下规则同样生效,开法见 Clash Verge TUN 模式怎么开。
文中提到的机场
一翻云
报眼轻享版 ¥20/月 150GB,7 月 12 日自己测过
- 起步价
- ¥20/月每月 150GB
- 订阅
- 找客服要
- 优惠码
1FLYYUN