GeoIP 与 GeoSite 数据库更新指南:mihomo 的 geodata 模式与规则匹配要点

梳理 GeoIP、GeoSite 两类数据文件的来源与格式区别,说明 mihomo 中 geodata-mode、自定义更新地址与自动更新的设置方法,以及数据过旧时的典型症状。

GeoIP 与 GeoSite:先分清 IP 数据与域名分类

在 mihomo 的规则配置里,GEOIP,CN,DIRECT 与 GEOSITE,cn,DIRECT 看起来相近,实际使用的是两类数据。GeoIP 将 IP 地址段归入国家、地区或数据集定义的分类;GeoSite 将域名归入站点、服务或主题分类。数据库只提供匹配依据,连接最终直连还是走代理,仍由规则右侧的策略决定。

例如,访问一个国内网站时,域名可能先命中 GEOSITE,cn;若未命中,后续规则还可能通过解析出的目标 IP 命中 GEOIP,CN。网站使用境外 CDN、共享云服务或新域名时,两者给出不同结果并不一定是数据库损坏,而可能是分类口径和实际部署不同。

数据文件主要用途需要注意
geoip.dat在 DAT 模式下为 GEOIP 规则提供 IP 分类文件包含哪些分类取决于发布源
Country.mmdb在 MMDB 模式下提供 IP 地理归属数据与 DAT 格式不同,不能只改扩展名替换
geosite.dat为 GEOSITE 规则提供域名分类分类名称和属性随数据集变化

数据来源与分类口径

常见来源包括 Loyalsoldier 的 v2ray-rules-dat,以及 MetaCubeX 的 meta-rules-dat。它们是数据构建与发布项目,不是代理节点提供方。即使两个源都提供 geosite.dat,也不能假设分类、附加属性和收录范围完全一致。切换来源前,应确认配置中用到的每个分类都在目标数据集中存在。

GeoIP 的国家归属不等于服务所属公司的国家,也不等于访问时必然经过的网络路径。GeoSite 的分类标签也不代表站点每个子域名都采用相同部署。

geodata-mode:决定 GEOIP 读取哪种格式

geodata-mode 是 mihomo 顶层配置项。设为 true 时,GEOIP 使用 DAT 数据;设为 false 时,使用 MMDB 数据。这个开关不是“启用全部地理规则”的总开关,也不会将域名规则自动转换为 IP 规则。GeoSite 仍读取自己的域名数据库。

# 顶层配置,与 rules、dns 等字段同级
geodata-mode: true

geo-auto-update: true
geo-update-interval: 24

geox-url:
  geoip: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
  geosite: "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
  mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb"

这组示例将自动更新间隔设为 24 小时,并显式指定三个数据地址。它不是完整的代理配置,不能替代订阅中的节点和策略组。启用 DAT 模式时,排查 GEOIP 应优先检查 geoip 地址及对应文件;切回 MMDB 模式时,应检查 mmdb。不要根据“某个文件刚下载成功”就判断当前正在使用的数据也已更新。

配置字段必须进入最终生效文件

Clash Nyanpasu 的界面配置、订阅配置和覆写配置可能共同生成内核运行文件。具体入口随客户端版本变化,操作时应以“最终生效配置中是否出现上述顶层字段”为准。如果直接修改下载得到的订阅文件,下次订阅刷新可能覆盖改动;持续使用的自定义设置应通过客户端支持的覆写或配置合并机制保存。

  • 确认当前启用的是 mihomo,而不是只支持另一套配置字段的内核。
  • 将 geox-url 放在 YAML 顶层,不能缩进到 dns 或 profile 下面。
  • 修改后执行配置重载;若当前版本没有重新初始化相关设置,再重启内核确认。
  • 打开运行日志检查解析错误,不要只根据编辑器显示“保存成功”判断已生效。

数据库更新:自动计划、手动触发与离线替换

订阅更新、规则集更新和 geodata 更新是三条不同的链路。订阅更新通常下载 YAML 或节点信息;rule-providers 按自己的地址与间隔更新;geo-auto-update 才是地理数据库自动更新设置。点击一次订阅刷新,不能据此认定 GeoIP 与 GeoSite 已完成更新。

自动更新需要同时检查开关与网络

  1. 在生效配置中确认 geo-auto-update: true,并确认 geo-update-interval: 24 的单位是小时。
  2. 检查运行环境能否访问实际下载地址。GitHub 发布文件可能发生重定向,只测试网页首页能打开还不够。
  3. 观察内核日志中的下载、加载与错误信息,记录失败发生在域名解析、连接超时、HTTP 响应还是文件解析阶段。
  4. 若客户端提供地理数据库更新操作,可手动触发一次验证;界面未提供时,不要把订阅更新按钮当作替代。

某些连接依赖代理才能取得数据,而启动代理又需要本地数据库,这会形成启动依赖。处理时应先保留可用的旧文件,让内核具备启动条件,再修复下载路径。不要先清空整个数据目录,否则问题可能从“数据较旧”变成“内核无法载入配置”。

离线替换按文件类型执行

在线下载持续失败时,可以在可访问发布源的网络环境中取得对应文件,再转移到目标设备。先通过客户端的运行信息或日志定位内核实际数据目录,备份旧文件并停止内核,然后按原有文件名替换对应数据,最后重新启动。不要凭安装目录的位置猜测数据目录,便携模式与普通安装的存储位置可能不同。

下载到的文件必须是发布产物本身。若保存的是登录页、错误页或压缩包,却命名成 geosite.dat,内核仍会解析失败。可以结合 HTTP 状态、文件类型与发布说明排查;只有文件修改时间变新,并不能证明内容可用。

不要在内核读取文件时直接覆盖数据库,也不要把 MMDB 文件改名为 DAT。替换后如果无法启动,先恢复备份,再根据日志定位格式或分类兼容问题。

规则匹配:数据更新后仍要检查先后顺序

mihomo 的规则按从上到下的顺序匹配,先命中的规则决定去向。更新数据库不会改变这个顺序。如果最上方已经有一条宽泛的域名规则或 MATCH,后面的 GEOIP、GEOSITE 可能根本没有执行机会。

# 规则片段:PROXY 必须是已有的节点或策略组名称
rules:
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

上述片段只演示匹配顺序,不是完整的局域网与 IPv6 分流方案。前三条照顾常见 IPv4 私网段;域名分类放在国家 IP 分类前,最后才交给代理策略。如果现有配置已经有 rules,应合并条目,不要再添加第二个同名顶层键。PROXY 也不是任意配置中都存在的内置策略,需要替换为实际策略组名称。

no-resolve 会影响 IP 规则的验证结果

IP 类规则可以使用 no-resolve,表示不为了匹配这一条规则而主动解析域名。如果连接元数据中没有可用的目标 IP,这条规则可能无法命中。因此,给 GEOIP,CN,DIRECT 随手追加 no-resolve,可能改变原来依赖解析才能完成的分流行为。是否添加,应结合 DNS、连接元数据和实际需求决定。

使用 fake-ip 时,应用看到的可能是用于映射的地址,不能直接拿这个地址去判断真实服务器的国家。应查看连接详情中恢复的域名、目标信息、命中规则和最终出口。若应用通过自身加密 DNS 或只向内核传入 IP,GEOSITE 是否有机会参与匹配,还取决于域名信息是否可获得,以及嗅探等相关配置。

数据过旧的表现:先区分缺分类与分类不符合预期

表现优先排查验证动作
新增域名没有命中预期分类数据尚未收录,或分类口径不同核对发布源分类内容与本地更新时间
载入配置时提示分类不存在规则标签拼写错误,或更换了数据源检查源中是否提供该分类及属性
更新后仍命中旧规则文件未重载,或前置规则先命中重载后新建连接并查看命中详情
文件下载成功但解析失败下载内容不是预期格式检查响应内容与 DAT、MMDB 类型
某个 CDN 地址走向变化DNS 返回地址改变,或 GeoIP 归属变化比较更新前后的真实解析结果

“国内站点走了代理”并不自动等于 GeoSite 过旧。还要排除代理模式处于全局、目标域名被自定义规则提前匹配、连接缺少域名信息,以及策略组本身选错出口等情况。反过来,数据库中的国家归属即使正确,也不一定符合某个服务的账号地区或版权地区要求。

rule-providers 不是 geosite.dat 的另一个文件名

RULE-SET 引用的是 rule-providers 定义的规则集,可以采用 YAML、文本或受支持的 MRS 格式;GEOSITE 则查询地理域名数据库。两者有各自的数据来源、格式与更新机制。把规则集 URL 填到 geox-url.geosite,或者把 DAT 文件填进普通文本规则集,都不会自动转换格式。

更新后的验证顺序:一次只改变一个变量

数据库更新是否有效,最终应落到“同一目标的新连接命中了什么规则”上。浏览器可能复用 HTTP/2 或 HTTP/3 连接,已经建立的连接也不会因为规则文件更新就自动切换出口。因此,应关闭相关连接或重启测试应用,再发起新的访问。

  1. 记录基线:选定一个需要直连的域名和一个需要代理的域名,记录当前规则模式、命中规则、策略组与出口。
  2. 仅更新数据:暂不同时改 DNS、TUN 和规则顺序,避免结果变化后无法归因。
  3. 确认成功载入:检查日志是否存在下载或解析错误;需要时重启内核,确认配置能正常启动。
  4. 建立新连接:重新访问相同域名,在连接详情核对命中的是 GEOSITE、GEOIP 还是其他规则。
  5. 处理例外:若源中分类与实际需求不同,可以添加范围明确的域名规则,并放到相关宽泛规则之前。

如需临时为一个明确域名直连,可以添加 DOMAIN,example.com,DIRECT 这样的精确规则;只有确实需要涵盖子域名时,才考虑 DOMAIN-SUFFIX。不建议为解决单个站点的问题,把整个云厂商的大段 IP 全部设为直连,这可能影响共享地址上的其他服务。

日常维护可以固定为三个动作:保留一份可启动的数据库备份,检查自动更新是否成功,再对关键站点做新连接验证。GeoIP 与 GeoSite 更新解决的是“匹配依据是否及时、是否可用”,规则顺序、DNS 行为和策略组选路仍需要分别检查。相关配置概念可继续查阅技术参考,初次配置则从使用指南开始。

Clash 客户端下载