进阶配置 预计阅读 12 分钟

Clash GeoIP 与 GeoSite 数据库更新方法:mmdb/dat 文件来源与规则写法

讲清 GeoIP.mmdb、GeoSite.dat 各自负责什么,如何配置自动更新地址与手动替换,以及 GEOIP、GEOSITE 规则的常见写法与排错。

先确认内核与数据库格式

GeoIP 按目标 IP 的归属分类,GeoSite 按域名集合分类。两者不是节点订阅,也不提供代理服务器。更新数据库只会改变相关规则的匹配依据,不会增加节点,不会修改策略组里的出口选择。

本文的自动更新配置以 Clash Meta 后续发展的 mihomo 内核为对象。旧版 Clash 内核、不同客户端内置的内核,在字段支持和数据目录方面可能不同。先到客户端的“关于”或内核信息页面记录内核名称与版本;独立运行时可执行 mihomo -v。不要只凭客户端名称判断是否支持 GEOSITE。

数据文件 保存内容 对应配置与规则
country.mmdb MMDB 格式的 IP 归属数据 geodata-mode: false 时供 GEOIP 使用
geoip.dat GeoData 格式的 IP 分类集合 geodata-mode: true 时供 GEOIP 使用
geosite.dat 按标签组织的域名集合 供 GEOSITE 使用,不由上述模式开关切换

搜索资料时经常看到 GeoIP.mmdb、Country.mmdb 或 GeoSite.dat 这样的写法。它们可能是项目文件名、历史命名或概念称呼,不能据此推断实际加载路径。mihomo 常用的数据文件名是表中的小写名称;Linux 文件系统通常区分大小写。文件扩展名相同也不代表内容兼容,MMDB 和 DAT 不能靠改名互换。

文件来源:同时确认格式与标签

可参考 MetaCubeX/meta-rules-dat 项目提供的构建产物。该项目提供适用于相关内核的 GeoIP、GeoSite 等数据。选择来源时,除了下载地址,还应阅读其数据说明:IP 归属数据来自哪里、域名集合如何生成、哪些标签被保留,以及采用什么更新周期。

  • MMDB:确认是内核可读取的国家或地区归属数据库。不要把城市数据库、ASN 数据库直接当成相同用途的替代品。
  • GeoIP DAT:确认文件确实含有所需国家或地区代码,以及规则中引用的附加分类。
  • GeoSite DAT:确认包含规则使用的标签,例如 cn。精简版可能删掉部分服务分类。
  • 更新地址:选择实际二进制文件的发布地址,不是仓库首页,也不是浏览器看到的文件预览页。

本文示例使用该项目的 latest 发布资源。此类地址表示滚动更新内容,不是固定版本快照。需要复现某次分流结果时,应保存当时的数据文件,并记录获取日期、来源地址和内核版本。不同来源对同一 IP 或域名的分类可能不同,不能用文件更新时间代替分类正确性判断。

mihomo 自动更新配置

以下字段放在 YAML 顶层,与 dns、rules 同级。示例选择 MMDB 模式,更新间隔为 24 小时;geo-update-interval 的单位是小时,不是秒。这里同时列出三种资源地址,便于之后切换模式,但实际加载的数据仍取决于内核、规则引用和加载方式。

geodata-mode: false
geodata-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"

合并到现有配置,而不是重复追加

先搜索当前配置是否已经存在 geox-url。同一层级不要重复定义同名键,重复键的处理可能因解析器而异。如果配置由订阅生成,应使用客户端支持的持久覆写或合并机制;直接修改临时生成文件,下一次刷新订阅可能把修改覆盖。

如果改为 geodata-mode: true,GEOIP 将使用 geoip.dat。只替换 country.mmdb 就不会更新当前模式使用的 IP 数据。GeoSite 仍使用 geosite.dat,无需为此切换 GEOIP 模式。

处理首次下载的依赖

自动更新要求内核能够访问资源地址。DNS 失败、TLS 握手失败、网络超时,都可能使更新中断。下载本身又依赖尚未加载的地理规则时,还可能出现启动依赖问题。此时先手动放入可用文件,再排查更新请求的连接路径,比反复重启更容易定位问题。

客户端提供的“更新地理数据库”操作与刷新节点订阅不是同一件事。菜单名称随客户端版本变化,操作后应看内核日志中的下载和加载结果。配置中写了 true,并不证明刚才已经完成更新。

手动替换:先找数据目录,再停止内核

数据目录不一定是安装目录,也不一定是订阅 YAML 所在目录。图形客户端可能单独管理服务模式的数据文件。优先从客户端提供的配置目录入口、运行日志或内核启动参数确认路径,不要在整个磁盘里找到一个同名文件就覆盖。

下面用独立运行的 mihomo 举例。显式指定 -d 可以固定数据目录,避免从不同工作目录启动后误读其他文件。下列命令在项目工作目录执行,要求已有有效的 mihomo-data/config.yaml,且系统安装了 curl。

mkdir -p ./mihomo-data

curl -fL --output ./mihomo-data/country.mmdb.new \
  https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb

curl -fL --output ./mihomo-data/geosite.dat.new \
  https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat

-f 让 HTTP 错误状态导致命令失败,-L 跟随发布资源的重定向。两条命令都成功后,再检查文件不是零字节,也不是网关返回的 HTML 页面。下载成功只说明请求完成,最终仍须以内核能否读取为准。

  1. 停止正在使用该数据目录的内核。图形客户端应停止其管理的内核或服务,不要另起一个进程抢占端口。
  2. 把现有 country.mmdb 和 geosite.dat 复制到独立备份目录,同时保留当前配置。
  3. 将下载完成的 .new 文件改为正式文件名。DAT 模式应改为下载、备份和替换 geoip.dat。
  4. 用相同数据目录测试配置,然后重新启动,检查日志与实际连接的规则命中。
mv ./mihomo-data/country.mmdb.new ./mihomo-data/country.mmdb
mv ./mihomo-data/geosite.dat.new ./mihomo-data/geosite.dat

mihomo -t -d ./mihomo-data -f ./mihomo-data/config.yaml
mihomo -d ./mihomo-data -f ./mihomo-data/config.yaml

这组重命名命令会覆盖同名文件,因此必须先完成备份。配置测试是启动前检查,不是对所有访问路径的完整验证。失败时先读具体错误,再恢复上一份数据;不要连续更换多个来源,让格式问题与网络问题混在一起。

GEOIP、GEOSITE 与规则顺序

Clash 规则通常按从上到下的顺序匹配,先命中就采用对应策略。下面是规则片段,不是完整配置。其中的 代理选择 必须与现有 proxy-groups 中某个策略组名称完全一致;也可以替换为已有的出口名称。

rules:
  - DOMAIN-SUFFIX,internal.test,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,代理选择

域名分类与 IP 分类不等价

GEOSITE,cn,DIRECT 使用数据库里的 cn 域名集合,它不是“所有以 .cn 结尾的域名”的语法简写。GEOIP,CN,DIRECT 则查询目标 IP 的归属。一个域名可能通过 CDN 返回不同地区的 IP,因此两种规则可能给出不同结果。

把域名规则放在 IP 规则前,可以先按域名集合做决定,减少对解析结果归属的依赖。但 GeoSite 需要连接上下文中有可用的域名信息。若应用直接连接 IP,且没有其他机制恢复域名,就不能期待 GeoSite 自动识别原始服务。

no-resolve 的实际含义

no-resolve 表示不要仅为了匹配这条 IP 类规则而触发域名解析。若连接已经带有可用的目标 IP,仍然可以尝试匹配。它不会全局关闭 DNS,也不是“DNS 请求走直连”的开关。

因此,某个域名未命中 GeoSite,后续 GEOIP 又带有 no-resolve,在没有可用目标 IP 时就可能继续落到 MATCH。这是规则设计的结果,不能直接归因于数据库损坏。MATCH 应放在末尾;放在地理规则上方会使后面的规则没有机会生效。

更新后不生效:按错误类型排查

现象 优先检查 处理方向
无法识别 GEOSITE 规则 实际运行的内核及其规则支持 确认客户端是否仍在使用旧内核,不要只替换数据文件
提示域名集合不存在 当前 geosite.dat 是否包含该标签 查数据源标签说明,修正规则或选择包含该集合的数据
读取数据库失败 格式、文件大小、权限与大小写 排除 HTML 下载结果,恢复可读备份后重新获取
更新成功但命中未变化 数据目录、模式、规则顺序和连接复用 确认加载的是新文件,以新建连接观察命中
定时更新一直超时 资源域名解析与下载请求路径 先用手动文件恢复运行,再排查更新链路

用连接记录验证,而不是只看网页能否打开

测试时使用规则模式,选择一个实际需要核对的域名,记录连接面板里的目标域名、目标 IP、命中规则和最终策略。全局模式不适合验证这里的规则顺序;网页能打开,也只能证明有一条连接路径可用,不能证明命中了 GeoSite 或 GeoIP。

更新数据库通常不会把所有现有连接重新分流。关闭测试页面或应用的旧连接,再发起请求;必要时使用客户端的连接管理功能结束对应连接。若结果仍不符合预期,先用一条精确的 DOMAIN 规则验证策略名称和规则加载,再检查分类集合本身。

更新与回滚检查清单

  • 记录内核版本、当前 geodata-mode、数据目录和来源地址。
  • 确认 GeoSite 标签存在,确认 GEOIP 当前读取 MMDB 还是 DAT。
  • 备份旧文件与配置,保持下载临时文件和正式文件分离。
  • 完成配置测试与重载,用新连接观察具体命中规则。
  • 出现异常时成组恢复配置和对应数据,避免新规则引用旧库缺少的标签。
  • 恢复定时更新后查看下一次更新日志,确认持久覆写没有被订阅刷新覆盖。

GeoIP 与 GeoSite 更新的关键是让“规则引用的分类”“内核选择的格式”和“实际加载的文件”一致。先确认这三项,再调整更新周期。更多字段可查阅配置大全;需要区分规则、策略组与订阅时,可结合术语表阅读。

下载Clash客户端与系统要求