教程 2026-04-27 · 约 17 分钟阅读

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,CNGEOIP,US 等。没有这份库、或读到的文件损坏/过旧,行为就会退化为回退到后续规则、或让「按国家直连/代理」彻底失真。

注意:geosite(站点分类)和 geoip(国家/ASN 等,依库而定)是不同文件。「国内外分流整段走反」若只出在国家维度,优先查 geoip 相关文件;别去误调与域名列表无关的 geosite 而忽略 mmdb。

geodata 模式、路径与「内核到底读哪个文件」

Clash Meta / Mihomo 系配置中,常能看到 geodata-mode 一类项,用来区分 dat 分片与 mmdb 等实现差异。对多数桌面与移动客户端,你要在图形界面里找到与「GeoData / 地理数据 / 数据库」相关的设置页,核对显示的路径与磁盘上实际存在、大小合理geoip.mmdb(或你自定义命名的文件,须与配置一致)是否一一对应。

各操作系统上,可执行文件旁、用户数据目录、或 ./home 下都可能出现多份历史遗留文件。若你曾手动改路径或换过内核主版本,请在文件管理器里打开 UI 中显示的那一条绝对路径,看修改时间与大小是否随「检查更新/下载 Geo」按钮变化;完全不变的文件,多半是已经失效的副本。

建议你在本机做的核对动作

  1. 在客户端中触发一次「更新 Geo/下载数据库」,观察日志里是否报下载成功、路径可写。
  2. 在磁盘上按 UI 指明的路径找 .mmdb,看文件非零字节且能随更新变日期。
  3. 若使用 Docker/无头 部署,检查挂载卷是否把宿主机上那份库覆盖成空目录,或权限只读导致更新写不进去。

自动更新、镜像与「不是写了就会一直新」

很多发行版在 YAML 中支持 geo-auto-updategeo-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 国家码(如 CNUS)或带有「非」语义的否定写法(以你使用内核的文档为准,例如对「非中国」的写法)。名称叫法不统一,但落点都是:把解析得到的 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,再对照规则命中的是哪条,而不是只升级库。升级库能修正大量边界,但修不了「前面一条域名规则已代理」或「解析到的根本不是你以为的那台机」的问题。

实操检查清单(可打印)

  1. 确认设备跑的是 Meta / Mihomo 并处于 Rule 模式,而非长期全局或纯直连对照。
  2. 在 UI 中确认 geodata / geoip 库路径 与磁盘文件一致、非空、可随更新变时间戳。
  3. 打开 geo-auto-update 或等效,检查日志无持续下载失败;需要时改镜像 URL。
  4. 在完整规则顺序中,把 会提前终结决策的 DOMAIN / IP / 进程行 找出来,看是否挡在 GEOIP 之前。
  5. 在 fake-ip 与 DNS 仍不稳时,先按 DNS 专文收束,再单独验证 Geo 行。
  6. 用一两组可预期国别的测试目标(例如纯境外的知名解析)看日志里命中的规则名是否为国别类。

常见问题

明明写了 GEOIP,CN 却像没写

往上翻是否有域名或 CIDR 规则已匹配;或 mmdb 未加载导致行为落在你未察觉的分支。用日志定位「首条命中的规则类型」比反复改库更快。

机器上有两个 mmdb,到底用谁

当前客户端配置中写明的那一个路径为准;多余的备份可以保留,但不要再假设「在目录里就是生效」。

无图形界面,纯 YAML 排错从哪看路径

以对应发行版的文档为准,查找 geodatageoipmmdb 等键;容器场景再加上挂载路径对照。

从能透明展示规则与日志的客户端开始

国家分流是「离线数据 + 顺序正确的规则 + 可预期的解析」三件套。把 MMDB 路径与更新当作基础设施维护,和对待订阅、远程规则集一样做版本感,会少掉大量玄学排查。

立即免费下载 Clash,开启流畅上网新体验

把国家分流对齐

先确认 MMDB 真被加载、再理顺规则与 DNS,国内外分流可逐项验证。

下载 Clash