教程中心 高级教程 高级

Clash 自定义分流规则教程(2026):规则语法、规则集与常见需求示例

规则从上往下匹配、命中即停。搞懂这一条,再配上十个实战片段,你就能精确控制每一个程序和网站走哪条路。

发布: 更新: 审阅: 约 8 分钟阅读

先说最重要的一条:不要直接修改机场订阅下载下来的配置文件。下次更新订阅时你的修改会被完整覆盖。正确做法是用客户端的覆写机制(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-CIDRIPv4 网段IP-CIDR,10.0.0.0/8,DIRECT,no-resolve需注意 no-resolve
IP-CIDR6IPv6 网段IP-CIDR6,fc00::/7,DIRECT,no-resolve同上
IP-ASN自治域号IP-ASN,13335,PROXY按运营商/云厂商分流
GEOIPIP 国家归属GEOIP,CN,DIRECT会触发 DNS 解析
SRC-IP-CIDR来源 IPSRC-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,🚀 节点选择

字段说明:

字段取值说明
typehttp / file远程拉取或本地文件
behaviordomain / ipcidr / classical决定文件内容的解析方式,填错会静默失效
formatyaml / text / mrs文件格式,mrs 是二进制格式,体积小加载快
url规则集地址含 ://,YAML 里建议加引号
path本地缓存路径相对客户端数据目录
interval秒更新间隔,86400 为一天

三种 behavior 的区别:

  • domain:文件里每行是一个域名或 +.example.com 形式的后缀。
  • ipcidr:每行是一个 IP 网段。
  • classical:每行是完整的规则语句(DOMAIN-SUFFIX,example.com),最灵活但解析稍慢。
注意规则集的 URL 一旦失效,客户端可能在启动时拉取失败并回退到空规则集,表现为「分流突然全乱了」。用带缓存的 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 的子条件必须用双层括号包裹,这是最容易写错的语法点。逻辑规则性能开销略高,只在确有必要时用。

规则不生效怎么调试?

按这个顺序查,基本能覆盖所有情况:

  1. 确认配置重新生成了。改完 Merge 必须重新点选订阅卡片,或点「重载配置」。
  2. 看「连接」页面。这是最有用的工具:每条活跃连接都会显示目标地址、命中的规则和使用的策略组。看到目标域名命中了别的规则,说明那条规则排在你的前面。
  3. 看日志页。把日志等级调到 debug,能看到 DNS 解析和规则匹配的细节。YAML 语法错误也会在这里报出来。
  4. 检查策略组名是否完全一致。策略组名通常带 emoji 和空格,少一个字符或 emoji 不同就会导致配置加载失败。最保险的做法是从原配置里复制粘贴。
  5. 检查缩进。YAML 对缩进极其敏感,prepend-rules 下每条规则前是两个空格加短横线。
  6. 确认用的是 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,🚀 节点选择

配好之后,你基本不再需要手动切换代理模式。接下来可以进一步优化的方向:给不同用途选择合适的节点,见 机场节点怎么选;理解不同协议在你的网络环境下的表现差异,见 机场协议怎么选。

常见问题

为什么我改了配置文件,更新订阅后规则就没了?
因为更新订阅的本质是重新下载机场的配置文件并覆盖本地那一份,你直接写进去的内容自然被冲掉。正确做法是使用客户端提供的覆写机制:Clash Verge Rev 用订阅卡片的 Merge(YAML 覆写)或 Script,Clash Meta for Android 用「覆写」功能,这些内容单独保存,每次订阅更新后会重新套用到新配置上。
prepend-rules 和 append-rules 该用哪个?
绝大多数情况用 prepend-rules。它把你的规则插到机场规则列表的最前面,因此优先级最高,能覆盖机场的既有判断,比如把某个被机场判为直连的域名强制改成走代理。append-rules 插在最后、但仍在 MATCH 之前,适合补充兜底性质的规则。如果你的规则写了却不生效,八成是用了 append 而机场前面已有规则先命中了。
GEOIP 规则为什么会拖慢访问速度?
GEOIP 匹配的是目标 IP 的国家归属,而客户端拿到的往往是域名,必须先做一次 DNS 解析才能得到 IP 去比对,这次解析可能走了被污染的国内 DNS 从而返回错误结果,也会增加首次连接的耗时。所以 GEOIP 规则通常只放在规则列表靠后位置作为兜底,并且对内网段等已知 IP 段加 no-resolve 参数避免触发解析。
规则写了但不生效,怎么确认到底命中了哪一条?
用客户端的「连接」页面。它会列出每条活跃连接的目标地址、命中的规则和使用的策略组,是判断分流是否按预期工作的最直接工具。如果看到目标域名命中了一条你没料到的规则,说明那条规则在你的规则之前;如果显示的是 MATCH,说明所有规则都没匹配上。另外记得改完覆写要重新激活配置。
PROCESS-NAME 规则在手机上能用吗?
Android 上可以,但匹配的不是进程名而是应用包名,需要写成 com.example.app 这样的形式,部分客户端提供独立的应用分流界面替代手写规则。iOS 完全不支持按进程分流,系统不开放这个能力,Shadowrocket 只能通过域名和 IP 规则间接实现。桌面端 Windows 匹配 exe 文件名,macOS 和 Linux 匹配可执行文件名。
自己维护规则和直接用别人的规则集哪个好?
两者结合最实际。广告拦截、国内域名、流媒体解锁这类规模大、变动频繁的列表用 rule-provider 引用现成规则集,由维护者更新;你自己的个性化需求(公司内网、某个特定软件、某个小众网站)写成十几条 prepend-rules 放在最前面。不要试图手工维护上万条域名列表,也不要把所有判断都交给别人的规则集而失去对关键路径的控制。
规则数量多了会不会影响性能?
域名类规则(DOMAIN、DOMAIN-SUFFIX)使用前缀树匹配,几万条的量级对性能影响可以忽略。真正拖慢的是需要解析 IP 的规则(GEOIP、IP-CIDR 未加 no-resolve)和正则规则(DOMAIN-REGEX),前者每次可能触发 DNS 查询,后者逐条回溯。优化思路是把高频命中的规则往前放,把 IP 类规则往后放,正则规则尽量用关键字或后缀替代。

↑ 返回顶部