先分清 GeoIP 与 GeoSite 的匹配对象
GeoIP 和 GeoSite 都能把大量规则压缩成一个简短条件,但两者处理的对象不同。GeoIP 根据连接目标的 IP 地址判断国家或地区;GeoSite 根据域名所属分类匹配。它们不是同一份数据库,也不能互相替代。
| 项目 | GeoIP | GeoSite |
|---|---|---|
| 主要文件 | GeoIP.dat 或 Country.mmdb | GeoSite.dat |
| 输入对象 | IPv4、IPv6 地址 | 域名及域名分类标签 |
| 典型规则 | GEOIP,CN,DIRECT | GEOSITE,cn,DIRECT |
| 常见用途 | 按目标 IP 所在地区兜底 | 按站点、服务或类别提前分流 |
| 主要限制 | CDN、Anycast 与云服务地址可能跨地区 | 连接阶段需要保留或还原域名信息 |
GeoSite 适合放在 GeoIP 前面
多数配置采用自上而下的规则匹配。域名规则通常比 IP 地理归属更接近业务含义,因此应优先处理。例如某个服务使用分布在多个国家的 CDN,GeoIP 只能看到当前解析到的节点地址,GeoSite 则可以根据原始域名稳定归类。
rules:
- GEOSITE,category-ads-all,REJECT
- GEOSITE,cn,DIRECT
- GEOIP,CN,DIRECT,no-resolve
- MATCH,节点选择
这组规则先拦截广告分类,再处理中国大陆常见域名,然后用 GeoIP 补充没有命中域名规则的中国大陆地址,最后交给默认策略组。实际标签是否存在取决于所选 GeoSite 数据源;更换数据源前应确认标签命名一致。
确认 Mihomo 实际使用的数据格式
Clash Meta 后续以 Mihomo 名称维护。不同客户端可能内置不同核心版本,也可能保留旧版 Clash 风格的配置入口。开始更新前,先在客户端的「设置」→「内核」或「设置」→「版本信息」查看核心名称与版本;命令行部署可执行 mihomo -v。
Mihomo 的 geodata-mode 会影响 GeoIP 数据的读取方式。启用时通常读取 GeoIP.dat;关闭时通常使用 MMDB 格式的 Country.mmdb。GeoSite 分类仍由 GeoSite.dat 提供。不要只替换一个同名文件就假定核心一定会读取它,配置模式与工作目录同样需要核对。
geodata-mode: true
geodata-loader: memconservative
rules:
- GEOSITE,private,DIRECT
- GEOSITE,cn,DIRECT
- GEOIP,private,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,节点选择
geodata-loader: memconservative 适合更看重内存占用的环境。具体可用值与行为会随核心版本调整,修改后应通过客户端配置检查或命令行测试确认。对于内存充足的桌面设备,保持客户端生成的默认值通常更稳妥。
no-resolve 不是通用必选项
当 GEOIP 规则接收到的目标仍是域名时,核心可能需要先解析 IP 才能完成地区匹配。规则末尾加上 no-resolve,表示不要为了这条规则额外触发解析。它可以减少不必要的 DNS 请求,但也意味着尚未获得目标 IP 时,该条 GEOIP 规则不会主动解析并命中。
- 连接已经带有目标 IP:GEOIP 可直接判断,
no-resolve通常不妨碍匹配。 - 目标仍是域名:优先依靠 DOMAIN、DOMAIN-SUFFIX 或 GEOSITE 规则处理。
- 配置依赖 GEOIP 判断域名解析结果:不要未经测试就添加
no-resolve。
配置自动更新下载源
Mihomo 可通过 geox-url 指定地理数据库地址,并由 geo-auto-update 控制自动更新。下面示例使用同一发布仓库中的 GeoIP 与 GeoSite 文件,避免两个数据集的发布时间和分类口径相差过大。
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"
geo-update-interval: 24 的单位是小时,表示每 24 小时检查一次。桌面客户端每天更新一次已经足够;没有必要设置成 1 小时或更短。数据库发布频率通常低于代理节点状态变化频率,过于频繁只会增加启动阶段的网络请求。
下载源需要同时满足四个条件
- 文件格式匹配。GeoIP 地址必须返回核心当前模式支持的数据文件,不能把网页下载页当成二进制文件地址。
- 文件名与内容对应。
geoip项指向 IP 数据,geosite项指向域名分类数据。 - 标签口径可确认。配置中使用的
cn、private、category-ads-all等标签需要存在于该数据源。 - 核心启动时可以访问。首次下载发生在规则生效前时,下载链路不能依赖尚未载入的同一套规则形成循环。
修改后先检查配置,再重载核心
命令行环境可使用核心自身检查 YAML。-d 指向运行目录,数据库也会从这个目录读取;-f 指向主配置文件。路径含空格时需要加引号。
mihomo -d "/opt/mihomo" -f "/opt/mihomo/config.yaml" -t
客户端用户可在「配置」页面选择当前配置,再执行「检查」或「重载」。菜单名称会因客户端版本不同而略有差异,但操作顺序应保持为:保存可回退副本、检查 YAML、重载核心、查看日志。若日志出现无法下载、文件格式错误或标签不存在,应先恢复旧文件,不要连续修改多项设置。
离线环境手动替换数据库
服务器不能直接访问下载源、企业网络限制外部连接,或需要固定某个数据库版本时,可以离线替换。关键点不是把文件复制进程序安装目录,而是找到 Mihomo 的工作目录。命令行部署的工作目录由 -d 参数决定;图形客户端通常会在「设置」→「配置目录」或「设置」→「应用目录」提供打开入口。
标准替换流程
- 在可联网设备下载与当前配置匹配的
GeoIP.dat、GeoSite.dat或Country.mmdb。 - 记录发布版本与下载日期,例如
2026-05-28,便于之后判断是否需要更新。 - 在目标设备停止 Mihomo 核心,确认托盘菜单或服务管理器显示核心已退出。
- 打开工作目录,将旧文件改名为
GeoIP.dat.bak与GeoSite.dat.bak。 - 复制新文件,并保持核心预期的大小写和文件名。
- 运行配置检查,然后启动核心并观察前 30 秒日志。
- 完成三类测试:私有地址、常用国内域名、默认代理域名。
Linux 服务部署可以先复制为临时名称,再使用同一文件系统内的重命名操作替换,减少进程读到半个文件的风险。以下路径仅示范由 -d /etc/mihomo 确定的工作目录。
sudo systemctl stop mihomo
sudo cp /mnt/offline/GeoIP.dat /etc/mihomo/GeoIP.dat.new
sudo cp /mnt/offline/GeoSite.dat /etc/mihomo/GeoSite.dat.new
sudo mv /etc/mihomo/GeoIP.dat /etc/mihomo/GeoIP.dat.bak
sudo mv /etc/mihomo/GeoSite.dat /etc/mihomo/GeoSite.dat.bak
sudo mv /etc/mihomo/GeoIP.dat.new /etc/mihomo/GeoIP.dat
sudo mv /etc/mihomo/GeoSite.dat.new /etc/mihomo/GeoSite.dat
mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml -t
sudo systemctl start mihomo
Windows 图形客户端不要在核心仍运行时直接覆盖文件。先通过托盘菜单退出核心或退出客户端,再操作配置目录。如果文件被占用,强行覆盖可能留下临时文件,而客户端下次启动仍读取旧数据库。
数据库过旧时会出现哪些分流偏差
地理数据库过旧通常不会让客户端直接崩溃,而是产生局部、间歇性的分流异常。这类问题容易被误判为节点不稳定,因为同一个网站可能只有部分 CDN 地址或新域名命中错误策略。
GeoIP 过旧的典型表现
- 新分配的 IP 段落入
MATCH,没有命中预期的GEOIP,CN。 - 云服务或 CDN 调整地址归属后,连接被分到与预期不同的策略组。
- IPv4 命中正常,新增 IPv6 段却走默认策略。
- 同一域名每次解析到不同地址,导致策略在 DIRECT 与默认代理之间变化。
GeoSite 过旧的典型表现
- 服务启用新域名后,新域名没有进入原有分类。
- 广告分类无法覆盖近期增加的跟踪域名。
- 配置引用某个新标签时,核心日志提示对应 GeoSite 类别不存在。
- 数据源调整标签结构后,旧规则仍能载入,但覆盖范围已经变化。
单个域名走错策略并不能直接证明数据库过旧。它也可能由规则顺序、DNS 缓存、Fake-IP 映射、嗅探设置或用户自定义覆写造成。判断时应先在连接页面查看实际命中的规则,再对照目标域名、目标 IP 和策略组。
用日志和连接记录验证规则联动
更新完成后,不要只检查文件日期。更有效的验证方式是观察真实连接命中了哪条规则。打开客户端的「连接」页面,清空旧记录,再分别访问私有地址、国内站点与应走默认策略的站点。记录中应能看到目标域名、目标 IP、规则类型和最终策略。
建议执行的四组测试
- 私有网络:访问路由器或局域网服务,确认
GEOSITE,private、GEOIP,private或显式网段规则优先命中。 - 域名分类:访问一个分类明确的域名,确认命中 GEOSITE,而不是直接落到 GEOIP 或 MATCH。
- IP 兜底:对仅有目标 IP 的连接观察 GEOIP 是否按预期分流。
- 默认规则:选择不属于前述分类的域名,确认最后进入
MATCH指定的策略组。
若使用 TUN 模式,应用流量可能先以 IP 形式进入核心。Mihomo 可以结合 DNS 映射与域名嗅探恢复部分域名信息,但结果受协议、加密方式和客户端设置影响。GEOSITE 长期不命中时,应同时检查「设置」→「网络」中的 TUN、DNS 与嗅探选项,而不是反复更换数据库。
log-level: info
rules:
- GEOSITE,private,DIRECT
- GEOSITE,cn,DIRECT
- GEOIP,private,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,节点选择
info 级别通常足以查看连接与规则结果。只有在定位数据库加载失败、DNS 映射或嗅探问题时,才临时切换到 debug。完成排查后恢复原级别,避免长期积累大量日志。
常见更新失败与处理顺序
下载成功但重启后仍使用旧结果
先确认新文件进入的是核心工作目录,而不是安装包目录或下载目录。随后检查 geodata-mode:配置要求 MMDB 时,仅替换 GeoIP.dat 不会改变 GeoIP 判断。图形客户端还可能管理多个核心目录,应以当前启用核心的日志路径为准。
日志提示 GeoSite 标签不存在
这通常是规则标签与数据源口径不一致。先定位报错规则,例如 GEOSITE,category-ads-all,REJECT,再查看当前数据源是否提供该分类。不要把标签名相近视为完全等价;不同维护项目可能合并、拆分或重命名分类。
自动更新在启动阶段超时
先把更新间隔恢复为 24 小时,并确认下载地址直接返回数据文件。首次部署可以在可联网环境手动放入数据库,再启动核心。这样即使远程更新暂时失败,已有规则仍可加载。对于服务端部署,还要检查 systemd 服务用户是否拥有工作目录的写入权限。
更新后大量流量改走其他策略
立即恢复成套备份,然后比较新旧数据源、标签覆盖范围与规则顺序。数据库更新会改变分类结果,但不应在没有记录的情况下同时修改规则表、DNS 和 TUN 设置。一次只改变一个变量,才能判断偏差来自数据还是配置。
建立可重复的维护周期
个人桌面设备可采用每天自动检查、每月人工复核的节奏。长期运行的服务器则应记录核心版本、数据库来源、发布日期、启用模式和最近验证结果。发生分流异常时,这五项信息比单纯记录“已经更新”更有用。
- 每天:由
geo-auto-update按 24 小时间隔检查。 - 每月:核对 GeoIP、GeoSite 来源是否仍在维护,抽测四类规则。
- 升级核心后:重新确认
geodata-mode、文件名与工作目录。 - 更换数据源时:先检查标签清单,再调整规则,不直接覆盖生产文件。
- 出现偏差时:保存连接记录、命中规则、目标 IP 与日志时间点。
GeoIP 与 GeoSite 的维护重点不是追求最高更新频率,而是让数据格式、标签口径、规则顺序和核心工作目录保持一致。自动更新解决文件获取,手动备份提供回退能力,连接记录则负责验证最终分流。三部分同时具备,数据库更新才算真正完成。