GeoIP、GeoSite、规则集是什么:规则匹配顺序、常见规则集来源、怎么更新,以及为什么有的网站分流错了
机场订阅里几百条规则的背后是 GeoIP 数据库、GeoSite 域名列表和 Rule Provider 远程规则集三种东西。本文讲它们各自管什么、规则从上到下怎么匹配、Loyalsoldier、MetaCubeX、blackmatrix7 这些常见来源的区别、怎么更新,以及某个网站分流错误时怎么定位到是哪条规则在作怪。
分流靠三样东西
打开一份机场订阅配置,规则部分可能有几十条到几千条。它们大致引用三种数据源:
- GeoIP:一个把 IP 地址段映射到国家代码的数据库。规则
GEOIP,CN,DIRECT的意思是「目标 IP 查出来属于中国,就直连」。 - GeoSite:一个按类别整理的域名列表集合。
GEOSITE,google,PROXY的意思是「域名属于 google 这一类,走代理」,这一类里有几百个域名,不用你一条条写。 - 规则集(Rule Provider / rule-set):远程托管的规则文件,客户端定期下载。订阅里一行
RULE-SET,streaming,流媒体节点背后是一份几千行的域名和 IP 列表。
三者都是「把大量规则打包成一个名字」的手段,区别在于数据的组织方式和更新机制。
规则匹配顺序
无论用哪种数据源,规则引擎的逻辑都一样:从第一条开始往下匹配,命中就执行,后面全部跳过。这一点决定了配置的写法:
- 最具体的放最前:单个域名的 DOMAIN、DOMAIN-SUFFIX 规则,比如你手动指定 claude.ai 走某个固定节点。
- 分类规则放中间:GEOSITE、RULE-SET,覆盖面广但不精确。
- GEOIP 放靠后:IP 规则需要先解析域名才能匹配,开销大且有 DNS 泄露风险,放到域名规则都没命中之后。
- MATCH 兜底放最后:前面全没命中的流量去哪,通常是代理。
典型的顺序错误是把 GEOIP,CN,DIRECT 放在了 GEOSITE 规则之前:很多海外服务用了国内 CDN 节点,IP 查出来是中国,于是走了直连,然后打不开。Clash 配置里 no-resolve 参数能让 IP 规则跳过未解析的域名,缓解这个问题。
三种代理模式(规则 / 全局 / 直连)与规则引擎的关系见 代理模式与规则。
常见规则集来源
机场订阅里的规则集大多来自几个社区维护的仓库,知道名字有助于判断订阅质量:
- Loyalsoldier/clash-rules:Clash 经典规则集,分 reject、icloud、apple、google、proxy、direct、private、gfw、tld-not-cn、telegramcidr、cncidr、lancidr 等文件,每天自动更新。多数机场的默认分流配置基于它。
- blackmatrix7/ios_rule_script:按服务细分的规则,Netflix、Disney、OpenAI、Telegram、Bilibili 等各一份,提供 Clash、Surge、Quantumult X、Loon 多种格式。想做精细分流(流媒体走 A、AI 走 B)通常引它。
- MetaCubeX/meta-rules-dat:Clash Meta 内核(mihomo)官方维护的 GeoIP、GeoSite 数据,以及对应的 .mrs 二进制规则集,加载速度比文本规则快得多。
- v2fly/domain-list-community:GeoSite 的上游数据源,Xray、sing-box 的 geosite.dat 由它生成。
- SagerNet/sing-geoip、sing-geosite:sing-box 专用格式,1.8 以后逐步被 rule-set 取代。
- MaxMind GeoLite2 / 各家 Country.mmdb:GeoIP 的数据库本体。不同来源对部分 IP 的国家判断不一致,这是「同一网站在两个客户端分流结果不同」的常见原因。
怎么更新
规则集:Clash 配置里每个 rule-provider 有 interval 字段,单位秒,到期自动拉取。Clash Verge Rev 在「订阅 → 右键 → 更新规则集」或「设置 → 规则集」里手动触发。sing-box 的 rule_set 有 update_interval,默认一天。
GeoIP / GeoSite 数据库:是客户端自带的文件,不随订阅更新。Clash Verge Rev 在「设置 → Clash 设置 → GEO 数据更新」里一键更新,也可以设置自动更新间隔。FlClash 在「工具 → 数据库」。sing-box 1.8 以后推荐改用远程 rule-set 替代本地 geo 文件。
订阅本身:机场更新了规则结构,你需要更新订阅才能拿到。订阅更新和规则集更新是两件事,订阅更新失败的排查见 订阅更新失败怎么办。
更新失败最常见的原因是规则集托管在 GitHub 上,而拉取时客户端还没连上代理。Clash 配置里给 rule-provider 的下载走代理,或把 URL 换成国内可达的镜像,可以解决。
为什么有的网站分流错了
按出现频率排列:
国内网站走了代理:它的域名不在直连规则集里,且 IP 属于海外 CDN 或 GeoIP 判定不是 CN,于是掉到 MATCH 走了代理。表现是国内网站变慢或登录异常。加一条 DOMAIN-SUFFIX,example.cn,DIRECT 到规则最前面。
海外网站走了直连:它用了国内 CDN,GEOIP 规则匹配为 CN。表现是能打开首页但功能异常,或完全打不开。加一条 DOMAIN-SUFFIX 走代理,或给 GEOIP 规则加 no-resolve。
某个服务一部分走代理一部分直连:同一服务的多个域名分属不同规则。典型是 Google 登录态在不同节点间跳。把这个服务的所有域名指向同一个策略组。
规则正确但走错了节点:规则指向的策略组当前选中的节点不对,不是规则的错。
两台设备分流不同:客户端内核不同(Premium、Meta、sing-box)、GeoIP 数据库来源不同、规则集更新时间不同,都会导致差异。
定位方法:打开客户端的「连接」或「日志」面板,找到那个网站的连接记录,看它命中的是哪条规则、走的哪个策略组。Clash Verge Rev 的连接页直接显示「规则」一列,这是最快的排错入口。
自己加规则的正确位置
直接改订阅文件,下次订阅更新就被覆盖。正确做法是用客户端的覆写功能:Clash Verge Rev 的「订阅 → 右键 → 编辑文件」里有 Merge 和 Script 两种覆写;FlClash 的「覆写」页;Mihomo Party 的「覆写」。在覆写里 prepend-rules 加到最前面,优先级最高,且不受订阅更新影响。
规则集越多匹配越慢,但在现代设备上每条连接的匹配时间仍是毫秒级,不必为性能删规则。真正影响速度的是节点,不是规则。节点与地区的选择另见 机场节点怎么选。
几个值得记住的原则
精确优先于分类:你手动写的一条域名规则,永远比规则集里的分类更可信,所以放最前面。
域名优先于 IP:域名规则不需要先解析,匹配快且没有 DNS 泄露风险。IP 规则是兜底,不是主力。
规则集是别人维护的:它可能漏掉新域名,也可能把某个域名归错类。遇到分流错误先怀疑规则集的归类,再怀疑客户端。
不要删规则换速度:规则数量对速度的影响可以忽略,真正慢的是节点。为了「精简」删掉规则集,只会让更多网站掉进兜底规则。
覆写而不是改订阅:所有自定义都写在客户端的覆写里,订阅更新后依然生效。
一个最小规则结构示例
从上到下:你自己的几条精确规则(AI 域名固定到美国节点、公司内网直连)→ 广告拦截规则集 → 局域网与私有地址直连 → 国内域名规则集直连 → 流媒体与特定服务的规则集指向专用策略组 → 海外域名规则集走代理 → GEOIP,CN 直连(带 no-resolve)→ MATCH 走代理。多数机场的默认订阅就是这个骨架的变体,看懂它之后,任何分流问题都能顺着这条链找到出错的那一环。
相关
常见问题
GeoIP 和 GeoSite 有什么区别?
GeoIP 按 IP 地址判断属于哪个国家,GeoSite 按域名判断属于哪一类服务。前者用来写「国内 IP 直连」,后者用来写「谷歌全家走代理」。
规则是按什么顺序匹配的?
从上到下,第一条匹配上的生效,后面的不再看。所以精确规则放前面、GEOIP 放后面、MATCH 兜底放最后。
规则集多久更新一次?
Clash 系的 Rule Provider 有 interval 参数,默认 86400 秒即一天。GeoIP、GeoSite 数据库文件在客户端设置里手动或定期更新。
为什么某个国内网站走了代理?
它用了海外 CDN,GeoIP 判断为国外;或者它的域名不在任何直连规则集里,掉到了 MATCH 兜底。加一条 DOMAIN-SUFFIX 直连规则即可。
自己写规则放在哪里不会被订阅更新覆盖?
放在客户端的「覆写」或「Override」功能里,而不是直接改订阅文件。订阅更新只替换节点和原有规则,覆写内容会叠加在上面。
本文为信息整理与个人经验,不构成购买建议。机场政策与软件界面可能变化,以官方为准。发现过期内容请 联系纠错。