先分清 GeoIP、GeoSite 与规则本身
GeoIP 和 GeoSite 都是供规则引擎查询的数据集,但两者处理的对象不同。GeoIP 根据目标 IP 地址判断国家、地区或局域网范围;GeoSite 根据域名判断其所属站点集合。配置中的 GEOIP、GEOSITE 只是查询指令,真正的分类内容来自本地数据库文件。
以一次访问为例,请求目标是域名时,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 文件可以容纳多个标签集合,规则里常见的 CN、LAN 或特定 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-update、geo-update-interval 和 geox-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 地址,方便以后切换;不过真正会被当前规则路径使用的文件,仍由模式与规则类型决定。若客户端通过覆写功能合并配置,应把这些字段放在顶层,不能缩进到 dns、rules 或 proxy-groups 下。
更新请求走直连还是代理
数据库下载能否成功,取决于内核运行时是否能访问数据地址。部分客户端在内核启动早期下载文件,此时代理策略可能尚未完全可用;另一些客户端会让更新请求经过当前规则。若日志连续出现超时,可先在浏览器中确认地址可访问,再检查 DNS、系统时间、出站规则和客户端是否对核心进程设置了绕过。
排查时打开「日志」→「日志级别」→「信息」或「调试」,然后重启内核。正常流程通常会出现地理数据下载、写入或载入记录。若 30 秒后仍是连接超时,不应连续点击更新按钮;先确认数据域名命中了哪个策略组,并检查该策略组当前节点是否可用。
手动替换 GeoIP 与 GeoSite 文件
自动更新失败、设备无法直接访问数据源,或需要固定某个数据版本时,可以手动替换文件。关键是找到 mihomo 的实际工作目录。命令行默认目录常见为 Linux 与 macOS 的 ~/.config/mihomo/,Windows 常见为 %USERPROFILE%\.config\mihomo\;如果启动命令使用了 -d,则以 -d 后的目录为准。
图形客户端往往使用自己的应用数据目录,不一定读取上述默认路径。应从客户端的「设置」→「配置目录」或「设置」→「应用目录」打开实际位置,再根据日志中的数据库路径确认。不要只在文件管理器里搜索同名文件,因为旧版本目录和当前运行目录可能同时存在。
- 记录当前内核版本、
geodata-mode设置和工作目录。 - 停止 mihomo 内核,避免替换过程中仍有文件句柄占用。
- 把原文件改名保存,例如将
geosite.dat改为geosite.dat.bak。 - 复制新文件,并保持核心预期的名称:
geoip.dat、geosite.dat、country.mmdb或GeoLite2-ASN.mmdb。 - 重新启动内核,查看日志中是否存在格式不支持、标签缺失或文件读取失败。
- 用一条明确的测试规则验证命中结果,而不是只观察客户端是否显示“运行中”。
替换后若出现 load GeoSite failed、invalid 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 规则
- 暂时把目标分类指向一个容易辨认的策略组,例如
国内直连。 - 在「日志」→「日志级别」中选择“信息”或“调试”。
- 清理浏览器现有连接,重新访问测试域名。
- 检查日志中的规则类型、命中标签和最终策略组。
- 测试结束后恢复正式配置,避免临时规则长期保留。
测试 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 或嗅探结果,最后检查策略组出口。按这个顺序处理,能把“数据库没有更新”和“规则没有命中”分成两个独立问题。