GeoIP 与 GeoSite分别解决什么问题
mihomo 读取代理规则时,需要把域名、IP 地址或其他连接属性与规则逐条比较。GeoIP 和 GeoSite 都是规则判断所需的数据,但两者处理的对象不同。数据库没有更新,并不代表所有代理连接都会中断;更常见的表现是地区判断过时、新域名没有命中,或者启动时直接提示数据文件缺失。
GeoIP 按目标 IP 所属地区分类
GeoIP 数据记录 IP 地址段与国家、地区等信息之间的对应关系。配置中的 GEOIP,CN,DIRECT 表示:连接已经得到目标 IP 后,如果该地址属于 CN 分类,就使用 DIRECT 策略。常见文件包括 Country.mmdb、geoip.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.mmdb、geoip.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 directory、home directory或-d后的路径。 - Windows 可在任务管理器的进程详细信息中确认可执行文件,再从客户端日志查看启动参数。
- macOS 客户端的数据通常位于用户资料库内,但不同应用使用不同容器目录,应以日志和界面入口为准。
- Linux 服务由 systemd 启动时,可用
systemctl cat mihomo查看ExecStart中的-d参数。
确认当前使用 MMDB 还是 DAT
mihomo 支持不同的地理数据格式。配置启用 geodata-mode: true 时,通常会配合 geoip.dat 与 geosite.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”,或“设置”→“内核”→“更新地理数据”。操作时不要连续点击;单次下载可能包含数十兆字节的数据,网络较慢时需要等待日志返回完成状态。
- 先更新并启用当前配置,确认内核能正常启动。
- 打开“设置”中的 GeoData、地理数据或内核数据页面。
- 分别执行 GeoIP、GeoSite 或全部更新。
- 等待界面显示完成,再检查日志中是否有
download、unmarshal、permission denied等信息。 - 重载配置;如果客户端没有重载按钮,就完全退出应用后重新启动。
- 在连接记录中观察一条已知域名实际命中了哪条规则。
内置更新的优势是客户端知道自己的数据目录,也能在下载后按正确文件名写入。对于启用了服务模式或管理员辅助进程的桌面客户端,这种方式还可以避免普通用户进程没有目录写入权限的问题。
启用 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 文件
客户端内置更新失败、离线设备需要维护,或当前网络无法访问数据源时,可以手动替换。正确流程不是直接覆盖正在读取的文件,而是先下载到临时名称,停止内核,完成替换后再启动。这样能降低下载中断留下半个文件的概率。
通用替换步骤
- 在客户端中停止系统代理和 TUN,再退出应用;服务模式还要停止对应后台服务。
- 打开前文确认的数据目录,记录原文件的大小与修改时间。
- 把旧文件改名为
geoip.dat.bak、geosite.dat.bak或Country.mmdb.bak。 - 将新文件复制到同一目录,并保持内核要求的准确文件名。
- 检查当前用户或服务账户是否具有读取权限。
- 启动客户端并查看最早一段日志;确认配置载入完成后再打开系统代理或 TUN。
- 保留备份到验证结束,确认常用域名规则正常后再删除。
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.dat 与 geosite.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.dat 与 geosite.dat 不会刷新这些 Provider。若实际命中的是 RULE-SET,应在客户端的规则集页面执行更新,或检查对应 Provider 的 interval 和下载日志。
一套可重复执行的维护清单
普通桌面设备不必每天手动替换数据库。更实用的做法是让客户端或 mihomo 每 24 小时检查一次,并在出现分类异常时按固定步骤定位。服务器和路由器则应把数据目录、备份和服务账户权限一并纳入维护。
- 确认当前使用 mihomo 内核,并记录版本号。
- 从启动参数或日志确认实际数据目录。
- 检查配置使用 DAT 模式还是 MMDB 模式。
- 优先通过客户端内置入口更新一次。
- 查看日志,确认下载、写入与重新载入都已完成。
- 手动替换时先停止内核,保留一份可恢复的旧文件。
- 用连接记录验证域名、目标 IP、命中规则和最终策略。
- 分别检查 GeoData、订阅规则和 Rule Provider,不把三者当作同一项更新。
- 如果结果仍异常,依次排查规则顺序、DNS、TUN、嗅探与运行配置。
判断维护是否成功,不能只看按钮显示“更新完成”。至少选取一个 GeoSite 域名规则、一个 GEOIP 地址规则和一个 Rule Provider 规则分别测试。连接记录中能看到预期规则名称与策略,重启客户端后结果仍保持一致,才说明文件路径、配置模式和更新机制已经正确衔接。