rule 模式如何决定一条连接的出口
Clash 的 rule 模式会从上到下检查 rules 列表,第一条匹配成功的规则立即生效,后面的规则不再参与判断。规则左侧是匹配类型,中间是匹配内容,右侧是策略名称。策略可以是 DIRECT、REJECT,也可以是配置中已经存在的代理组,例如 PROXY、Auto 或 境外节点。
一次请求可用于匹配的信息通常包括目标域名、目标 IP、目标端口、网络类型以及进程信息。不同入站方式能拿到的信息并不完全相同:系统代理处理 HTTP 或 SOCKS 连接时,域名往往比较明确;TUN 模式接管系统流量后,是否保留域名还会受到 DNS 模式、域名嗅探和应用连接方式影响。因此,同一组规则在系统代理与 TUN 下可能出现不同的命中记录。
四类基础结果
| 规则结果 | 连接行为 | 常见用途 |
|---|---|---|
DIRECT |
由当前设备直接连接目标 | 国内站点、局域网设备、可信下载源 |
REJECT |
拒绝连接,不再交给后续规则 | 广告域名、跟踪请求、已知干扰地址 |
| 代理组名称 | 交给选定节点或自动测速组 | 境外站点、开发服务、流媒体 |
MATCH |
接收前面没有匹配的剩余连接 | 规则列表最后一条兜底 |
DOMAIN-SUFFIX、GEOIP、RULE-SET 与 MATCH 的写法
DOMAIN-SUFFIX:按域名后缀处理
DOMAIN-SUFFIX,example.com,PROXY 会匹配 example.com 本身及其子域名,例如 www.example.com 和 api.example.com。它比逐个编写完整域名更适合处理同一服务下的多个子域名,也是手工规则中使用频率较高的一类。
rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,gov.cn,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-SUFFIX,example.com,PROXY
DOMAIN 只匹配一个完整域名,不自动包含子域名。DOMAIN-KEYWORD 只要域名中出现指定字符串就会命中,覆盖范围更宽,也更容易误伤。需要精确放行登录域名、更新域名时优先使用 DOMAIN;需要覆盖整个站点时使用 DOMAIN-SUFFIX。
GEOIP:按目标 IP 的归属地区处理
GEOIP,CN,DIRECT 使用客户端加载的 IP 地理数据库判断目标地址是否属于中国大陆。它适合接住没有域名、直接连接 IP,或未被域名规则覆盖的国内请求。GEOIP 判断依赖本地数据库,数据库过旧时,新分配的网段可能被误分到兜底策略。
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,PROXY
no-resolve 表示该 IP 规则不主动把域名解析成 IP。局域网 CIDR 规则只需要检查已经取得的目标地址,加入该参数可以减少额外 DNS 查询。不要机械地给所有 GEOIP 规则追加 no-resolve,否则只有域名、尚未得到目标 IP 的请求可能跳过地区判断。
RULE-SET:把大量规则拆成独立文件
当广告规则、国内域名规则达到数百或数千条时,全部塞进主配置会降低可读性。rule-providers 用于定义规则文件,RULE-SET 则在主规则列表中调用它。Clash Meta,也就是 mihomo,支持 domain、ipcidr 和 classical 等行为类型;不同类型对应不同的载荷格式。
rule-providers:
allow:
type: file
behavior: domain
path: ./ruleset/allow.yaml
ads:
type: file
behavior: classical
path: ./ruleset/ads.yaml
direct-domain:
type: file
behavior: domain
path: ./ruleset/direct-domain.yaml
rules:
- RULE-SET,allow,DIRECT
- RULE-SET,ads,REJECT
- RULE-SET,direct-domain,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
behavior: domain 的文件只存放域名载荷,适合国内域名或放行列表。behavior: classical 可以存放带类型的完整规则,例如 DOMAIN-SUFFIX、DOMAIN-KEYWORD 和 IP-CIDR。本地文件便于先检查内容再启用;需要自动更新时可改用 type: http,同时设置规则地址、保存路径和更新间隔。
MATCH:必须放在最后
MATCH,PROXY 不检查域名或 IP,它会匹配所有尚未命中的连接。只要 MATCH 出现在中间,下面的规则就永远没有执行机会。常见目标是“国内直连,其余代理”,因此先放例外放行、广告拒绝、局域网直连、国内域名和 GEOIP,最后再用 MATCH 交给代理组。
国内直连、境外代理与广告拦截的配置骨架
下面的骨架适合合并到已有订阅配置。假设订阅中已经存在名为 PROXY 的策略组;如果客户端显示的组名是“节点选择”或“代理”,需要把规则末尾的 PROXY 改成实际名称。策略名称区分字符,空格和中文也必须完全一致。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
profile:
store-selected: true
rule-providers:
allow:
type: file
behavior: domain
path: ./ruleset/allow.yaml
ads:
type: file
behavior: classical
path: ./ruleset/ads.yaml
direct-domain:
type: file
behavior: domain
path: ./ruleset/direct-domain.yaml
rules:
- RULE-SET,allow,DIRECT
- RULE-SET,ads,REJECT
- DOMAIN,localhost,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- DOMAIN-SUFFIX,lan,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,169.254.0.0/16,DIRECT,no-resolve
- RULE-SET,direct-domain,DIRECT
- DOMAIN-SUFFIX,gov.cn,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
mixed-port: 7890 在同一个端口接收 HTTP 与 SOCKS5 连接,适合桌面客户端将系统代理统一指向 127.0.0.1:7890。allow-lan: false 表示当前示例不向局域网开放代理端口。如果确实需要电视、手机或游戏机连接这台电脑,还要单独配置监听地址和防火墙规则,不能只修改规则列表。
三个本地规则文件
allow.yaml 用于覆盖广告列表中的误拦截项。因为它在广告规则前面,所以相同域名会先被放行。domain 行为的载荷可写成下面的形式:
payload:
- 'login.example.net'
- '+.account.example.net'
ads.yaml 使用 classical 行为,每一项包含完整规则类型。广告列表应尽量使用精确域名和后缀,谨慎使用范围过大的关键词:
payload:
- DOMAIN,ads.example.net
- DOMAIN-SUFFIX,tracking.example.net
- DOMAIN-KEYWORD,telemetry-example
direct-domain.yaml 使用 domain 行为,保存需要直连的国内服务后缀:
payload:
- '+.gov.cn'
- '+.edu.cn'
- '+.example.cn'
匹配顺序:放行、拦截、直连与兜底
规则顺序不只是整理方式,它会改变最终出口。推荐顺序是:精确放行列表、广告拒绝、局域网地址、国内域名、国内 IP、专用服务策略,最后是 MATCH。放行列表排在广告列表之前,可以处理登录接口、验证码和支付页面被第三方规则误拦截的情况。
- 精确放行:处理必须直连且不能被广告规则拦截的域名。
- 广告拒绝:对明确的广告和跟踪域名返回拒绝结果。
- 局域网直连:保证路由器、NAS、打印机和本地开发服务不进入代理。
- 国内域名直连:优先依据域名规则分流,减少不必要的 IP 判断。
- 国内 IP 直连:接住直接访问 IP 或域名规则未覆盖的连接。
- 境外服务分组:流媒体、代码托管等有独立策略需求时放在 MATCH 之前。
- MATCH 兜底:把其余连接交给默认代理组。
为什么不能先写 GEOIP 再写广告规则
广告域名可能解析到国内 IP。如果 GEOIP,CN,DIRECT 位于广告规则之前,请求会先按 IP 判定为直连,后面的 RULE-SET,ads,REJECT 没有机会执行。将广告域名规则放在 GEOIP 前面,才能优先依据域名拒绝请求。
为什么不建议只用 DOMAIN-SUFFIX,cn
DOMAIN-SUFFIX,cn,DIRECT 能覆盖大量以 .cn 结尾的站点,但国内服务也可能使用 .com、.net 或云服务域名;境外服务也可能使用中国域名提供部分接口。更稳妥的做法是让维护过的国内域名规则集负责主要判断,再以 .cn 和 GEOIP,CN 补漏。
订阅更新时怎样保留自定义规则
直接编辑订阅生成的 YAML 文件,下一次更新通常会覆盖改动。桌面客户端如果提供“全局扩展配置”“覆写”“Merge”或“脚本”功能,应把自定义 rule-providers 与规则插入逻辑放在覆写层。菜单名称因客户端而异,常见入口是「订阅」→「编辑」→「覆写配置」,或「设置」→「配置」→「全局扩展」。
合并时要先确认客户端采用追加还是替换。若 rules 被简单追加到订阅规则末尾,而原配置已经存在 MATCH,新规则依然不会命中。正确结果应当是把自定义规则插入原有 MATCH 之前,或者明确替换整段 rules。
原始 Clash 与 mihomo 的兼容边界
基础的 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、IP-CIDR、GEOIP、RULE-SET 和 MATCH 在常见 Clash 配置中都有广泛支持。mihomo 还提供 GEOSITE、复合逻辑规则、规则集二进制格式和更完整的进程匹配能力。配置需要在不同内核之间共用时,先保留基础语法,再按客户端能力添加扩展字段。
TUN、DNS 与规则命中的关系
TUN 模式接管的不只是浏览器流量,还包括不遵循系统代理的应用、部分命令行工具和 UDP 连接。此时客户端需要从网络包、DNS 映射或嗅探结果中恢复目标域名。若只能看到目标 IP,DOMAIN-SUFFIX 与 domain 类型 RULE-SET 就无法参与,连接会继续落到 IP-CIDR、GEOIP 或 MATCH。
fake-ip 模式
mihomo 常见的 fake-ip DNS 模式会为域名返回保留地址,并在内核中保存“虚拟 IP—原域名”的映射。应用连接这个虚拟地址时,内核仍能取回域名并执行域名规则。遇到局域网设备发现、企业内网或依赖真实 DNS 答案的程序时,可把相关域名加入 fake-ip 过滤列表,而不是把整个 DNS 模式切换掉。
redir-host 模式
redir-host 返回真实解析结果,再按域名或 IP 执行分流。它对部分局域网和特殊应用更直观,但 DNS 查询路径与实际连接路径必须保持一致,否则可能出现解析结果在国内、连接却进入境外代理的情况。排查时同时观察 DNS 日志和连接日志,不要只看节点测速结果。
建议的测试流程
- 在客户端「日志」页面把级别临时调到 Info,重新访问目标站点。
- 查看连接记录中的 Host、Destination IP、Rule 和 Chain 字段。
- 确认广告域名命中
RULE-SET,ads,结果为REJECT。 - 确认局域网地址命中
IP-CIDR,结果为DIRECT。 - 确认国内站点命中 direct-domain 或
GEOIP,CN。 - 确认未分类的境外站点最终命中 MATCH,并进入预期代理组。
测试时每次只修改一个条件。规则调整后执行「配置」→「重新载入」,并关闭旧连接再重新发起请求。浏览器的长连接、HTTP/2 会话和应用连接池可能继续沿用修改前的出口,仅刷新页面不一定触发新规则。
常见故障与定位方法
配置可以载入,但所有流量都走代理
先检查模式是否仍为 Rule,再查看规则列表最前面是否出现了 MATCH 或覆盖范围过大的代理规则。若国内域名规则使用 RULE-SET,确认规则提供器的条目数不为 0,并检查本地 path 是否以配置文件所在目录为基准正确解析。
广告规则启用后,登录或支付页面打不开
在连接记录中找出被 REJECT 的具体域名,将必要域名加入 allow 规则集,并保证 RULE-SET,allow,DIRECT 位于广告规则之前。不要直接停用整份广告列表,也不要用过宽的顶级域名放行;优先添加登录接口的完整域名或最小可用后缀。
国内网站命中 MATCH
查看连接记录是否保留 Host。存在域名但未命中时,通常是国内域名规则缺少该条目;只有目标 IP 时,则检查 GEOIP 数据库和 DNS 配置。还要确认规则使用的策略名真实存在,部分客户端遇到无效策略时会拒绝载入整份配置。
修改 YAML 后提示解析失败
YAML 使用空格缩进,不能用制表符。rules 和 rule-providers 必须处于正确层级,列表项前需要短横线。包含冒号、井号或特殊字符的域名载荷可用单引号包裹。错误提示给出行号时,还要检查上一行是否漏写冒号,因为实际报错位置经常落在下一行。
延迟测试正常,但网页仍然无法打开
延迟测试只验证测试地址通过某个代理组的连接结果,不代表目标网页命中了同一策略。打开连接页面核对实际 Rule 和 Chain;如果请求被 DIRECT、REJECT 或其他专用组提前接走,应调整规则顺序,而不是反复切换测速节点。