GeoIP 和 GeoSite 数据库怎么更新:mihomo 规则数据维护与常见报错

讲清 GeoIP/GeoSite 数据库的作用、存放路径与更新方式,覆盖客户端内置更新、手动替换与下载失败的处理,附规则匹配不生效的排查思路。

GeoIP 与 GeoSite分别解决什么问题

mihomo 读取代理规则时,需要把域名、IP 地址或其他连接属性与规则逐条比较。GeoIP 和 GeoSite 都是规则判断所需的数据,但两者处理的对象不同。数据库没有更新,并不代表所有代理连接都会中断;更常见的表现是地区判断过时、新域名没有命中,或者启动时直接提示数据文件缺失。

GeoIP 按目标 IP 所属地区分类

GeoIP 数据记录 IP 地址段与国家、地区等信息之间的对应关系。配置中的 GEOIP,CN,DIRECT 表示:连接已经得到目标 IP 后,如果该地址属于 CN 分类,就使用 DIRECT 策略。常见文件包括 Country.mmdbgeoip.dat,实际读取哪一个取决于 mihomo 配置、客户端版本和数据模式。

GeoIP 判断发生在 IP 层。域名先解析到了错误地址、DNS 返回结果被污染,或前面的域名规则已经命中时,后面的 GEOIP 规则都不会改变已经完成的匹配。因此,看到“国内网站走了代理”时,不能只盯着数据库日期,还要检查规则顺序和 DNS 结果。

GeoSite 按域名集合分类

GeoSite 保存的是经过整理的域名集合。例如 GEOSITE,cn,DIRECT 用于匹配 cn 分类中的域名,GEOSITE,category-ads-all,REJECT 可用于处理相应分类。常见数据文件名是 geosite.dat。GeoSite 不负责判断服务器 IP 属于哪个国家,它直接处理请求中的域名。

域名服务新增入口、调整 CDN 域名或更换接口后,旧版 GeoSite 可能没有对应记录。此时连接通常会继续落到后面的规则,例如 MATCH,而不是弹出“数据库过期”提示。这也是 GeoSite 问题经常被误判为节点或订阅故障的原因。

数据类型 主要输入 典型规则 常见文件
GeoIP 目标 IP 地址 GEOIP,CN,DIRECT Country.mmdbgeoip.dat
GeoSite 请求域名 GEOSITE,cn,DIRECT geosite.dat
Rule Provider 外部规则条目 RULE-SET,private,DIRECT YAML、文本或二进制规则集

更新前确认内核、模式与实际数据目录

同一个桌面客户端可能先后使用过 Clash Premium、Clash Meta 或 mihomo 内核。旧配置目录中也可能同时保留多个同名文件。手动替换之前,先在客户端的“关于”“内核”或“运行日志”页面确认当前内核。建议使用仍在维护的 mihomo 稳定版,并记录更新前的内核版本和数据文件修改时间。

从运行参数确定目录

mihomo 的数据目录通常由启动参数 -d 指定。例如启动命令中出现 mihomo -d /home/user/.config/mihomo,那么数据库应放在该目录,而不是可执行文件所在目录。桌面客户端会替用户传入自己的数据目录,所以不能只根据操作系统猜路径。

  • 优先使用客户端内的“设置”→“配置目录”或“打开数据目录”入口。
  • 如果界面没有入口,在运行日志开头查找 configuration directoryhome directory-d 后的路径。
  • Windows 可在任务管理器的进程详细信息中确认可执行文件,再从客户端日志查看启动参数。
  • macOS 客户端的数据通常位于用户资料库内,但不同应用使用不同容器目录,应以日志和界面入口为准。
  • Linux 服务由 systemd 启动时,可用 systemctl cat mihomo 查看 ExecStart 中的 -d 参数。

确认当前使用 MMDB 还是 DAT

mihomo 支持不同的地理数据格式。配置启用 geodata-mode: true 时,通常会配合 geoip.datgeosite.dat;未启用该模式的配置可能使用 Country.mmdb 完成 GEOIP 判断。不同版本的默认行为可能调整,所以应同时查看配置和启动日志,不要只按文件是否存在来推断。

geodata-mode: true
geodata-loader: memconservative
geo-auto-update: true
geo-update-interval: 24

geo-update-interval 的单位是小时。设置为 24 表示内核按一天的间隔检查数据更新。客户端若会生成运行配置,直接修改生成文件可能在下次启动或切换订阅后被覆盖,应在客户端的覆写、Mixin 或全局扩展配置中加入这些键。

优先使用客户端内置更新

支持 mihomo 的客户端通常会提供 GeoData 或地理数据更新入口。界面名称会随版本变化,常见位置是“设置”→“Clash 设置”→“GeoData”,或“设置”→“内核”→“更新地理数据”。操作时不要连续点击;单次下载可能包含数十兆字节的数据,网络较慢时需要等待日志返回完成状态。

  1. 先更新并启用当前配置,确认内核能正常启动。
  2. 打开“设置”中的 GeoData、地理数据或内核数据页面。
  3. 分别执行 GeoIP、GeoSite 或全部更新。
  4. 等待界面显示完成,再检查日志中是否有 downloadunmarshalpermission denied 等信息。
  5. 重载配置;如果客户端没有重载按钮,就完全退出应用后重新启动。
  6. 在连接记录中观察一条已知域名实际命中了哪条规则。

内置更新的优势是客户端知道自己的数据目录,也能在下载后按正确文件名写入。对于启用了服务模式或管理员辅助进程的桌面客户端,这种方式还可以避免普通用户进程没有目录写入权限的问题。

启用 mihomo 自动更新

需要长期运行的路由器、服务器或桌面设备,可以由 mihomo 定期更新。除了开启 geo-auto-update,还可以通过 geox-url 指定每类文件的地址。地址必须直接返回对应的二进制文件,不能返回发布页面或需要浏览器确认的 HTML 页面。

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

如果设备通过代理才能访问下载地址,需要先保证内核启动后能够建立出站连接。首次启动时数据库尚不存在,而规则又依赖 GeoSite,这会形成“没有数据库就无法启动,内核不启动又无法下载”的循环。此时先手动放入可读取的数据文件,再启用自动更新更稳妥。

手动替换 GeoIP 与 GeoSite 文件

客户端内置更新失败、离线设备需要维护,或当前网络无法访问数据源时,可以手动替换。正确流程不是直接覆盖正在读取的文件,而是先下载到临时名称,停止内核,完成替换后再启动。这样能降低下载中断留下半个文件的概率。

通用替换步骤

  1. 在客户端中停止系统代理和 TUN,再退出应用;服务模式还要停止对应后台服务。
  2. 打开前文确认的数据目录,记录原文件的大小与修改时间。
  3. 把旧文件改名为 geoip.dat.bakgeosite.dat.bakCountry.mmdb.bak
  4. 将新文件复制到同一目录,并保持内核要求的准确文件名。
  5. 检查当前用户或服务账户是否具有读取权限。
  6. 启动客户端并查看最早一段日志;确认配置载入完成后再打开系统代理或 TUN。
  7. 保留备份到验证结束,确认常用域名规则正常后再删除。

Linux 或 macOS 环境可以先写入临时文件,再使用同一文件系统内的重命名完成替换。下面命令需要在 mihomo 实际数据目录中执行:

curl -L "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat" -o geoip.dat.new
curl -L "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat" -o geosite.dat.new

mv geoip.dat geoip.dat.bak
mv geosite.dat geosite.dat.bak
mv geoip.dat.new geoip.dat
mv geosite.dat.new geosite.dat

Windows 手动替换时,如果资源管理器提示文件正在使用,说明客户端窗口关闭后内核进程或服务仍在运行。应在客户端先停止服务,或在“任务管理器”→“详细信息”确认 mihomo 进程已经退出。不要通过反复覆盖绕过占用提示。

容器与路由器的额外检查

Docker 部署要确认数据库目录确实通过 volume 挂载到容器使用的 -d 路径。只替换宿主机上一个未挂载的目录,容器内部不会发生变化。更新后可重启容器,并从日志确认读取路径。OpenWrt 一类空间有限的设备还要检查可用容量;下载临时文件与保留备份时,瞬时占用接近两份或三份数据文件大小。

下载失败与启动报错怎么处理

context deadline exceeded 或 TLS 超时

这类信息通常表示下载地址在超时时间内没有完成连接或传输。先用浏览器或 curl -I -L 测试同一地址是否能跟随重定向,再检查 DNS、系统时间和出站策略。系统时间相差数分钟就可能导致 TLS 验证失败。若连接必须经过代理,确认更新请求实际使用了可用策略,而不是被一条 GEOIP 或 MATCH 规则送到失效节点。

返回 403、404 或下载到 HTML

404 通常意味着文件名、发布路径或数据源结构已经变化。403 常见于访问频率限制、网络出口限制或地址需要额外授权。还有一种情况是 URL 指向发布介绍页,下载结果实际是 HTML。mihomo 随后会报告解析失败、格式无效或无法加载数据库。应更换为直接文件地址,并确认重定向后的响应类型和文件大小合理。

permission denied 或文件无法写入

先确认报错路径就是当前数据目录。Windows 服务模式下,界面进程与后台服务可能使用不同账户;Linux systemd 服务也可能通过 User= 指定受限账户。目录需要允许该服务账户创建临时文件、重命名文件并读取更新结果。只给单个旧文件增加写权限,仍可能因为目录不可写而失败。

no such file、MMDB 打不开或 GeoSite 载入失败

这类报错优先检查文件名大小写、配置模式和目录。Linux 区分 GeoSite.datgeosite.dat。如果配置启用了 geodata 模式,却只放入 Country.mmdb,GeoSite 规则仍然无法工作;反过来,依赖 MMDB 的配置只有 geoip.dat 也不够。恢复备份后能启动,通常说明新文件不完整、格式不符或来源与当前内核不兼容。

数据库已更新,规则为什么仍不生效

规则引擎按配置中的顺序从上到下匹配,命中后通常不会继续寻找“更合适”的规则。数据库更新只改变 GEOIP 或 GEOSITE 可查询的数据,不会自动调整规则顺序。因此,排查时要在连接记录里找到目标请求,查看域名、目标 IP、命中规则和最终策略。

前置规则已经截获请求

rules:
  - DOMAIN-SUFFIX,example.com,Proxy
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,Proxy

在这段配置中,即使 example.com 已被 GeoSite 的 cn 分类收录,第一条 DOMAIN-SUFFIX 仍会先命中 Proxy。更新 GeoSite 不会覆盖前置规则。临时把特定规则移到适当位置,重载后再次测试,才能确认是不是顺序问题。

no-resolve 改变了 GEOIP 的适用条件

GEOIP,CN,DIRECT,no-resolve 的作用之一是避免规则为了匹配而主动触发额外 DNS 解析。如果当前连接只有域名、还没有可用于判断的目标 IP,这条规则可能不会得到预期结果。配置中已有 GEOSITE 域名规则时,通常先按域名分类,再用 GEOIP 处理剩余 IP 连接,逻辑更清楚。

DNS 模式和嗅探结果影响可见域名

TUN 模式下,应用可能直接连接 IP,也可能通过 QUIC、加密 DNS 或内置解析器发起请求。mihomo 若没有获得域名,GeoSite 就没有匹配输入。启用域名嗅探可以覆盖部分场景,但不应把嗅探视为所有连接都能恢复域名的保证。排查时可对比系统代理模式与 TUN 模式下的连接详情,确认记录里是否出现完整域名。

编辑的是订阅原文件,不是运行配置

桌面客户端经常把订阅、覆写内容和全局设置合并成临时运行配置。直接修改缓存中的订阅 YAML,下一次更新订阅就会还原;直接修改运行配置,下一次切换配置也会消失。应在客户端的“设置”→“覆写”或“配置”→“全局扩展”中保存自定义项,然后通过日志或配置检查功能确认最终结果。

Rule Provider 没有跟着 GeoData 更新

RULE-SET 引用的外部规则集由 rule-providers 管理,有自己的 URL、缓存路径和更新间隔。更新 geoip.datgeosite.dat 不会刷新这些 Provider。若实际命中的是 RULE-SET,应在客户端的规则集页面执行更新,或检查对应 Provider 的 interval 和下载日志。

一套可重复执行的维护清单

普通桌面设备不必每天手动替换数据库。更实用的做法是让客户端或 mihomo 每 24 小时检查一次,并在出现分类异常时按固定步骤定位。服务器和路由器则应把数据目录、备份和服务账户权限一并纳入维护。

  • 确认当前使用 mihomo 内核,并记录版本号。
  • 从启动参数或日志确认实际数据目录。
  • 检查配置使用 DAT 模式还是 MMDB 模式。
  • 优先通过客户端内置入口更新一次。
  • 查看日志,确认下载、写入与重新载入都已完成。
  • 手动替换时先停止内核,保留一份可恢复的旧文件。
  • 用连接记录验证域名、目标 IP、命中规则和最终策略。
  • 分别检查 GeoData、订阅规则和 Rule Provider,不把三者当作同一项更新。
  • 如果结果仍异常,依次排查规则顺序、DNS、TUN、嗅探与运行配置。

判断维护是否成功,不能只看按钮显示“更新完成”。至少选取一个 GeoSite 域名规则、一个 GEOIP 地址规则和一个 Rule Provider 规则分别测试。连接记录中能看到预期规则名称与策略,重启客户端后结果仍保持一致,才说明文件路径、配置模式和更新机制已经正确衔接。

Clash最新版下载