Clash 自定义规则语法详解:匹配类型、顺序与优先级
梳理域名、IP、进程与兜底规则的写法,解释自上而下匹配机制和常见失效原因。
PROOF / 01
规则匹配模型:从上到下,首次命中即停止
Clash 的 rules 是一张按行排列的流量分发表。每条规则通常由“类型、匹配内容、目标策略”组成,部分类型还可以附加参数。内核处理连接时会从列表顶部开始检查,遇到第一条符合条件的规则后立即采用该行指定的策略,不再继续检查后续内容。
这里的“优先级”不是由规则类型自动决定的。DOMAIN 不会天然高于 DOMAIN-SUFFIX,IP-CIDR 也不会自动覆盖前面的域名规则。真正决定优先级的是所在行的位置。因此,一条范围较宽的规则如果放得过早,就可能遮住后面更精确的例外规则。
rules:
- DOMAIN,api.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,节点选择
- GEOIP,CN,DIRECT
- MATCH,节点选择
以上顺序先让 api.example.com 直连,再把该域名下的其他子域名交给“节点选择”。如果交换前两行,精确域名也会先被后缀规则捕获,第一行的直连例外便失去作用。最后的 MATCH 是兜底规则,用于接收此前没有命中的连接,通常只放一条并置于末尾。
PROOF / 02
域名规则:精确主机、后缀与关键字
域名规则适合处理目标主机名明确的请求,也是自定义分流中最常用的一组类型。连接保留域名信息时,内核可以直接进行匹配,不必先把目标解析成 IP。常见类型如下。
| 规则类型 | 匹配范围 | 典型用途 |
|---|---|---|
DOMAIN |
仅匹配完整域名 | 为单个接口或主机设置例外 |
DOMAIN-SUFFIX |
匹配指定域名及其子域名 | 按整个站点或服务域分流 |
DOMAIN-KEYWORD |
匹配域名中出现的字符串 | 覆盖命名规律明确但后缀分散的域名 |
GEOSITE |
匹配数据集中收录的域名分类 | 在支持相应数据集的 mihomo 配置中批量分流 |
rules:
- DOMAIN,login.example.net,DIRECT
- DOMAIN-SUFFIX,example.net,工作服务
- DOMAIN-KEYWORD,streaming,媒体节点
- GEOSITE,cn,DIRECT
- MATCH,节点选择
DOMAIN,login.example.net 只匹配这一完整主机,不会匹配 static.login.example.net。DOMAIN-SUFFIX,example.net 通常同时覆盖 example.net 与它的各级子域名,适合作为站点级规则。DOMAIN-KEYWORD 的范围最难控制,只要目标域名包含指定片段就可能命中,因此应使用足够明确的关键字,并放在精确规则之后。
GEOSITE 属于数据集驱动的匹配方式。它是否可用、分类名称如何书写,取决于所用内核、客户端和地理数据文件。迁移配置时,不应把某个客户端可识别的分类直接视为所有 Clash 衍生内核都支持;应先检查内核类型以及数据文件是否已正确加载。
PROOF / 03
IP、来源地址与网络协议规则
当服务只能通过地址段识别,或者需要按局域网来源、目标区域进行控制时,可以使用 IP 类规则。IPv4 地址段通常使用 IP-CIDR,IPv6 地址段使用 IP-CIDR6;GEOIP 则依据地理数据库判断目标 IP 所属分类。
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,节点选择
no-resolve 的作用是阻止这条 IP 规则为了匹配而主动触发域名解析。连接本身已经提供目标 IP 时,规则仍可检查该地址;目标只有域名且内核尚未取得真实地址时,这条规则不会强制补做 DNS 查询。局域网保留地址规则常添加该参数,因为它们不需要为普通域名额外解析。
是否添加 no-resolve 要结合目标判断。若希望 GEOIP 根据解析结果决定直连或代理,阻止解析可能使该规则无法获得所需地址。反过来,如果域名规则已经覆盖主要服务,IP 规则只是处理直接访问地址的连接,加入该参数可以避免不必要的解析动作。
在 Fake-IP 模式下,应用可能先看到内核分配的保留地址,Clash 则维护域名与真实目标之间的映射。域名规则通常仍可依据原始主机名工作,但排查 IP 规则时需要区分“应用看到的 Fake-IP”“内核保存的域名映射”和“上游解析出的真实 IP”。只盯着浏览器或应用显示的目标地址,容易误判规则是否命中。
来源地址与网络类型
SRC-IP-CIDR 按发起连接的设备地址匹配,常用于路由器或局域网网关场景。例如,可以让某台测试设备使用独立策略。NETWORK 则按 TCP 或 UDP 区分连接,适合与更具体的端口条件组合;如果单独把所有 UDP 流量提前交给某一策略,影响范围通常过大。
rules:
- SRC-IP-CIDR,192.168.50.25/32,测试策略
- NETWORK,UDP,节点选择
- MATCH,DIRECT
桌面客户端只代理本机流量时,来源地址信息可能没有路由器透明代理场景那么有区分度。使用前应先确认客户端工作模式、TUN 接管范围以及内核实际获得的连接元数据。
PROOF / 04
进程、路径与端口匹配
进程规则可以按发起连接的应用分流。PROCESS-NAME 通常匹配可执行文件名称,PROCESS-PATH 匹配完整路径。它们适合处理同一域名被多个应用共用、仅希望某个程序走特定策略的情况。
rules:
- PROCESS-NAME,example-client.exe,工作服务
- PROCESS-PATH,C:\Apps\Example\example-client.exe,工作服务
- DST-PORT,22,开发节点
- DST-PORT,123,DIRECT
- MATCH,节点选择
进程识别能力受到操作系统权限、客户端实现、内核版本和接管模式影响。Windows、macOS 与 Linux 对进程名称和路径的表示方式不同,移动系统通常也不能照搬桌面端的可执行文件规则。若日志中只有目标地址而没有进程字段,继续调整进程名称通常不会解决问题,应先确认当前平台能否提供进程元数据。
DST-PORT 根据目标端口匹配,SRC-PORT 根据本地来源端口匹配。目标端口比来源端口更稳定,但也不能单独代表某项业务:例如 TCP 443 被大量 HTTPS 服务共用,将它提前设置为单一代理策略,会覆盖绝大多数网页连接。端口规则更适合处理用途明确的协议,或在 mihomo 的逻辑组合规则中与域名、网络类型共同限定。
PROOF / 05
规则顺序与优先级的实用编排
便于维护的规则表通常遵循“例外在前、常规在中、兜底在后”的结构。可先放必须直连或必须拒绝的精确主机,再放业务域名与进程规则,随后处理地址段和地理分类,最后用 MATCH 收口。具体顺序仍应按实际目标调整,而不是机械套用固定模板。
- 本地与管理地址:路由器后台、局域网网段和本机服务通常优先直连,避免被广泛代理规则截获。
- 精确例外:使用
DOMAIN、单地址 CIDR 或明确进程名处理特殊需求。 - 业务规则:按域名后缀、规则集合或应用进程分配到对应策略组。
- 宽范围分类:地理数据库、关键字和大型规则集合放在更精确规则之后。
- 最终兜底:以
MATCH指向预期的默认策略。
rules:
# 局域网
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
# 精确例外
- DOMAIN,update.example.org,DIRECT
- DOMAIN,blocked.example.org,REJECT
# 常规业务
- DOMAIN-SUFFIX,example.org,工作服务
- PROCESS-NAME,media-player.exe,媒体节点
# 区域与兜底
- GEOIP,CN,DIRECT
- MATCH,节点选择
注释不会改变规则行为,但能显著降低后续校样成本。建议为每组规则写明用途,而不是只标记来源。订阅更新或手动合并配置后,可以快速确认自定义段落是否仍位于预期位置。尤其要检查客户端的覆写功能:有的客户端会把自定义规则插入顶部,有的会追加到底部,还有的会在更新订阅时重新生成完整配置。
PROOF / 06
规则集合与 mihomo 逻辑规则
规则数量较多时,可以通过 rule-providers 把规则内容拆到独立文件,再在主规则表中使用 RULE-SET 引用。集合负责保存匹配项,主配置中的引用位置仍决定它的整体优先级。把一个集合定义在配置顶部,并不会让它自动先于其他规则执行。
rule-providers:
service-domains:
type: http
behavior: domain
format: yaml
path: ./ruleset/service-domains.yaml
url: https://rules.example.net/service-domains.yaml
interval: 86400
rules:
- DOMAIN,internal.example.net,DIRECT
- RULE-SET,service-domains,工作服务
- MATCH,节点选择
behavior 与规则文件内容必须对应。域名类集合可使用 domain 行为,IP 段集合可使用 ipcidr,包含多种经典规则类型的集合通常使用 classical。不同内核版本对 format、支持的行为和数据文件格式可能存在差异,导入现成规则集前应核对客户端所用的实际内核,而不能只看客户端界面名称。
mihomo 还提供逻辑组合能力,可用 AND、OR、NOT 把多个条件组合成一条规则。例如,仅处理 UDP 443 的条件可以写成:
rules:
- AND,((NETWORK,UDP),(DST-PORT,443)),REJECT
- MATCH,节点选择
逻辑规则适合表达“同时满足”或“满足其一”的复杂条件,但括号、逗号和嵌套层级更容易写错。它们属于 mihomo 等兼容内核的扩展能力,迁移到较早的原版 Clash 内核时可能无法识别。为了保持配置可读,能用两三条清晰的普通规则解决时,不必强行改成深层嵌套表达式。
PROOF / 07
规则未生效的定位顺序
规则失效通常不是单一语法问题。更有效的检查方式是沿着“配置是否加载、连接是否进入内核、元数据是否符合预期、是否被前序规则截获”逐项确认。
- 确认正在使用的 Profile:编辑文件后重新加载配置,并核对客户端当前启用的配置名称。修改未激活的副本不会改变运行结果。
- 查看连接或日志中的命中规则:记录目标域名、目标 IP、进程、网络类型和最终策略。若显示命中了更靠前的规则,应调整顺序或缩小该规则范围。
- 检查 YAML 层级:
rules必须位于正确的顶层位置,列表项需要使用连字符。全角逗号、错误缩进和不可见字符都可能导致解析失败。 - 核对策略组名称:规则引用的名称必须真实存在。重命名代理组后,旧规则中的目标名称也要同步修改。
- 区分域名与 IP:应用直接访问 IP 时,域名规则没有可匹配的主机名;启用加密 DNS、TUN 或 Fake-IP 后,也应结合内核日志判断实际元数据。
- 检查客户端覆写:订阅更新、脚本合并和图形界面的规则覆写可能改变最终顺序,应以运行时配置为准。
- 确认内核支持:
GEOSITE、逻辑规则、部分进程字段和规则集格式并非所有内核版本都一致支持。
用最小规则集复现
当原配置包含数千条规则时,可以临时建立一份仅含测试规则和 MATCH 的最小配置。先验证目标域名能否被精确规则命中,再逐步加入后缀、规则集合、GEOIP 与进程条件。每次只增加一组内容,便于定位是哪一行改变了结果。
rules:
- DOMAIN,test.example.com,DIRECT
- MATCH,节点选择
如果最小配置能够命中,而完整配置不能,问题通常在前序规则、覆写顺序或规则集范围;如果最小配置也不能命中,则应检查流量是否进入 Clash、目标是否确实带有该域名,以及客户端当前是否加载了测试配置。
提交前校样清单
- 精确例外是否位于宽泛的后缀、关键字和规则集合之前。
- 所有策略名称是否与代理组名称一致。
- IPv4、IPv6 与局域网地址段是否分别使用合适的规则类型。
no-resolve是否只用于不需要主动解析的 IP 规则。- 进程规则是否符合当前操作系统和内核的识别方式。
- 规则集合的行为类型是否与内容格式一致。
- 列表末尾是否保留且只保留预期的兜底逻辑。
一份稳定的 Clash 自定义规则并不依赖规则数量,而依赖边界清楚、顺序可解释和运行结果可复查。先用精确规则表达例外,再逐层扩大匹配范围,最后通过日志核对首次命中的规则,通常比不断追加关键字更可靠。