Clash 规则基础:rules 如何决定流量去向
许多用户把 Clash 的「规则模式」理解成开关,但真正决定每一条连接走代理还是直连的,是 YAML 配置里的 rules: 数组。Mihomo(原 Clash Meta)内核在收到连接后,会按从上到下的顺序逐条尝试匹配;一旦命中某条规则,立即执行对应动作,不再继续向下匹配。因此,规则顺序与语法细节,直接决定了 Netflix 是否走代理、公司内网是否误走节点、以及游戏 UDP 是否被错误 REJECT。
每条规则的基本格式为三列(部分类型有第四列参数):
TYPE,参数,策略组或动作[,附加选项]
第三列可以是 DIRECT(直连)、REJECT(拒绝)、REJECT-DROP(静默丢弃),也可以是 proxy-groups 里定义的任意 name,例如 Proxy、自动选择、Netflix。若第三列名称在策略组中不存在,该规则无效,连接可能落入兜底或报错。
rules 负责「分流决策」;proxy-groups 负责「在某一组里选哪个节点」。例如 DOMAIN-SUFFIX,google.com,Proxy 表示 Google 相关域名交给名为 Proxy 的策略组,而 Proxy 组内部可能是 select 手动选节点,或 url-test 自动测速。
出站模式(客户端里的「规则 / 全局 / 直连」)会改变 rules 是否生效:规则模式下完整执行 rules;全局模式下几乎所有流量强制走当前选中的策略组,rules 基本被绕过;直连模式则忽略代理规则。进阶用户应始终使用「规则」模式,并确保 MATCH 兜底合理。
DOMAIN 系列:域名匹配的四种写法
域名类规则在订阅配置中最常见,适合精确控制「哪些网站走代理、哪些广告域名被拦截」。Clash 支持四种域名匹配类型,精确度与性能各不相同,编写时应从具体到宽泛排列。
DOMAIN — 完全匹配
仅当请求的主机名与规则中的字符串完全一致时命中,不含子域名。
DOMAIN,www.google.com,Proxy
DOMAIN,localhost,DIRECT
适用场景:指定单个主机,例如某 API 网关、内网测试域名。若写成 DOMAIN,google.com,Proxy,则 www.google.com、mail.google.com 不会命中,需改用 DOMAIN-SUFFIX。
DOMAIN-SUFFIX — 后缀匹配(最常用)
当请求域名以指定后缀结尾时命中,包括自身与子域名。
DOMAIN-SUFFIX,google.com,Proxy
DOMAIN-SUFFIX,github.com,Proxy
DOMAIN-SUFFIX,cn,DIRECT
DOMAIN-SUFFIX,google.com,Proxy 会匹配 google.com、www.google.com、mail.google.com 等。注意后缀写 cn 会匹配所有以 .cn 结尾的域名,范围极大,一般更推荐配合 GEOIP,CN,DIRECT 处理国内流量。
DOMAIN-KEYWORD — 关键词匹配
当域名任意位置包含指定关键词时命中,灵活但容易误伤。
DOMAIN-KEYWORD,ads,REJECT
DOMAIN-KEYWORD,tracker,REJECT
DOMAIN-KEYWORD,netflix,Netflix
广告拦截规则集(如 reject 列表)大量使用 DOMAIN-KEYWORD。副作用是可能误匹配 innocuous 域名,生产环境建议优先使用精确的 DOMAIN-SUFFIX。
DOMAIN-REGEX — 正则匹配
使用 Go 正则语法匹配完整域名,功能最强,但性能开销较大,应少量使用并放在靠后位置。
DOMAIN-REGEX,^.*\.(google|youtube)\.com$,Proxy
DOMAIN,api.example.com,DIRECT,再 DOMAIN-SUFFIX,example.com,Proxy。
| 类型 | 匹配逻辑 | 典型用途 |
|---|---|---|
DOMAIN |
主机名完全相等 | 单个 API、localhost |
DOMAIN-SUFFIX |
域名以后缀结尾 | Google、GitHub、流媒体 |
DOMAIN-KEYWORD |
域名包含关键词 | 广告/追踪拦截 |
DOMAIN-REGEX |
正则表达式 | 复杂批量匹配(慎用) |
GEOIP 与 IP 类规则:按 IP 地址分流
当连接已解析出目标 IP,或规则类型本身基于 IP 时,域名规则不再适用,需要使用 IP 类规则。其中 GEOIP 是中文用户最熟悉的一条——几乎每条优质订阅都包含 GEOIP,CN,DIRECT,用于让中国大陆 IP 直连,降低延迟并节省节点流量。
GEOIP — 按 GeoIP 数据库国家/地区码
GEOIP,CN,DIRECT
GEOIP,US,Proxy
GEOIP,LAN,DIRECT
CN 表示中国大陆 IP 段;LAN 表示 RFC1918 私有地址(10.x、172.16–31.x、192.168.x 等)。GEOIP 查询依赖 Mihomo 内置的 GeoIP 数据库(或 GeoSite/GeoIP 合并数据),需定期随客户端/订阅更新,否则新分配 IP 段可能判断不准。
IP-CIDR / IP-CIDR6 — 指定网段
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR6,2001:db8::/32,DIRECT,no-resolve
用于精确指定 IPv4/IPv6 网段。局域网直连、公司 VPN 网段、特定 CDN 节点常写在此类规则中。第四列 no-resolve 表示:若规则参数是 IP 而非域名,则跳过 DNS 解析步骤,避免无意义的解析请求,并防止 fake-ip 模式下 GEOIP 与 IP-CIDR 行为异常。
其他常见 IP / 端口规则
SRC-IP-CIDR,192.168.1.0/24,DIRECT— 按来源 IP 匹配,OpenWrt 透明代理场景较常见。DST-PORT,443,Proxy— 按目标端口匹配,较少单独使用。PROCESS-NAME,Telegram.exe,Proxy— 按进程名匹配(部分平台支持),适合桌面端精确分流。
dns.enhanced-mode: fake-ip 时,Mihomo 可能先用虚拟 IP 建立连接,再通过域名还原真实地址。若发现 GEOIP 判断异常,检查 DNS 配置中的 fake-ip-filter,或在 IP 规则上添加 no-resolve。TUN 模式下更应在规则靠前位置写全局域网 CIDR 直连。
MATCH 兜底规则与优先级实战
MATCH 是 rules 数组的最后一道防线:当前面所有规则都未命中时,MATCH 捕获剩余全部流量。语法极简:
MATCH,Proxy
MATCH,DIRECT
绝大多数订阅在末尾使用 MATCH,Proxy,表示「未识别的国外流量默认走代理」;部分保守配置使用 MATCH,DIRECT,仅明确列出的域名/IP 才走代理。MATCH 必须放在 rules 最后,且通常只需一条——若写多条 MATCH,只有第一条会真正起作用。
理解优先级的一个典型片段如下(简化示意):
rules:
- DOMAIN-SUFFIX,company.internal,DIRECT
- DOMAIN-KEYWORD,ads,REJECT
- DOMAIN-SUFFIX,youtube.com,Proxy
- GEOIP,CN,DIRECT
- GEOIP,LAN,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,Proxy
访问 www.youtube.com 时,第 3 条 DOMAIN-SUFFIX 先命中,走 Proxy,不会再执行 GEOIP,CN。访问某国内小众网站若域名未命中任何 DOMAIN 规则,但 IP 属于 CN,则第 4 条 GEOIP 命中直连。若用户抱怨「国内网站走了代理」,排查步骤应为:① 查看连接日志命中的规则名;② 检查前面是否有 DOMAIN 规则误指向 Proxy;③ 确认客户端处于规则模式而非全局模式。
proxy-groups 策略组:规则第三列的「目的地」
规则只负责把流量「分拣」到某个名字;策略组定义该名字背后的行为。常见 type 如下:
| type | 行为 | 典型命名 |
|---|---|---|
select |
手动选择节点或子组 | Proxy、节点选择 |
url-test |
定时测速,自动选延迟最低 | 自动选择、香港自动 |
fallback |
按顺序尝试,失败则切换下一个 | 故障转移 |
load-balance |
负载均衡(多种算法) | 负载均衡组 |
规则与策略组配合示例:为 Netflix 单独建组,并在 rules 中引用。
proxy-groups:
- name: Proxy
type: select
proxies: [自动选择, DIRECT, 香港-01, 新加坡-01]
- name: Netflix
type: select
proxies: [美国-NF-01, 美国-NF-02, DIRECT]
- name: 自动选择
type: url-test
url: http://www.gstatic.com/generate_204
interval: 300
proxies: [香港-01, 新加坡-01, 日本-01]
rules:
- DOMAIN-SUFFIX,netflix.com,Netflix
- DOMAIN-SUFFIX,nflxvideo.net,Netflix
- GEOIP,CN,DIRECT
- MATCH,Proxy
注意 proxies 列表里可以嵌套其他策略组名(如「自动选择」),实现「规则 → 策略组 → 子组 → 具体节点」的分层结构。编写自定义规则时,第三列字符串必须与 proxy-groups.name 大小写完全一致。
rule-providers:从外部 YAML 文件动态加载规则(如 Loyalsoldier 的 reject / proxy 列表),适合维护大量 DOMAIN 条目而不撑爆主配置。引用方式:RULE-SET,reject,REJECT,需在 rule-providers 段声明 provider 名称与 URL。
实战:Merge 覆写与可复用模板
直接编辑远程订阅会在下次更新时被覆盖。推荐在 Clash Verge Rev、Mihomo Party 中创建 Merge 类型覆写,用 prepend-rules 在订阅规则之前插入自定义条目(优先级更高),或用 append-rules 追加(注意仍在 MATCH 之前才有效——若订阅末尾已有 MATCH,append 的内容实际上永远不会被匹配,除非订阅允许插入 MATCH 之前)。
# merge-custom-rules.yaml
prepend-rules:
- DOMAIN-SUFFIX,mycompany.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- DOMAIN-SUFFIX,openai.com,Proxy
- DOMAIN-SUFFIX,chatgpt.com,Proxy
若需追加广告拦截且订阅未内置,可配合 rule-providers(部分客户端在覆写中支持):
rule-providers:
reject-ads:
type: http
behavior: domain
url: "https://cdn.example/rules/reject.txt"
path: ./rules/reject-ads.yaml
interval: 86400
prepend-rules:
- RULE-SET,reject-ads,REJECT
验证配置是否生效:开启客户端「连接」页,访问目标网站,查看每条连接右侧显示的规则类型与策略组。若显示 MATCH / Proxy 但预期应直连,说明前面缺少 GEOIP 或 DOMAIN 条目,或规则顺序需调整。
更完整的安装与订阅导入流程,可参考本站《Clash 完全使用指南》;OpenWrt 透明代理场景下的规则写法,见《Clash TUN 模式 OpenWrt 教程》。
常见问题
规则写了但不生效?
检查:① 第三列策略组名是否拼写正确;② 是否处于全局/直连模式;③ Merge 覆写是否已启用并合并到当前配置;④ YAML 缩进是否错误(须用空格,勿用 Tab)。
DOMAIN-SUFFIX 与 GEOIP 哪个优先?
谁写在前面谁优先。 并非 DOMAIN 一定优于 GEOIP——完全取决于 rules 数组中的顺序。一般把精确 DOMAIN 放前,GEOIP 放中后段,MATCH 放最后。
能否让某域名强制直连,即使它在 Proxy 组里?
可以。在 rules 里为该域名写 DOMAIN-SUFFIX,xxx.com,DIRECT,并放在可能指向 Proxy 的宽泛规则之前。规则模式以 rules 为准,与节点列表无关。
REJECT 和 REJECT-DROP 有何区别?
二者都拒绝连接;REJECT 可能向客户端返回拒绝响应,REJECT-DROP 直接丢弃,常用于广告域名以减少应用重试。广告拦截列表多用 REJECT。
相比只能「全局开/关」的一键加速器,Clash + Mihomo 的规则体系最大的优势在于透明与可控:每一条 DOMAIN、GEOIP、MATCH 都清晰可见,可通过覆写微调而不依赖封闭黑箱。配合 url-test 策略组与 TUN 模式,同一套 rules 既能照顾日常浏览分流,也能覆盖游戏与命令行场景——这是进阶用户长期留在 Clash 生态的核心原因。