分流规则进阶:GeoSite、规则集与自定义规则,把分流握在自己手里
在 出站模式 那篇里我们说过:规则模式是日常的唯一正确选择。但很多人用着用着会遇到这种困惑:"明明是规则模式,为什么国内网站走了代理?""ChatGPT 一会儿美国一会儿日本,账号被风控了。"这些问题的答案都在规则列表里。这篇讲清楚三件事:规则是怎么匹配的、机场订阅里那几百条规则是哪来的、以及怎么写自己的规则。
规则是怎么匹配的:从上到下,命中即停
所有主流内核(mihomo / sing-box / Surge)的规则匹配都遵循同一个原则:first-match-wins——拿着你的请求,从规则列表第一条开始逐条比对,命中哪条就按哪条走,后面的规则不再看。
一条请求通常要经历这几层判断:
- 域名规则:直接拿请求的域名比对(
DOMAIN-SUFFIX,google.com),不需要解析 IP,最快 - IP 规则:域名规则都没命中,内核才会做 DNS 解析,拿解析出的 IP 去比对(
GEOIP,CN) - 兜底规则:
MATCH(mihomo)或FINAL(Surge),谁都没命中时的默认去向
这个顺序带来一个直接推论:规则放错位置等于没写。如果你把自定义规则追加在列表末尾,而前面已有一条更宽泛的规则把它截胡,你的规则永远不会生效。
GeoSite 和 GeoIP:两份"数据库"决定了分流的智商
规则里出现的 GEOSITE,cn 和 GEOIP,CN 不是实时查询,而是查本地两份数据库:
| 数据库 | 内容 | 回答的问题 |
|---|---|---|
| GeoSite(域名库) | 按类别组织的域名清单:geosite:google、geosite:cn、geosite:openai |
"这个域名属于哪个阵营?" |
| GeoIP(IP 库) | IP 段与国家的映射 | "这个 IP 在哪个国家?" |
- 数据源:社区主流是 v2fly 的 domain-list-community,以及 Loyalsoldier 的增强版(分类更细、含广告分类)。内核作者把它们打包成
geosite.dat/GeoIP.mmdb,或 sing-box 的二进制规则集 - 会过时:数据库是离线快照。新上线的服务、换了 CDN 的网站,旧库就可能判错——"规则模式下某网站走错路",八成是库老了
- 怎么办:客户端设置里找"更新 GeoIP/GeoSite"或"更新规则集",每月点一次;mihomo 系客户端大多支持自动更新
规则集:别自己攒规则,用社区维护好的
机场订阅转换出来的配置里那几百上千条规则,并不是机场手写的,几乎都来自几个公开的规则集项目:
- ACL4SSR:最老牌,大多数订阅转换的默认模板,覆盖面广、分类粗
- blackmatrix7:按服务切得更细(Bilibili、Netflix、OpenAI 各自一条规则集),适合精细控制
- Loyalsoldier:域名数据库本身,很多规则集的上游
现代客户端的做法是远程规则集(rule-set / rule-provider):配置里只写一句"引用某个 URL 的规则",客户端定期自动更新。好处是规则永远新鲜,坏处是规则源失效时分流会退化——所以值得在客户端里看一眼上次更新日期。
实战:四个高频自定义场景
以下用 mihomo(Clash 系)语法举例。核心原则只有一句:写在 rules: 列表的最上方。其他客户端语法不同,逻辑完全一样。
场景 1:公司内网 / 校园网强制直连
rules:
- DOMAIN-SUFFIX,corp.example.com,DIRECT
- IP-CIDR,10.8.0.0/16,DIRECT,no-resolve
其实 RFC1918 私有网段默认就有直连规则,但有些公司用公网 IP 做内网,就需要自己补。
场景 2:AI 服务锁定一个地区的节点
ChatGPT、Claude 对 IP 归属敏感,IP 在国家之间乱跳是封号高危行为。把它们单独指向一个手动选定的策略组,而不是跟随自动测速组:
rules:
- GEOSITE,openai,🤖 AI 专用
- DOMAIN-SUFFIX,claude.ai,🤖 AI 专用
然后在客户端里给"🤖 AI 专用"组固定选一个家宽/原生节点,忍住别换。
场景 3:某个 App 强制直连
网银、外卖、政务类 App 对境外 IP 极其敏感,误走代理轻则验证码重则锁号:
rules:
- PROCESS-NAME,bankApp.exe,DIRECT # 桌面端按进程名
- GEOSITE,category-bank-cn,DIRECT # 或按银行域名类别
场景 4:广告域名拦截
rules:
- GEOSITE,category-ads-all,REJECT
广告拦截属于"看着美好,用着添堵"的功能:误杀正常接口、App 内信息流广告去不掉、还可能导致个别 App 功能异常。建议只把它当作辅助,别指望替代专业去广告工具。
各客户端语法速查
| 功能 | mihomo(Clash 系) | sing-box | Surge |
|---|---|---|---|
| 域名后缀 | DOMAIN-SUFFIX,xx.com,DIRECT |
"domain_suffix": "xx.com" |
DOMAIN-SUFFIX,xx.com,DIRECT |
| 域名库 | GEOSITE,cn,DIRECT |
引用 rule_set | RULE-SET,url,DIRECT |
| IP 库 | GEOIP,CN,DIRECT |
"geoip": "cn" |
GEOIP,CN,DIRECT |
| 进程名 | PROCESS-NAME,app,DIRECT |
"process_name" |
PROCESS-NAME,app,DIRECT |
| 兜底 | MATCH,PROXY |
"final": "proxy" |
FINAL,PROXY |
细节以各自官方文档为准,但记住"从上到下、命中即停"这八个字,语法只是写法问题。
常见坑
- 改了规则没生效:客户端要重载配置;浏览器和 App 有连接复用(keep-alive),旧连接还走老路,杀进程重开最干净
- 国内网站走了代理:先更新 GeoSite/GeoIP 库,八成是库老了;再看是不是 DNS 污染导致 GEOIP 误判——TUN + fake-ip 模式下域名规则优先于解析,能规避一大半这类问题(见 TUN 模式)
- 锁定节点后 AI 还是被风控:那是节点 IP 本身脏,不是规则问题,换节点不换规则
- 规则越多越卡? 几千条规则对性能无感,但超大的远程规则集文件会拖慢客户端启动,按需引用即可
至此,"分流三部曲"齐了:出站模式 解决"走哪条路",TUN 模式 解决"哪些流量能被接管",本篇解决"规则判错了怎么办"。分流配置没有银弹,但理解了匹配顺序,你至少能自己定位问题出在第几层。