GeoIP 与 GeoSite 数据库怎么更新?mihomo 地理规则使用详解

解释 GeoIP、GeoSite 数据库在规则匹配中的作用,mihomo 内核下 geodata 模式与 MMDB 的区别,如何配置自动更新与手动替换数据源,以及规则中 GEOIP/GEOSITE 的写法与命中顺序。

先分清 GeoIP、GeoSite 与规则本身

GeoIP 和 GeoSite 都是供规则引擎查询的数据集,但两者处理的对象不同。GeoIP 根据目标 IP 地址判断国家、地区或局域网范围;GeoSite 根据域名判断其所属站点集合。配置中的 GEOIPGEOSITE 只是查询指令,真正的分类内容来自本地数据库文件。

以一次访问为例,请求目标是域名时,mihomo 可以先用域名规则或 GeoSite 分类匹配;如果前面的规则没有命中,后续 GEOIP 规则可能触发 DNS 解析,再拿解析结果查询 IP 数据库。最终使用哪个策略组,由规则列表中第一条命中的规则决定。数据库只回答“这个域名或 IP 属于哪个集合”,不会自行决定直连、代理或拒绝。

数据类型 匹配对象 常见文件 典型用途
GeoSite 域名 geosite.dat 按站点类别、服务商或地区域名集合分流
GeoIP Dat IPv4、IPv6 地址 geoip.dat 在 geodata 模式下执行国家与地区 IP 匹配
MMDB IPv4、IPv6 地址 country.mmdb 在 MMDB 模式下为 GEOIP 规则提供位置数据
ASN MMDB IP 所属自治系统 GeoLite2-ASN.mmdb 供 ASN 类规则或相关查询功能使用

GeoSite 不是顶级域名表。例如 GEOSITE,cn 查询的是数据源维护者整理的域名集合,并不等同于只匹配以 .cn 结尾的地址。一个使用 .com 的国内服务也可能被纳入该集合,分类结果取决于当前数据库版本。

geodata 模式与 MMDB 模式的区别

启用 geodata-mode 时发生什么

设置 geodata-mode: true 后,mihomo 使用 geoip.dat 处理 GEOIP 分类,并使用 geosite.dat 处理 GEOSITE 分类。Dat 文件可以容纳多个标签集合,规则里常见的 CNLAN 或特定 GeoSite 标签会映射到文件内部的条目。

geodata-mode: true
geodata-loader: memconservative

geodata-loader 控制 geodata 数据的加载方式。standard 倾向于提前加载,连续匹配时开销较稳定,但会占用更多内存;memconservative 更偏向按需加载,适合内存较小的路由器或容器。以约 100 MB 可用内存的设备为例,应先选 memconservative,观察规则加载与首次匹配耗时后再决定是否调整。

关闭 geodata-mode 时发生什么

设置 geodata-mode: false 时,GEOIP 查询通常改用 country.mmdb。MMDB 是面向 IP 查询的数据库格式,不能替代 GeoSite 的域名分类,因此配置中存在 GEOSITE 规则时,geosite.dat 仍然需要保持可用。

geodata-mode: false

两种模式没有统一适用于所有设备的速度结论。数据库体积、规则数量、磁盘性能和加载器设置都会影响结果。桌面系统通常更应关注数据源覆盖范围与维护频率;低内存设备则需要同时观察 mihomo 启动后的常驻内存。切换模式后应完整重启内核,而不是只在界面中重新载入一份配置。

  • 规则大量使用 GEOSITE 与 Dat 标签时,可优先采用 geodata 模式。
  • 现有规则主要是 GEOIP,CN,且数据源只提供 MMDB 时,可继续使用 MMDB 模式。
  • 不要把 geoip.dat 重命名成 country.mmdb,扩展名不同代表内部格式不同。
  • 切换模式前保留原数据库文件,便于在分类异常或启动报错时恢复。

配置数据库自动更新

mihomo 可以按指定地址获取 GeoIP、GeoSite、MMDB 与 ASN 数据。核心字段是 geo-auto-updategeo-update-intervalgeox-url。更新间隔的单位是小时,设置为 24 表示每 24 小时检查一次。地理分类通常不需要按分钟刷新,每天一次已经能覆盖多数桌面与家庭网关场景。

geodata-mode: true
geodata-loader: memconservative
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"

即使当前启用了 geodata 模式,也可以保留 MMDB 地址,方便以后切换;不过真正会被当前规则路径使用的文件,仍由模式与规则类型决定。若客户端通过覆写功能合并配置,应把这些字段放在顶层,不能缩进到 dnsrulesproxy-groups 下。

更新请求走直连还是代理

数据库下载能否成功,取决于内核运行时是否能访问数据地址。部分客户端在内核启动早期下载文件,此时代理策略可能尚未完全可用;另一些客户端会让更新请求经过当前规则。若日志连续出现超时,可先在浏览器中确认地址可访问,再检查 DNS、系统时间、出站规则和客户端是否对核心进程设置了绕过。

排查时打开「日志」→「日志级别」→「信息」或「调试」,然后重启内核。正常流程通常会出现地理数据下载、写入或载入记录。若 30 秒后仍是连接超时,不应连续点击更新按钮;先确认数据域名命中了哪个策略组,并检查该策略组当前节点是否可用。

手动替换 GeoIP 与 GeoSite 文件

自动更新失败、设备无法直接访问数据源,或需要固定某个数据版本时,可以手动替换文件。关键是找到 mihomo 的实际工作目录。命令行默认目录常见为 Linux 与 macOS 的 ~/.config/mihomo/,Windows 常见为 %USERPROFILE%\.config\mihomo\;如果启动命令使用了 -d,则以 -d 后的目录为准。

图形客户端往往使用自己的应用数据目录,不一定读取上述默认路径。应从客户端的「设置」→「配置目录」或「设置」→「应用目录」打开实际位置,再根据日志中的数据库路径确认。不要只在文件管理器里搜索同名文件,因为旧版本目录和当前运行目录可能同时存在。

  1. 记录当前内核版本、geodata-mode 设置和工作目录。
  2. 停止 mihomo 内核,避免替换过程中仍有文件句柄占用。
  3. 把原文件改名保存,例如将 geosite.dat 改为 geosite.dat.bak
  4. 复制新文件,并保持核心预期的名称:geoip.datgeosite.datcountry.mmdbGeoLite2-ASN.mmdb
  5. 重新启动内核,查看日志中是否存在格式不支持、标签缺失或文件读取失败。
  6. 用一条明确的测试规则验证命中结果,而不是只观察客户端是否显示“运行中”。

替换后若出现 load GeoSite failedinvalid database 或指定标签不存在,应先恢复备份文件,再核对数据格式与配置模式。文件能被下载并不代表一定适合当前内核;某些数据源可能使用不同标签命名,导致 GEOSITE,cn 可用而较细的分类标签不可用。

GEOIP 与 GEOSITE 规则怎么写

一组可读的基础顺序

mihomo 规则从上到下匹配,命中后停止继续检查。因此更具体的规则应放在更宽泛的地理规则之前,最终使用 MATCH 兜底。下面的 节点选择国内直连 必须对应配置里真实存在的策略组名称。

rules:
  - DOMAIN,api.example.org,节点选择
  - DOMAIN-SUFFIX,example.org,节点选择
  - GEOSITE,category-ads-all,REJECT
  - GEOSITE,cn,国内直连
  - GEOIP,LAN,DIRECT,no-resolve
  - GEOIP,CN,国内直连
  - MATCH,节点选择

第一条精确域名规则优先级最高。第二条覆盖该域名及其子域。随后才进入 GeoSite 分类和 GeoIP 判断。如果把 GEOSITE,cn,国内直连 放在需要特殊处理的国内站点规则之前,特殊规则可能永远没有机会命中。

规则 输入 是否可能触发解析 适合位置
DOMAIN 完整域名 最具体规则区域
DOMAIN-SUFFIX 域名后缀 具体服务分类之前
GEOSITE 域名分类 普通域名规则之后
GEOIP 目标 IP 目标为域名时可能触发 域名规则之后、兜底之前
MATCH 全部剩余连接 最后一条

理解 no-resolve 的边界

no-resolve 表示这条 IP 类规则不要为了匹配而主动解析域名。它适合 GEOIP,LAN,DIRECT,no-resolve 这类主要处理已知目标 IP 的规则,可以减少额外 DNS 查询。但如果连接目标仍是域名,且前面没有规则命中,这条 GEOIP 规则可能因拿不到目标 IP 而跳过。

因此不应机械地给每条 GEOIP 规则都追加 no-resolve。如果依赖 GEOIP,CN 作为国内流量的重要兜底,就需要结合 DNS 模式、嗅探结果和实际连接类型测试。启用 TUN 模式后,mihomo 接收到的流量范围更广,但规则顺序与数据库查询逻辑并不会因此改变。

如何确认数据库和规则真的生效

验证应同时检查“文件已载入”和“请求命中正确规则”。只看到数据库更新时间变化,不能说明规则顺序正确;只看到连接成功,也不能证明流量经过了预期策略组。

测试一条 GeoSite 规则

  1. 暂时把目标分类指向一个容易辨认的策略组,例如 国内直连
  2. 在「日志」→「日志级别」中选择“信息”或“调试”。
  3. 清理浏览器现有连接,重新访问测试域名。
  4. 检查日志中的规则类型、命中标签和最终策略组。
  5. 测试结束后恢复正式配置,避免临时规则长期保留。

测试 GEOIP 时避免缓存干扰

浏览器可能复用 HTTP/2 或 HTTP/3 连接,DNS 结果也可能来自系统、浏览器或 mihomo 缓存。修改规则后,先在客户端执行「配置」→「重新载入」,再关闭相关标签页并等待旧连接结束。必要时重启浏览器或内核,然后使用新的连接观察日志。

若同一域名返回多个 IP,GeoIP 分类结果可能随解析结果变化。CDN 服务尤其常见:不同网络、DNS 服务器和时段可能得到不同地区的地址。此类服务更适合优先使用 DOMAIN、DOMAIN-SUFFIX 或 GEOSITE 规则,而不是完全依赖 GEOIP。

常见故障与处理顺序

提示找不到 GeoSite 标签

先确认 geosite.dat 已被当前工作目录中的内核读取,再确认标签拼写。标签由数据源定义,不能根据服务名称随意推测。若日志只对某个标签报错,通常是当前数据集没有该分类;若全部 GEOSITE 规则都失败,则更可能是文件路径、文件格式或载入过程存在问题。

更新成功但规则结果没有变化

部分客户端下载新文件后,需要重启内核才会重新载入。先执行「设置」→「内核」→「重启内核」,再观察启动日志中的数据文件路径。如果日志仍指向另一个目录,应检查启动参数中的 -d,以及客户端是否把订阅配置运行在独立目录。

配置解析时报字段错误

这通常表示内核版本较旧,或客户端实际启动的不是预期 mihomo 文件。执行 mihomo -v,再对照客户端「设置」→「内核」显示的版本。升级内核前先确认客户端支持对应核心接口;如果暂时不能升级,应删除旧版本不认识的字段,而不是把它们移动到其他 YAML 层级。

TUN 模式下部分应用仍未按地理规则分流

先检查该连接是否进入 mihomo,再检查域名是否可见。只有目标 IP 而没有域名时,GEOSITE 无法直接匹配;此时可能依赖嗅探恢复域名,或由 GEOIP 规则处理。还应检查进程规则、IP-CIDR 规则是否位于地理规则之前,因为更早命中的规则会直接结束匹配。

完整排查顺序可以固定为:确认内核版本,确认工作目录,确认数据库载入日志,确认规则顺序,确认 DNS 或嗅探结果,最后检查策略组出口。按这个顺序处理,能把“数据库没有更新”和“规则没有命中”分成两个独立问题。

Clash下载