Clash Meta GeoIP 全走错线?MMDB 路径与 Country 规则逐项修复
很多人按教程写了「中国直连、非中国走代理」的 GEOIP,CN 行,却遇到国内站反而走出口、国外站被直连到不通的错位感。此时最容易怀疑的,一是国家地理库没加载/路径错了,二是库太旧,三是规则顺序与 DNS 行为让 Geo 根本没机会裁决。本文单独对准 Clash Meta(Mihomo 内核)所依赖的 离线 MMDB 与 geodata 配置,配合「规则在文件里从上到下的真实优先级」做逐项核对,与站内 《DNS 与 fake-ip 排查》、《rule-providers 下载与 path》 等文互补,不把锅全甩给「感觉规则写错了」。
先分清:症状是不是「整段依赖 Geo 失效」
若问题集中在某个域名、某条订阅或某几台 CDN,往往要先看域名类规则、远程规则集是否被合并到了前面;若表现为一大类 IP 段都像「国籍搞反了」,才更指向 Geo 库、解析结果或 Geo 规则没生效。前一类适合回到 rule-providers 与合并顺序;后一类才是下面 MMDB/GEOIP 的主场。
- 国内站整站走 PROXY:可能
GEOIP,CN没命中、或命中的CN在库里不是你以为的含义(例如只看了域名却走了境外解析)。 - 明显境外源站直连但很慢或不可用:可能是上游 DNS 给了解析到国内边缘或第三地,
GEOIP对解析后的 IP 判国与直觉不一致。 - 升级客户端后突然全乱:新版可能切换了
geodata-mode、或默认把库放进了新的配置目录,旧路径的geoip.mmdb不再被读。
心智模型
GEOIP,XX 这条规则在有可用 MMDB 且能拿到要匹配的 IP时才会给出「与直觉一致」的国籍。缺库、用错路径、用假 IP 做匹配、或更靠前的一条规则已终结决策,效果都会像「整段全走错线」。
MMDB 是什么,Clash Meta 拿它做什么
常见实现使用与 MaxMind GeoLite2/Country 同结构的国家库,文件扩展名多为 .mmdb。Clash 系列内核会在做基于 IP 的国家匹配时查询这份二进制库:例如规则里的 GEOIP,CN、GEOIP,US 等。没有这份库、或读到的文件损坏/过旧,行为就会退化为回退到后续规则、或让「按国家直连/代理」彻底失真。
注意:geosite(站点分类)和 geoip(国家/ASN 等,依库而定)是不同文件。「国内外分流整段走反」若只出在国家维度,优先查 geoip 相关文件;别去误调与域名列表无关的 geosite 而忽略 mmdb。
geodata 模式、路径与「内核到底读哪个文件」
在 Clash Meta / Mihomo 系配置中,常能看到 geodata-mode 一类项,用来区分 dat 分片与 mmdb 等实现差异。对多数桌面与移动客户端,你要在图形界面里找到与「GeoData / 地理数据 / 数据库」相关的设置页,核对显示的路径与磁盘上实际存在、大小合理的 geoip.mmdb(或你自定义命名的文件,须与配置一致)是否一一对应。
各操作系统上,可执行文件旁、用户数据目录、或 ./home 下都可能出现多份历史遗留文件。若你曾手动改路径或换过内核主版本,请在文件管理器里打开 UI 中显示的那一条绝对路径,看修改时间与大小是否随「检查更新/下载 Geo」按钮变化;完全不变的文件,多半是已经失效的副本。
建议你在本机做的核对动作
- 在客户端中触发一次「更新 Geo/下载数据库」,观察日志里是否报下载成功、路径可写。
- 在磁盘上按 UI 指明的路径找
.mmdb,看文件非零字节且能随更新变日期。 - 若使用 Docker/无头 部署,检查挂载卷是否把宿主机上那份库覆盖成空目录,或权限只读导致更新写不进去。
自动更新、镜像与「不是写了就会一直新」
很多发行版在 YAML 中支持 geo-auto-update 与 geo-update-interval(或等价 UI 开关),用来自动从上游拉新库。若你所在网络访问默认上游不稳,可配置 geox-url 一类「镜像地址」——具体键名以你当前 内核大版本与文档 为准。要点是:
- 自动更新要能真正执行:被防火墙挡、被代理自己拦截、或容器内没出站 DNS,都会表现为库永远停在旧版本。
- 间隔过短会徒增失败日志;国家边界数据本身也只需周期性更新,按周或按天即可,以稳定成功为先。
与 远程规则集 类似:path 与 URL 要成对可验证。Rule provider 管域名列表;国家匹配仍依赖 mmdb,二者不要混为一谈。规则集能更新、不代表 Geo 库也更新了。
规则顺序:GEOIP / Country 放哪、谁先匹配谁说了算
在 Clash 中,同一份 rules 列表从上到下,命中第一条即停。因此:
- 若你有一条很宽的
DOMAIN-SUFFIX,xxx,PROXY或其它域名规则在更上方,只要先命中了,后面的GEOIP,CN就与此连接无关——这常被误认为「国家库坏了」。 - 把「精细域名」「进程规则(若开启)」放在你认为合适的位置,最后再让
GEOIP做国别兜底,是更常见的可维护排布。
当使用 GEOIP,CN,DIRECT 后接 GEOIP,!,CN,PROXY 或最终 MATCH 时,请通读整表,想象任意一条新访问最先撞上哪一条。合并来的远程 rules 若插入位置比你预期的靠前,会悄悄吃掉 Geo 的裁决权。
与 fake-ip 的耦合
在 fake-ip 场景下,规则引擎看到的「要匹配的地址」与你在直觉里想的「真实远端 IP」可能不是同一物;若 GEOIP 需要基于真实目标 IP 工作,而当前逻辑尚未解析到,会出现与 DNS 文所述类似的错位。整段前请先读 《DNS 泄漏与 fake-ip 排查》,避免 Geo 与 nameserver 两边一起改、变量爆炸。
「Country」在规则里怎么写、和 GEOIP 是什么关系
在常见讨论里,用户说的 Country 规则多指「按国家码的分流行」,在配置语法上多体现为 GEOIP 类型,参数里跟 ISO 国家码(如 CN、US)或带有「非」语义的否定写法(以你使用内核的文档为准,例如对「非中国」的写法)。名称叫法不统一,但落点都是:把解析得到的 IP 丢进 mmdb 查归属。若订阅或模板里混入了旧式或专用内核才支持的写法,在 Meta 上可能被忽略而不报错、也不生效,这时表现为少了一条你以为存在的国别行。
下面为仅示意的片段,组名与否定写法请按你当前内核与文档核对后再落盘,勿盲抄:
# Illustrative only — adjust policy names to your profile
rules:
- DOMAIN-SUFFIX,example.com,DIRECT
- GEOIP,CN,DIRECT
- GEOIP,US,REJECT
- MATCH,PROXY
若你需要「国内全部直连、其余走代理」之类形态,确保 CN 一条真的出现在你希望它出现的高度,且上方没有更泛的域名/IPCIDR 行提前拦截。合并远程配置后,用客户端「完整规则」视图确认顺序未被覆盖。
为什么「只怪 mmdb 旧」往往不够
即使用上当日下载的 mmdb,仍可能出现与主观「国内/国外」不一致的情况:CDN 把边缘节点放在你所属国家、Anycast、或业务 IP 在库里标记与入口域名直觉不符。此时需要在日志里看当时参与匹配的那一跳 IP,再对照规则命中的是哪条,而不是只升级库。升级库能修正大量边界,但修不了「前面一条域名规则已代理」或「解析到的根本不是你以为的那台机」的问题。
实操检查清单(可打印)
- 确认设备跑的是 Meta / Mihomo 并处于
Rule模式,而非长期全局或纯直连对照。 - 在 UI 中确认 geodata / geoip 库路径 与磁盘文件一致、非空、可随更新变时间戳。
- 打开
geo-auto-update或等效,检查日志无持续下载失败;需要时改镜像 URL。 - 在完整规则顺序中,把 会提前终结决策的 DOMAIN / IP / 进程行 找出来,看是否挡在
GEOIP之前。 - 在 fake-ip 与 DNS 仍不稳时,先按 DNS 专文收束,再单独验证 Geo 行。
- 用一两组可预期国别的测试目标(例如纯境外的知名解析)看日志里命中的规则名是否为国别类。
常见问题
明明写了 GEOIP,CN 却像没写
往上翻是否有域名或 CIDR 规则已匹配;或 mmdb 未加载导致行为落在你未察觉的分支。用日志定位「首条命中的规则类型」比反复改库更快。
机器上有两个 mmdb,到底用谁
以当前客户端配置中写明的那一个路径为准;多余的备份可以保留,但不要再假设「在目录里就是生效」。
无图形界面,纯 YAML 排错从哪看路径
以对应发行版的文档为准,查找 geodata、geoip、mmdb 等键;容器场景再加上挂载路径对照。
从能透明展示规则与日志的客户端开始
国家分流是「离线数据 + 顺序正确的规则 + 可预期的解析」三件套。把 MMDB 路径与更新当作基础设施维护,和对待订阅、远程规则集一样做版本感,会少掉大量玄学排查。