Clash 自定义分流规则教程(2026):规则语法、规则集与常见需求示例
规则从上往下匹配、命中即停。搞懂这一条,再配上十个实战片段,你就能精确控制每一个程序和网站走哪条路。
先说最重要的一条:不要直接修改机场订阅下载下来的配置文件。下次更新订阅时你的修改会被完整覆盖。正确做法是用客户端的覆写机制(Clash Verge Rev 的 Merge、Clash Meta for Android 的覆写),把自定义规则单独存放,每次更新后自动套用。
第二条:规则从上往下匹配,命中第一条就停止。你的规则要生效,就必须排在机场那条规则之前——这也是 prepend-rules 比 append-rules 更常用的原因。
搞懂这两点,剩下的就是语法和实例。
规则是怎么被匹配的?
每当有一个新连接产生,Mihomo 内核会拿着「目标域名 / 目标 IP / 来源 IP / 端口 / 进程名」这组信息,从 rules 列表的第一条开始比对,命中即停,然后按该条规则指定的策略执行。
规则的通用格式是:
规则类型,匹配内容,策略[,附加参数]
策略有三类:
DIRECT—— 直连,不走节点REJECT—— 直接断开,用于广告和追踪- 策略组名 —— 例如
🚀 节点选择、📺 流媒体,走对应节点
一个最小示例:
rules:
- DOMAIN-SUFFIX,openai.com,🚀 节点选择
- DOMAIN-KEYWORD,analytics,REJECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,🚀 节点选择
最后的 MATCH 是兜底,所有没命中的流量按它处理。如果你的机场把 MATCH 指向了 DIRECT,那些没被规则收录的境外网站就会打不开——这是「规则模式下部分网站不通」的常见根因,相关判断方法见 规则、全局、直连模式区别。
常用规则类型完整参考
| 规则类型 | 匹配对象 | 示例 | 说明 |
|---|---|---|---|
DOMAIN | 完整域名 | DOMAIN,www.google.com,PROXY | 精确匹配,不含子域名 |
DOMAIN-SUFFIX | 域名后缀 | DOMAIN-SUFFIX,google.com,PROXY | 含所有子域名,最常用 |
DOMAIN-KEYWORD | 域名关键字 | DOMAIN-KEYWORD,google,PROXY | 范围大,容易误伤 |
DOMAIN-REGEX | 域名正则 | DOMAIN-REGEX,^ad[0-9]+\.,REJECT | 性能较差,慎用 |
GEOSITE | 域名归属集合 | GEOSITE,youtube,PROXY | 依赖 geosite 数据库 |
IP-CIDR | IPv4 网段 | IP-CIDR,10.0.0.0/8,DIRECT,no-resolve | 需注意 no-resolve |
IP-CIDR6 | IPv6 网段 | IP-CIDR6,fc00::/7,DIRECT,no-resolve | 同上 |
IP-ASN | 自治域号 | IP-ASN,13335,PROXY | 按运营商/云厂商分流 |
GEOIP | IP 国家归属 | GEOIP,CN,DIRECT | 会触发 DNS 解析 |
SRC-IP-CIDR | 来源 IP | SRC-IP-CIDR,192.168.1.50/32,DIRECT | 按局域网设备分流 |
DST-PORT | 目标端口 | DST-PORT,22,DIRECT | 按服务类型分流 |
SRC-PORT | 来源端口 | SRC-PORT,53,DIRECT | 少用 |
PROCESS-NAME | 进程名 | PROCESS-NAME,Telegram.exe,PROXY | 桌面端按软件分流 |
PROCESS-PATH | 进程完整路径 | PROCESS-PATH,/usr/bin/curl,DIRECT | 同名程序区分用 |
NETWORK | 传输协议 | NETWORK,udp,PROXY | 区分 TCP/UDP |
RULE-SET | 引用规则集 | RULE-SET,reject,REJECT | 批量规则 |
AND / OR / NOT | 逻辑组合 | 见下文 | 多条件判断 |
MATCH | 兜底 | MATCH,🚀 节点选择 | 必须在最后一行 |
no-resolve 到底在做什么?
IP 类规则(IP-CIDR、GEOIP)匹配的是 IP,但客户端拿到的经常是域名。默认情况下内核会先做一次 DNS 解析拿到 IP 再比对,这会带来两个问题:一是增加延迟,二是这次解析可能走了被污染的 DNS 得到错误结果。
加上 no-resolve 后,只有当目标本来就是 IP 时才参与匹配,是域名就直接跳过。经验规则:
- 内网段、保留地址的 IP 规则 → 一定加
no-resolve,放在规则列表最前面。 - 放在列表末尾的
GEOIP,CN兜底 → 不加,这时确实需要靠 IP 判断归属。
rules:
# 前置的 IP 规则加 no-resolve,避免无谓解析
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- 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
# ... 中间是域名规则 ...
# 末尾的 GEOIP 兜底不加 no-resolve
- GEOIP,CN,DIRECT
- MATCH,🚀 节点选择
DNS 解析本身的配置(fake-ip、DoH 等)会直接影响这类规则的准确性,详见 DNS 污染与泄漏怎么解决。
怎么加规则才不会被订阅更新冲掉?
Clash Verge Rev(推荐方式)
在订阅卡片上点右键(或右上角菜单)→「编辑 Merge」,写入 YAML:
prepend-rules:
- PROCESS-NAME,Telegram.exe,🚀 节点选择
- DOMAIN-SUFFIX,mycompany.internal,DIRECT
- DOMAIN-SUFFIX,anthropic.com,🤖 AI
append-rules:
- DOMAIN-SUFFIX,example-fallback.com,DIRECT
保存后重新点选该订阅卡片使配置重新生成,否则不生效。Merge 文件还支持 prepend-proxy-groups、prepend-rule-providers、dns 等字段,可以覆写配置的几乎任意部分。
Clash Verge Rev 还提供「编辑 Script」,用 JavaScript 修改整份配置对象,适合需要循环、条件判断的复杂改写。除非规则语法实在表达不了,否则优先用 Merge。
Clash Meta for Android
在「配置」列表里点该配置的编辑按钮,选「覆写」,写法与上面的 Merge 基本一致。部分版本另提供图形化的「应用分流」界面,可直接勾选哪些 App 走代理,等价于批量生成 PROCESS-NAME 规则。
Shadowrocket
iOS 上不支持进程分流。规则写在「配置」标签页的模块或 .conf 文件里,语法是 Surge 风格(DOMAIN-SUFFIX,example.com,PROXY),概念相通但不能直接照搬 Clash 的 YAML。
通用建议
把自定义规则控制在几十条以内,成规模的列表交给规则集。规则越少,出问题时越容易定位。
规则集(RULE-SET)怎么配?
当你需要几千条广告域名或国内域名列表时,手写不现实,用 rule-providers 引用外部规则集:
rule-providers:
reject:
type: http
behavior: domain
format: text
url: "https://example.com/rules/reject.txt"
path: ./ruleset/reject.txt
interval: 86400
cncidr:
type: http
behavior: ipcidr
format: text
url: "https://example.com/rules/cncidr.txt"
path: ./ruleset/cncidr.txt
interval: 86400
private:
type: http
behavior: classical
format: yaml
url: "https://example.com/rules/private.yaml"
path: ./ruleset/private.yaml
interval: 86400
rules:
- RULE-SET,private,DIRECT
- RULE-SET,reject,REJECT
- RULE-SET,cncidr,DIRECT,no-resolve
- MATCH,🚀 节点选择
字段说明:
| 字段 | 取值 | 说明 |
|---|---|---|
type | http / file | 远程拉取或本地文件 |
behavior | domain / ipcidr / classical | 决定文件内容的解析方式,填错会静默失效 |
format | yaml / text / mrs | 文件格式,mrs 是二进制格式,体积小加载快 |
url | 规则集地址 | 含 ://,YAML 里建议加引号 |
path | 本地缓存路径 | 相对客户端数据目录 |
interval | 秒 | 更新间隔,86400 为一天 |
三种 behavior 的区别:
domain:文件里每行是一个域名或+.example.com形式的后缀。ipcidr:每行是一个 IP 网段。classical:每行是完整的规则语句(DOMAIN-SUFFIX,example.com),最灵活但解析稍慢。
path 并把 interval 设长一些可以降低这类风险,重要规则最好自己留一份副本。十个常见需求的规则写法
以下片段都可以直接放进 prepend-rules,策略组名请按你订阅里的实际名称替换。
1. 让某个网站强制走代理
prepend-rules:
- DOMAIN-SUFFIX,notion.so,🚀 节点选择
- DOMAIN-SUFFIX,figma.com,🚀 节点选择
最常用的一条。DOMAIN-SUFFIX 会覆盖该域名的全部子域名。
2. 让某个软件永远直连
prepend-rules:
- PROCESS-NAME,Thunder.exe,DIRECT
- PROCESS-NAME,BaiduNetdisk.exe,DIRECT
- PROCESS-NAME,WeChat.exe,DIRECT
下载工具、网盘、国内即时通讯走代理毫无意义,还会消耗机场流量。macOS 上进程名不带 .exe,写 PROCESS-NAME,Thunder,DIRECT。
3. 让某个软件强制走代理
prepend-rules:
- PROCESS-NAME,Telegram.exe,🚀 节点选择
- PROCESS-NAME,Discord.exe,🚀 节点选择
- PROCESS-NAME,ssh,🚀 节点选择
比逐个添加域名规则可靠,因为这些软件的服务器 IP 和域名经常变。注意 PROCESS-NAME 规则需要开启 TUN 模式或客户端具备进程探测权限才能生效。
4. 屏蔽广告和追踪
prepend-rules:
- DOMAIN-KEYWORD,doubleclick,REJECT
- DOMAIN-SUFFIX,googlesyndication.com,REJECT
- DOMAIN-SUFFIX,scorecardresearch.com,REJECT
- DOMAIN-SUFFIX,adsystem.com,REJECT
自己列举只能覆盖很小一部分,建议配合前面讲的 RULE-SET 引用维护良好的广告规则集。
5. 公司内网、NAS、路由器管理页直连
prepend-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
- DOMAIN-SUFFIX,lan,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- DOMAIN-SUFFIX,corp.internal,DIRECT
开了 TUN 模式后内网设备访问不了,绝大多数是因为缺这几条。
6. 游戏走专线节点
prepend-rules:
- PROCESS-NAME,LeagueClient.exe,🎮 游戏专线
- DOMAIN-SUFFIX,riotgames.com,🎮 游戏专线
- DOMAIN-SUFFIX,steamserver.net,🎮 游戏专线
- AND,((NETWORK,udp),(DST-PORT,27000-27100)),🎮 游戏专线
游戏对延迟和丢包敏感,应该指向 IEPL/IPLC 专线而不是普通中转,两者差别见 IEPL 和 IPLC 的区别。注意 Steam 的下载流量和游戏流量应该分开处理,下载走直连更快。
7. AI 服务指定一个干净节点
prepend-rules:
- DOMAIN-SUFFIX,openai.com,🤖 AI
- DOMAIN-SUFFIX,chatgpt.com,🤖 AI
- DOMAIN-SUFFIX,anthropic.com,🤖 AI
- DOMAIN-SUFFIX,claude.ai,🤖 AI
- DOMAIN-SUFFIX,gemini.google.com,🤖 AI
AI 服务对 IP 的风控比普通网站严格,用一个独享或低倍率的节点单独承载,避免和大量用户共用出口 IP 触发风控。
8. 按局域网设备分流
prepend-rules:
- SRC-IP-CIDR,192.168.1.50/32,DIRECT
- SRC-IP-CIDR,192.168.1.60/32,📺 流媒体
在软路由或开了「允许局域网连接」的电脑上很有用:让电视只走流媒体节点、让某台工作机完全直连。
9. 按端口分流
prepend-rules:
- DST-PORT,22,🚀 节点选择
- DST-PORT,3389,DIRECT
- AND,((NETWORK,udp),(DST-PORT,443)),REJECT
最后一条是常见技巧:拒绝 UDP 443 可以阻止浏览器使用 QUIC,强制回退到 TCP,能解决某些视频网站在代理下加载异常的问题。
10. 逻辑规则组合
prepend-rules:
- AND,((DOMAIN-SUFFIX,google.com),(NETWORK,tcp)),🚀 节点选择
- OR,((DOMAIN-SUFFIX,netflix.com),(DOMAIN-SUFFIX,nflxvideo.net)),📺 流媒体
- NOT,((GEOIP,CN)),🚀 节点选择
AND / OR / NOT 的子条件必须用双层括号包裹,这是最容易写错的语法点。逻辑规则性能开销略高,只在确有必要时用。
规则不生效怎么调试?
按这个顺序查,基本能覆盖所有情况:
- 确认配置重新生成了。改完 Merge 必须重新点选订阅卡片,或点「重载配置」。
- 看「连接」页面。这是最有用的工具:每条活跃连接都会显示目标地址、命中的规则和使用的策略组。看到目标域名命中了别的规则,说明那条规则排在你的前面。
- 看日志页。把日志等级调到
debug,能看到 DNS 解析和规则匹配的细节。YAML 语法错误也会在这里报出来。 - 检查策略组名是否完全一致。策略组名通常带 emoji 和空格,少一个字符或 emoji 不同就会导致配置加载失败。最保险的做法是从原配置里复制粘贴。
- 检查缩进。YAML 对缩进极其敏感,
prepend-rules下每条规则前是两个空格加短横线。 - 确认用的是 prepend 而不是 append。
REJECT。如果目标网站立刻打不开了,说明规则命中了;如果照常打开,说明规则压根没生效,问题在语法或顺序上。写规则时最容易踩的坑
- DOMAIN-KEYWORD 误伤。写
DOMAIN-KEYWORD,google,DIRECT会连带命中googleapis.com、googlevideo.com等一大片。能用DOMAIN-SUFFIX就不要用关键字。 - 把 IP 规则放在最前且不加 no-resolve。会导致每个连接都先做一次 DNS 解析,首屏明显变慢。
- MATCH 不在最后一行。
MATCH之后的所有规则都是死代码,永远不会被执行。 - 改了机场原始配置文件。下次更新全部丢失,前面已经强调过。
- 策略组不存在。规则里引用了配置中没有的策略组名,整份配置会加载失败,表现是「导入后完全没有节点」。
- 规则集 behavior 填错。
domain类型的文件配了classical的 behavior 不会报错,只会静默地一条都匹配不上。 - URL 没加引号。YAML 里含
://的字符串建议统一加双引号,避免解析歧义。
一份可以直接用的起步模板
把下面这段放进 Clash Verge Rev 的 Merge,按需删改:
prepend-rules:
# 内网优先直连
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- DOMAIN-SUFFIX,local,DIRECT
# 国内软件不走代理
- PROCESS-NAME,WeChat.exe,DIRECT
- PROCESS-NAME,BaiduNetdisk.exe,DIRECT
# 需要代理的软件
- PROCESS-NAME,Telegram.exe,🚀 节点选择
# AI 服务单独出口
- DOMAIN-SUFFIX,openai.com,🚀 节点选择
- DOMAIN-SUFFIX,claude.ai,🚀 节点选择
# 明确需要代理的站点
- DOMAIN-SUFFIX,notion.so,🚀 节点选择
配好之后,你基本不再需要手动切换代理模式。接下来可以进一步优化的方向:给不同用途选择合适的节点,见 机场节点怎么选;理解不同协议在你的网络环境下的表现差异,见 机场协议怎么选。