Skip to content

fix(mihomo): 订阅校验前自动补齐 GeoData,避免回退转换导致 VLESS 节点丢失#471

Open
Jasper-Zhang-A wants to merge 1 commit intonelvko:masterfrom
Jasper-Zhang-A:master
Open

fix(mihomo): 订阅校验前自动补齐 GeoData,避免回退转换导致 VLESS 节点丢失#471
Jasper-Zhang-A wants to merge 1 commit intonelvko:masterfrom
Jasper-Zhang-A:master

Conversation

@Jasper-Zhang-A
Copy link

@Jasper-Zhang-A Jasper-Zhang-A commented Feb 5, 2026

背景 / 问题

KERNEL_NAME=mihomo 场景下,clashsub add/update 会先将订阅下载到临时文件,并执行 mihomo -t 进行配置校验。

当订阅配置中包含 GEOIP / IP-ASN(以及可能的 GEOSITE)规则,但运行目录缺少必要 GeoData 文件(如 geoip.metadbASN.mmdb)时,mihomo -t 会尝试联网下载这些依赖。在 AutoDL/容器等网络受限环境中,这一步可能失败,从而导致校验失败。

校验失败后脚本会走订阅转换(subconverter)回退路径;在部分订阅内容/转换结果下,该回退路径可能导致 VLESS 节点被过滤/丢失,最终表现为:Linux Web UI 中看不到订阅里原本存在的 VLESS 节点。

复现说明

  • 复现订阅:
    https://premium.974520.xyz/sub/AI/pro/111/<TOKEN>
  • 现象:修复前在 clash-for-linux-install 的 Web UI 中,订阅节点列表缺少 VLESS 节点(例如“美国GPT / 美国01-GPT”)。
  • 对照:同一订阅在 Windows 客户端(Clash Verge)中节点完整。

解决方案

_valid_config 中(仅 mihomo)在执行 mihomo -t 校验前按需补齐 GeoData,降低因 GeoData 缺失导致校验失败、进而触发回退转换的概率,从源头避免 VLESS 节点在回退链路中丢失。

具体策略:

  • 按需检测并补齐 GeoData

    • 配置包含 GEOIP → 确保存在 geoip.metadb
    • 配置包含 IP-ASN → 确保存在 ASN.mmdb
    • (可选)配置包含 GEOSITE → 确保存在 geosite.dat
  • 下载策略

    • 若设置 .envURL_GH_PROXY:优先用于 GitHub 下载链接
    • 失败后回退到 jsdelivr 镜像,提高受限网络环境的成功率
    • 同时提供 curl/wget 两种下载方式兜底
  • 兼容兜底

    • 若校验日志出现 MMDB invalid / ASN invalid,自动删除对应缓存文件并重新下载后再校验一次
  • 仓库卫生

    • 将运行时生成的 resources/geoip.metadbresources/ASN.mmdb 加入 .gitignore,避免污染工作区

截图说明

  • 图1(修复前 / Linux Web UI):clash-for-linux-install Web UI 中缺少订阅里的 VLESS 节点(如“美国GPT / 美国01-GPT”)。
  • 图2(Windows 对照):Windows 端 Clash Verge 中同一订阅可正常显示上述 VLESS 节点。
  • 图3(修复后 / Linux Web UI):应用本 PR 后,Linux Web UI 可正常显示这两条 VLESS 节点,节点列表与对照一致。

影响范围 / 兼容性

  • 仅在 KERNEL_NAME=mihomo 且配置确实包含对应规则时触发;不影响 clash 内核流程。
  • 不改变订阅转换逻辑;仅减少因 GeoData 缺失导致 mihomo -t 校验失败、被迫回退转换的情况。

变更点

  • latestversion/scripts/cmd/common.sh

    • 新增 GeoData 下载与兜底逻辑
    • _valid_configmihomo -t 前调用 GeoData 确保逻辑,并在校验失败时做一次 “invalid 文件清理 + 重试” 的兜底
  • latestversion/.gitignore

    • 忽略 resources/geoip.metadbresources/ASN.mmdb

测试

  • bash -n latestversion/scripts/cmd/common.sh 语法检查通过(无输出)。
image image image

…- 在配置校验前按需自动补齐 resources/geoip.metadb、resources/ASN.mmdb(优先 URL_GH_PROXY,失败回退 jsdelivr 镜像),并在检测到 GeoData 无效时自动清理重下。 - 更新 .gitignore 忽略上述运行时 GeoData,README 增加说明,避免仓库变脏/误解功能边界。

  1. 问题背景:部分机场订阅包含 VLESS 节点,同时带有 GEOIP/IP-ASN 规则;在 AutoDL/容器环境中经常出现 DNS/网络受限。
  2. 问题表现:mihomo -t 校验订阅配置时会尝试联网下载缺失的 GeoData;下载失败导致校验失败,脚本随即回退到“订阅转换”,转换结果可能过滤掉 VLESS,最终表现为“不支持 VLESS”。
  3. 根因分析:校验阶段对 GeoData 的依赖未被提前满足(缺失或损坏),且失败会触发订阅转换回退逻辑,造成节点类型被改变/丢失。
  4. 解决方案:在 _valid_config 中(仅 KERNEL_NAME=mihomo)根据配置内容按需下载 geoip.metadb/ASN.mmdb;若检测到 MMDB invalid/ASN invalid 则删除对应文件并重新下载后再校验。
  5. 下载策略:优先使用 .env 的 URL_GH_PROXY 拼接 GitHub 直链;失败时回退到 testingcf.jsdelivr.net 镜像,减少受限网络下的失败率。
  6. 仓库卫生:将 resources/geoip.metadb、resources/ASN.mmdb 加入 .gitignore,避免运行时文件污染工作区/提交记录。
  7. 涉及文件:scripts/cmd/common.sh、.gitignore、README.md。
  8. GPT 对话编号 019c2d3e-dce8-7941-9fc7-5215da8f2841
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant