一、GeoIP 与 GeoSite 分别管什么
把分流规则想象成一道分拣例题:每来一条连接,内核要回答两个问题——这个目标 IP 在哪个国家或地区?这个目标域名属于哪一类站点?前一个问题查 GeoIP 数据库,后一个问题查 GeoSite 数据库。两份文件各司其职、互不替代,缺了哪一份,对应的规则就查不到答案。
GeoIP:IP 到国家地区的对照表
GeoIP 数据库存的是 IP 地址段与国家/地区代码的映射。规则里写 GEOIP,CN,DIRECT,内核拿到连接的目标 IP 后去库里查,命中 CN 段就走直连。mihomo(Clash Meta)内核默认读取 country.mmdb,首次加载时会生成一份自用的 geoip.metadb 缓存;把 geodata-mode 设为 true 后,GEOIP 规则改为读取 v2ray 格式的 geoip.dat。另外还有一份可选的 ASN 数据库 GeoLite2-ASN.mmdb,供 IP-ASN 规则按自治域编号分流。这些名词在名词解释页都有对应条目,卡壳时可以回查。
GeoSite:域名到站点分类的对照表
GeoSite 数据库来自社区的 domain-list-community 项目:维护者把海量域名按服务、厂商、地区整理成分类清单,再编译成一份 geosite.dat。规则里写 GEOSITE,google,内核就把目标域名与 google 分类下的条目逐条比对。分类支持属性修饰,例如 google@cn 只命中 google 分类里被标记为中国大陆属性的条目,颗粒度比整张分类更细。
| 对比项 | GeoIP | GeoSite |
|---|---|---|
| 默认文件 | country.mmdb / geoip.metadb | geosite.dat |
| 回答的问题 | 这个 IP 属于哪个国家/地区 | 这个域名属于哪一类站点 |
| 对应规则 | GEOIP,CN,DIRECT | GEOSITE,cn,DIRECT |
| 数据内容 | IP 段与国家代码的映射 | 域名与分类标签的映射 |
| 常见来源 | meta-rules-dat 仓库 | meta-rules-dat 仓库 |
二、为什么这两份数据库要定期更新
两份数据库都是活数据。云厂商每月都在扩容,IP 段会在地区之间重新划分;新服务上线、旧域名易主,站点分类也随之变化。数据库停在半年前,分流判断就按半年前的世界运行,常见的后果有三类:
- 该直连的走了代理:新划入 CN 的 IP 段在旧库里没有记录,被兜底规则送去代理,访问国内站点反而绕路。
- 该代理的走了直连:新上线的境外服务域名还没进 geosite 分类,被 GEOIP 或兜底规则放行直连,表现为打不开或时好时坏。
- 规则命中率下降:分类条目变动后,原先依赖的分类名可能拆分或改名,旧规则形同虚设。
一般使用强度下,每一到四周更新一次足够;如果规则对时效敏感,例如需要第一时间识别新上线的服务,可以把自动更新间隔压到 24 小时,代价只是每天多拉取一次几 MB 的文件。
三、更新数据库的三种方法
方法一:客户端界面按钮(最省事)
图形客户端把更新做成了按钮。以 Clash Verge Rev 为例,设置页里有 GeoIP、GeoSite 等外部资源条目,点更新即可拉取最新文件;FlClash 等客户端也有类似的资源更新入口。更新完成后重载一次配置或重启内核,让新库真正生效。这一步适合所有人,先做法后原因:按钮背后执行的,正是方法三里手动做的那套下载替换。
方法二:配置文件里开启自动更新
mihomo 内核自带自动更新开关,写进 config.yaml 顶层即可:
# Geo 数据库自动更新
geo-auto-update: true # 开启自动更新
geo-update-interval: 24 # 更新间隔,单位小时
# 自定义下载来源(可换成镜像地址)
geox-url:
geoip: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat"
geosite: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb"
asn: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb"
三个要点:geo-update-interval 的单位是小时,不是秒;geox-url 的四个键分别对应 geoip.dat、geosite.dat、country.mmdb 与 ASN 库,用不到的键可以不写;GitHub 直连不稳的网络环境,把地址换成可访问的镜像即可,文件内容一致。
方法三:手动下载替换文件(最可控)
界面更新失败,或者想精确控制文件版本时,手动替换最可靠:
- 打开下载源浏览器访问 meta-rules-dat 仓库的 Release 页,找到 geoip.dat、geosite.dat、country.mmdb、GeoLite2-ASN.mmdb 四个文件。
- 下载到本地逐个点开下载;命令行环境也可以用 curl 一次拉取单个文件。
- 定位配置目录mihomo 的配置目录与 config.yaml 同级;Clash Verge Rev 可在设置里一键打开配置目录。
- 替换并重启用新文件覆盖旧文件,重启内核或重载配置,让内核重新读库。
curl -L -o geosite.dat https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat替换前先停内核
部分系统下文件被占用会导致覆盖失败,替换前先退出或暂停内核;替换后看一眼运行日志,确认 geo 文件加载行没有报错再收尾。
四、在分流规则里引用 geoip 与 geosite
数据库就位后,规则才有查的对象。一段典型的分流收尾长这样:
rules:
- GEOSITE,category-ads-all,REJECT # 广告域名,直接拦截
- GEOSITE,google,节点选择 # Google 系服务走代理
- GEOSITE,cn,DIRECT # 国内站点直连
- GEOIP,CN,DIRECT,no-resolve # 目标 IP 在国内则直连
- MATCH,节点选择 # 其余全部走代理
逐条推演顺序:连接进来先比域名分类,GEOSITE 三条把能按域名判断的都处理完;轮到 GEOIP 时,目标若是 IP 直接查库,若是域名则取决于 no-resolve——不加时内核先做 DNS 解析再查库,判断更全但多一次解析;加上 no-resolve 则只对 IP 形态的连接生效,省掉解析开销,代价是域名形态的连接会漏过这条规则。上面这段配置把 GEOSITE,cn 放在前面兜住了国内域名,所以 GEOIP 加 no-resolve 也不会放跑它们。
常用 geosite 分类速查:
| 分类名 | 覆盖内容 |
|---|---|
| category-ads-all | 广告与跟踪域名合集 |
| cn | 中国大陆站点域名 |
| geolocation-!cn | 中国大陆以外的站点 |
| google / youtube | Google 系服务与 YouTube |
| telegram | Telegram 全系域名 |
| github | GitHub 主站与资源域名 |
| apple / microsoft | 苹果与微软的服务域名 |
| gfw | 常见被阻断站点合集 |
两点书写约定:分类名一律按官方清单的小写形式书写,写错不会报错、只会静默不命中;需要更细颗粒度时用 @ 属性,例如 GEOSITE,google@cn,DIRECT 把 Google 在国内可达的域名单独放行,GEOSITE,geolocation-!cn,节点选择 则等价于“境外站点统一走代理”。
五、更新与引用的常见问题
更新按钮一直失败
九成是下载源不可达。GitHub Release 在部分网络下直连困难,把 geox-url 换成镜像地址,或先让客户端自身走上代理再点更新;也可以直接走方法三手动替换,绕开客户端的下载逻辑。
规则写了却不生效
按顺序查三处:一看规则顺序,GEOSITE/GEOIP 是否被前面的宽泛规则(如位置靠前的 MATCH 或大段 IP-CIDR)截胡;二看是否重载,改完配置要重载或重启内核才会重新读库;三看分类名拼写,写错的分类名不会弹错,只会安静地漏判。
低内存设备加载吃力
路由器等低配设备可以把 geodata-loader 设为 memconservative,用加载速度换内存占用;日常 PC 保持默认的 standard 即可。
把更新频率交给 geo-auto-update,把分流判断交给顺序合理的规则,这两份数据库就能长期安静地干活。如果规则分流的整体框架还没搭起来,先回使用指南补齐基础,再回来调这份进阶配置,顺序不要反。