当你完成 Clash 的基础配置后,很快就会遇到这样的需求:国内网站直连、境外网站走代理、公司内网不走代理、游戏流量单独处理、顺便把广告拦掉。这些都不是「开代理」能解决的,而是 Clash 规则引擎的核心能力。本文从规则语法讲起,带你一步步构建属于自己的分流策略。

规则引擎是如何工作的

Clash 处理每一个网络请求时,会按顺序逐条匹配 rules 列表中的规则。一旦某条规则命中,就立即执行对应的动作(走某个代理组、直连或拒绝),不再继续往下匹配。因此规则的排列顺序至关重要——越具体的规则应该放在越前面,越宽泛的规则放在越后面。

典型的规则列表结构如下:

rules:
  - DOMAIN-SUFFIX,company.internal,DIRECT
  - DOMAIN-SUFFIX,google.com,Proxy
  - GEOIP,CN,DIRECT
  - MATCH,Proxy

最后一条 MATCH 是兜底规则,必须放在列表末尾,否则后面的规则永远不会被执行。

Clash Meta / Mihomo 内核支持更多规则类型(如 GEOSITEPROCESS-NAMERULE-SET),功能比原版 Clash 更强大。本文示例均基于 Mihomo 内核语法。

常用规则类型详解

域名类规则

DOMAIN 精确匹配完整域名,DOMAIN-SUFFIX 匹配域名及其所有子域名,DOMAIN-KEYWORD 匹配域名中包含指定关键词的请求。三者从精确到模糊,使用场景不同:

日常配置中,DOMAIN-SUFFIX 用得最多,既能覆盖子域又不会误匹配无关域名。只有在需要精确控制时才用 DOMAIN

IP 类规则

IP-CIDRIP-CIDR6 按 IP 地址段匹配,常用于内网直连或屏蔽特定 IP 段。例如:

- 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

这三条是 RFC 1918 定义的私有地址段,几乎所有订阅配置都会包含,确保局域网设备互访不走代理。no-resolve 表示不为此规则触发 DNS 解析,避免循环查询。

地理位置规则

GEOIP 根据 IP 归属地匹配,GEOSITE 根据域名分类数据库匹配。这是实现「国内直连、国外代理」最简洁的方式:

- GEOSITE,cn,DIRECT
- GEOSITE,google,Proxy
- GEOIP,CN,DIRECT
- GEOIP,LAN,DIRECT

GEOSITE 基于域名分类,比 GEOIP 更准确——例如一个部署在境外的 CDN 节点,GEOIP 可能误判为境外,而 GEOSITE,cn 能正确识别为国内服务。

进程与端口规则

PROCESS-NAME 按发起请求的程序名匹配,适合让特定软件走指定线路:

- PROCESS-NAME,Telegram.exe,Proxy
- PROCESS-NAME,WeChat.exe,DIRECT
- PROCESS-NAME,steam.exe,Game

DST-PORTSRC-PORT 按目标或源端口匹配,较少单独使用,但在精细控制游戏 UDP 流量时很有用。

代理组:规则的目标

规则右侧的第三个参数是代理组名称或动作。除了 DIRECT(直连)、REJECT(拒绝)和 REJECT-DROP(静默丢弃)之外,其余都是你自定义的代理组。

常见的代理组类型:

一个实用的多组策略示例:

proxy-groups:
  - name: Proxy
    type: select
    proxies: [Auto, HK, JP, US, DIRECT]
  - name: Auto
    type: url-test
    proxies: [HK, JP, US]
    url: http://www.gstatic.com/generate_204
    interval: 300
  - name: AdBlock
    type: select
    proxies: [REJECT, DIRECT]

Rule-Provider:订阅第三方规则集

手动维护几百条规则不现实。Rule-Provider 允许你从远程 URL 订阅规则集,Clash 会定期拉取更新。配置格式如下:

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
  direct:
    type: http
    behavior: domain
    url: "https://example.com/rules/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400

rules:
  - RULE-SET,reject,AdBlock
  - RULE-SET,direct,DIRECT
  - GEOSITE,cn,DIRECT
  - MATCH,Proxy

behavior 可选 domainipcidrclassicaldomainipcidr 是优化过的二进制格式,匹配速度更快;classical 兼容完整 Clash 规则语法,灵活性最高。

使用第三方 Rule-Provider 时,请确认来源可信。恶意规则集可能将正常域名指向 REJECT 导致服务不可用,或指向恶意节点窃取流量。

广告拦截实战

Clash 的广告拦截原理很简单:将广告域名匹配到 REJECTREJECT-DROP,请求在本地被丢弃,广告内容永远不会加载。相比浏览器插件,Clash 在系统层面拦截,能覆盖所有 App 内的广告请求。

推荐的广告拦截规则排列顺序:

  1. 局域网和内网 IP 直连(避免误拦本地服务)
  2. 广告域名规则集 → REJECT
  3. 国内域名 → DIRECT
  4. 国外域名 → Proxy
  5. MATCH 兜底

开启广告拦截后,部分网站的「反广告拦截」检测可能触发,页面会提示你关闭广告拦截器。这是正常现象,可以在规则中为特定域名添加例外:

- DOMAIN-SUFFIX,anti-adblock-example.com,DIRECT

将例外规则放在广告规则集之前,这样会优先命中直连而非被拒绝。

实战:定制你的分流策略

以下是一个适合大多数用户的完整规则框架,你可以在此基础上增减:

rules:
  # 1. 本地与内网
  - GEOIP,LAN,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve

  # 2. 广告拦截
  - RULE-SET,reject,REJECT

  # 3. 自定义直连(公司、银行、政务)
  - DOMAIN-SUFFIX,company.com,DIRECT
  - GEOSITE,cn,DIRECT

  # 4. 自定义代理(特定服务走特定节点)
  - DOMAIN-SUFFIX,openai.com,US
  - DOMAIN-SUFFIX,netflix.com,Proxy

  # 5. 国内 IP 直连
  - GEOIP,CN,DIRECT

  # 6. 兜底
  - MATCH,Proxy

在 Clash Verge Rev 等客户端中,你可以通过「配置 → 规则」界面可视化编辑,也可以直接修改 YAML 文件。修改后点击「重新加载配置」即可生效,无需重启客户端。

规则调试:确认流量走向

写完规则后,如何验证某条流量确实按预期分流?Clash 提供了连接日志功能。在 Clash Verge Rev 中打开「连接」面板,可以实时看到每个请求匹配的域名、目标 IP、使用的规则和最终走的代理组。

调试技巧:

  1. 先访问目标网站,在连接日志中找到对应条目
  2. 查看「规则」列,确认命中了哪条规则——如果不是预期的规则,说明顺序需要调整
  3. 如果显示 MATCH,说明前面所有规则都未命中,需要添加更具体的规则
  4. 修改规则后重新加载配置,刷新页面复测

对于批量验证,可以使用 Clash 的 API 接口查询规则命中情况。进阶用户还可以通过 LOG-LEVEL 设置为 debug,在日志文件中看到完整的规则匹配过程,但日常使用时建议保持 info 级别,避免日志文件膨胀。

规则合并:覆写 vs 替换

使用订阅时,你的自定义规则如何与订阅提供的规则共存?常见有两种方式:

在 Clash Verge Rev 的「配置 → 覆写」功能中,可以用 YAML 片段追加规则而无需修改完整配置文件。例如只添加广告拦截和自定义直连:

prepend-rules:
  - RULE-SET,reject,REJECT
  - DOMAIN-SUFFIX,mycompany.com,DIRECT

这种方式的好处是订阅更新时不会覆盖你的自定义规则,是日常维护最推荐的做法。

常见问题排查

规则修改后没有生效

确认已重新加载配置(不是仅保存文件)。部分客户端有「规则」和「配置」两个编辑入口,改错了位置不会生效。检查 YAML 缩进是否正确——YAML 对缩进极其敏感,少一个空格就会导致整段规则被忽略。

国内网站走了代理

通常是 GEOIP,CN,DIRECT 位置太靠后,被前面的 MATCH,Proxy 抢先匹配。将 GEOIP/GEOSITE 规则上移,确保兜底规则在最后。

广告拦截导致 App 功能异常

某些 App 的统计、推送、更新服务域名与广告域名在同一规则集里。为受影响的 App 添加 DOMAIN-SUFFIX 例外,或暂时将广告规则集从 REJECT 改为 DIRECT 排查具体域名。

总结

Clash 的规则系统是分流代理的灵魂。掌握 DOMAIN-SUFFIXGEOSITEGEOIP 三类核心规则,配合 Rule-Provider 订阅维护,就能搭建一套稳定、个性化的分流策略。广告拦截只需将广告域名指向 REJECT,在规则顺序正确的前提下即可实现系统级去广告。

规则配置没有「一次到位」——随着使用场景变化,你会不断微调。建议从订阅提供的默认规则出发,每次只添加一两条自定义规则并测试,比一次性重写全部规则要稳妥得多。