Clash 规则写法详解:DOMAIN-SUFFIX、IP-CIDR 匹配顺序与 MATCH 兜底
规则按书写顺序自上而下匹配,命中第一条即停止。本文拆解 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、IP-CIDR、GEOIP、MATCH 的语法,并说明 no-resolve 的作用与规则排序原则。
规则不生效,先确认流量是否进入规则模式
给网站加了直连规则,连接却仍走代理;把某个地址段改成代理,访问结果却没变化。这类问题不一定是语法错误。先确认应用流量经过 Clash,再确认内核使用的是规则模式,最后才检查规则内容。
- 在客户端的「代理模式」中选择「规则(Rule)」。不同客户端也可能显示为「规则模式」;不要在「全局(Global)」或「直连(Direct)」模式下验证分流规则。
- 打开「连接(Connections)」页面,重新访问目标网站。找不到新连接时,先排查系统代理、应用自己的代理设置或 TUN 接管范围。
- 确认当前选中的配置确实是刚修改的那一份。保存文件后需要让客户端重新加载配置,单纯保存不一定会更新运行中的内核。
- 关闭目标应用的旧连接再测试。规则主要在连接建立时选择出站,已经建立的长连接不会因为文件变更就自动重新分流。
一条规则的结构:类型、匹配值与出站策略
常见规则写在 YAML 的 rules: 列表中,每行以短横线开头。域名规则通常有三个字段:规则类型、匹配值、出站策略。MATCH 不需要匹配值;支持 no-resolve 的 IP 类规则还可以增加第四个字段。
rules:
- DOMAIN,login.example.com,DIRECT
- DOMAIN-SUFFIX,example.org,REJECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,DIRECT
这段配置只使用内置策略,便于观察结构:DIRECT 表示直连,REJECT 表示拒绝连接。实际需要代理时,最后一个字段应填写配置中已经存在的代理节点名或策略组名。PROXY 不是在所有配置里都存在的通用内置策略。没有同名节点或策略组,直接照抄就可能导致配置加载失败。
- 使用英文半角逗号,不要写成中文逗号。
- YAML 缩进使用空格,不要使用 Tab;同一列表中的规则保持相同缩进。
- 策略名称必须与定义一致,包括大小写、空格和符号。
- 在已有配置中修改时,把条目合并到原来的
rules:下,不要再添加一个同名顶层键。
域名规则:DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD
| 类型 | 示例 | 匹配范围 |
|---|---|---|
DOMAIN | DOMAIN,example.com,DIRECT | 只匹配 example.com,不包含 www.example.com。 |
DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,DIRECT | 匹配 example.com 本身,以及 www.example.com、api.example.com 等子域名。 |
DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,REJECT | 匹配域名中出现 example 字符串的连接,范围比后缀规则更宽。 |
后缀按域名边界匹配,不是任意字符串结尾
DOMAIN-SUFFIX,example.com,DIRECT 会匹配 a.example.com,但不会匹配 notexample.com,也不会匹配 example.com.other.org。通常不需要写 *.example.com;这里的后缀类型已经包含子域名语义。
规则值只写域名,不要加入 https://、端口或路径。访问 https://example.com:8443/account 时,域名字段仍然是 example.com。普通域名规则不能区分同一站点的 /account 与 /video 页面路径。
精确例外放在宽泛规则前面
rules:
- DOMAIN,login.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,REJECT
- MATCH,DIRECT
这里允许 login.example.com 直连,其余属于 example.com 的域名被拒绝。如果交换前两行,登录域名会先命中后缀规则,后面的精确规则就没有机会生效。内核不会比较哪条规则“更精确”,也不会在命中后继续寻找更优选项。
DOMAIN-KEYWORD 适合明确知道匹配范围的场景,不适合靠一个常见短词给整类服务分流。关键词越短,越容易误伤名字中恰好带有相同字符串的其他域名。
IP-CIDR 与 GEOIP:地址段和地区数据库不是一回事
IP-CIDR 判断目标 IPv4 地址是否属于指定网段。192.168.0.0/16 覆盖从 192.168.0.0 到 192.168.255.255;/32 只表示一个 IPv4 地址。IPv6 地址段使用 IP-CIDR6,单个 IPv6 地址可以使用 /128。
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,代理选择
GEOIP,CN,DIRECT 表示根据当前加载的 IP 地区数据库判断目标地址是否归属 CN,再选择直连。它不是“所有中文网站直连”,也不按网页语言或域名后缀判断。CDN 地址分配、数据库更新和 IPv4/IPv6 返回差异,都可能让同一网站在不同网络下命中不同结果。
如果某个服务必须稳定走固定策略,优先使用明确的域名规则。把地区规则当成较靠后的补充更容易维护。无法加载所需地区数据库时,应先处理客户端日志中的资源加载问题,而不是通过调整规则顺序掩盖错误。
no-resolve 的作用:不为这一条规则额外解析域名
当连接携带域名,而规则需要目标 IP 时,内核可能为了执行 IP 匹配发起 DNS 查询。no-resolve 用来避免为这条 IP 规则主动触发域名解析。它不是全局 DNS 开关,也不是“忽略这条 IP 规则”。
- 目标本来就是 IP:可以直接判断地址是否属于网段,带有
no-resolve仍可能命中。 - 连接已有可用的目标 IP:仍可能进行匹配,不能把这个参数理解为“域名连接必定跳过”。
- 只有域名、没有可用目标 IP:不会仅为这条规则额外解析域名,因而可能继续检查后面的规则。
rules:
- DOMAIN-SUFFIX,example.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,代理选择
这组顺序先处理明确域名,再检查私网地址,之后进行地区判断。注意:虽然第二条带了 no-resolve,第三条没有,它仍可能触发为地区匹配所需的解析。给某一条规则加参数,不会约束后续所有规则的 DNS 行为。
如果把第三条改成 GEOIP,CN,DIRECT,no-resolve,只有域名且没有可用目标 IP 的连接可能无法在此完成地区判断,随后落到代理兜底。是否添加,应根据预期分流结果和 DNS 路径决定,不能为了减少查询就批量附加。
MATCH 兜底与自上而下的排序原则
MATCH 是无条件匹配,写法为 MATCH,策略名称。它通常放在规则列表最后,明确接住所有前面没有处理的连接。不要写成 MATCH,*,策略名称,也不要把它放在还有有效规则需要执行的位置之前。
rules:
- DOMAIN,login.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,代理选择
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,代理选择
用三次访问检查这份顺序
- 访问
login.example.com:第一条命中,直接结束规则查找,使用DIRECT。 - 访问
static.example.com:第一条不匹配,第二条命中,交给「代理选择」策略组。 - 访问不属于上述域名、且目标地址未命中 IP 与地区规则的服务:最终由
MATCH交给「代理选择」。
这些是配置推导结果,不代表示例域名提供可访问的服务。实测时换成自己需要分流的真实目标。还要注意,命中策略组不等于一定走远端节点:如果该组当前选择了 DIRECT,最终仍然直连。
实用排序通常是:精确例外、明确的域名范围、其他业务规则或规则集、IP 与地区补充、最终兜底。这个顺序不是内核强制规定;如果业务要求某条拒绝规则优先于例外,就应该把它前移。关键是明确每条规则覆盖哪些后续条目,而不是机械地按规则类型分类。
订阅与规则集:改对内容,也要改对位置
订阅更新后,自定义规则消失,通常是修改了会被重新下载覆盖的订阅文件。先保留原配置,再使用客户端提供的覆写、合并或扩展配置能力。不同客户端的入口和合并格式不同,不要把某个客户端的扩展字段直接当成 Clash 内核通用配置。
RULE-SET 也受所在位置影响
在 Clash 支持的相应内核版本及 mihomo 中,规则提供器通常定义在 rule-providers:,通过 RULE-SET,提供器名称,策略名称 引用。引用条目参与同一套自上而下匹配:如果前面已经命中宽泛域名规则,就不会再检查后面的规则集。
behavior: domain的载荷按域名集合格式编写,不要直接塞入完整的三字段出站规则。behavior: ipcidr的载荷是 IP 地址段,适合地址范围集合。behavior: classical使用规则条件写法,最终出站策略由引用它的RULE-SET条目指定。
原版 Clash、不同历史分支和 mihomo 的规则类型与扩展字段并不完全一致。遇到 unsupported rule type 一类提示,先查看客户端「关于」或内核信息,确认实际运行的内核,再核对对应文档。升级界面程序不一定意味着内核已经切换。
验证规则:一次只改一项,查看命中规则和最终出站
- 备份并保存。保留一份能正常启动的配置,只增加一条精确域名规则,重新加载后观察是否有解析错误。
- 清理旧连接。关闭目标应用,或在客户端「连接」页结束对应连接,再重新发起请求。浏览器的 HTTP/2、HTTP/3 连接复用可能让旧路径继续存在。
- 核对目标。在连接详情中检查域名、目标 IP、命中规则与策略链。不同客户端字段名称略有差别,不能只看总流量曲线。
- 检查日志。必要时临时把
log-level设为debug,重现一次问题后恢复info。分享日志前遮盖订阅链接、令牌和不宜公开的地址。
| 现象 | 优先检查 |
|---|---|
| 一直命中 MATCH | 规则是否已加载;域名是否拼错;连接是否只携带 IP;规则集是否加载成功。 |
| 精确规则没有命中 | 前面是否存在覆盖它的后缀、关键词或规则集;测试连接是否在修改前已建立。 |
| 命中代理组却仍直连 | 该策略组当前选择项是否为 DIRECT,以及嵌套组的最终选择。 |
| 域名规则对部分应用无效 | 连接中是否缺少域名;应用是否自行解析;系统代理或 TUN 是否实际接管了该应用。 |
| 更新订阅后恢复原样 | 修改的是订阅原文件还是持久化覆写;自定义条目是否被合并到宽泛规则之后。 |
如果流量只有目标 IP,域名规则可能缺乏匹配依据。mihomo 的 Fake-IP 映射、DNS 接管与嗅探配置会影响域名信息是否可用,但嗅探不能保证识别所有协议,更不能恢复所有加密连接里的真实域名。先看连接详情,再决定是否调整 DNS 或嗅探设置,避免同时修改多个环节。