保留上游兼容性,最大限度模拟 Mihomo Provider 请求特征
项目定位 · 上游差异 · 部署方法 · 仓库运行逻辑 · 常见问题 · 完整 Wiki
本项目旨在最大限度减少原版 subconverter 主动拉取远程订阅时,向订阅服务商暴露的请求特征。在保留原有转换接口和使用方式的基础上,它将 subconverter 访问订阅地址时可被服务商观察到的 HTTP/TLS 等行为,尽可能对齐 Mihomo 内核的 Provider 访问特征,从而尽可能避免被识别为 subconverter 并遭到屏蔽。
它适合仍需由服务端完成传统订阅拉取和转换、又希望降低请求特征暴露的用户。已经在使用普通 subconverter 的部署通常只需替换镜像,无需改变订阅链接和客户端用法。
本项目的上游源码来自 asdlokj1qpi233/subconverter。仓库自动跟踪并同步上游 master 分支,在此基础上完成请求特征隐匿化改造、验证和 Docker 镜像发布。本项目不增加与隐匿化目标无关的功能;仓库中的其他改动仅用于自动同步、兼容性验证和镜像发布。
| 信息 | 当前值 |
|---|---|
| 上游版本 | v0.9.9 |
| 上游提交短 ID | ecb63a9b |
| Mihomo 稳定版 | v1.19.30 |
上游版本用于识别版本系列,实际同步源码以上游提交短 ID 为准。
Tip
如果希望从架构上完全避免订阅转换后端访问远程订阅服务商,建议使用 Aethersailor/SubConverter-Extended。它会生成 proxy-provider,由用户客户端中的 Mihomo 内核直接拉取订阅,转换后端不再连接远程订阅服务器。
| 需求 | 推荐项目 |
|---|---|
| 保留传统 subconverter 的服务端拉取与转换,同时尽量减少请求特征 | 本项目 |
| 让转换后端不再访问远程订阅,由客户端 Mihomo 直接拉取 | SubConverter-Extended |
本项目不重复维护 subconverter 的通用接口和参数文档。订阅转换方法、支持格式和外部配置说明请直接查看上游 README。
| 对比项 | 上游行为 | 本项目行为 |
|---|---|---|
| 机场订阅获取 | 使用原有 cURL 获取路径 | 只有显式标记为 SubscriptionProvider 的请求使用 Mihomo Provider 获取路径 |
| 请求实现 | subconverter 自身 HTTP 客户端 | 使用当前同步的 Mihomo 稳定版所对应的 Provider 获取实现 |
| 请求特征 | 保留原版 subconverter 可观测特征 | 对照 Mihomo 的 HTTP 请求、请求头顺序与 TLS ClientHello;不是只替换一个 User-Agent 字符串 |
| 入站请求头 | 依赖上游原有处理 | 客户端、CDN 和反向代理请求头不会原样发送给机场订阅地址 |
| 旧指纹头 | 上游兼容行为 | 不发送 SubConverter-Request、SubConverter-Version 和 CORS X-Requested-With 指纹头 |
| GET / HEAD | 上游默认行为 | 不再默认携带 JSON Content-Type;脚本显式设置的值保持不变 |
| 其他远程资源 | 使用上游请求路径 | Generic 出站请求(规则、模板等)保持 subconverter 自身身份,不会全部模拟成 Mihomo |
| 校验失败 | 不具备本项目的组件与版本校验 | Mihomo 获取组件或版本校验失败时,本次订阅获取直接失败,不会静默降级 |
| 发布方式 | 由上游项目决定 | 自动同步源码并验证候选版本,仅公开 Docker Hub 与 GHCR 多架构镜像 |
Note
本项目重点改变的是「转换后端访问机场订阅」这一段网络行为。对外接口、端口和主要配置方式继续保持上游兼容。
-
新建
compose.yaml:services: subconverter: image: docker.io/aethersailor/subconverter:latest container_name: subconverter restart: unless-stopped ports: - "127.0.0.1:25500:25500"
-
启动容器:
docker compose up -d
-
检查服务版本:
curl --fail http://127.0.0.1:25500/version
请求成功并返回版本信息后,服务即可使用。
使用 Docker 命令
docker run -d \
--name subconverter \
--restart unless-stopped \
-p 127.0.0.1:25500:25500 \
docker.io/aethersailor/subconverter:latest也可以把镜像地址替换为:
ghcr.io/aethersailor/subconverter:latest
Warning
示例默认只允许本机访问,适合搭配同机的 Nginx、Caddy 或 OpenResty。需要从局域网直接访问时,可把端口映射改为 25500:25500。不要在没有访问控制的情况下直接暴露到公网。
已有 subconverter 部署可以继续使用原有 pref.ini、外部配置和规则文件。镜像内的配置位置与上游保持一致;替换镜像时,请保留现有挂载和端口映射。
完整部署、更新和日志边界见 Wiki 的部署与更新。
flowchart LR
A["定时或手动检查"] --> B["解析上游与 Mihomo 最新稳定版"]
B --> C["确认用于构建的版本"]
C --> D["构建并验证待发布版本"]
D --> E["Mihomo 请求特征对照"]
E --> F["更新 master 并发布 Docker 镜像"]
自动化按以下顺序运行:
- 检查 subconverter 上游
master和 Mihomo 最新稳定 Release 是否发生变化。 - 确认本次构建使用的上游提交和 Mihomo 版本。
- 验证 Linux、Windows 和 macOS 的构建兼容性;这些构建不作为公开下载内容。
- 启动待发布的 Docker 镜像,并测试真实的机场订阅获取路径。
- 使用对应版本的官方 Mihomo 对照 HTTP/1.1 请求和 TLS ClientHello。
- 所有检查通过后,才更新
master并发布 Docker Hub、GHCR 多架构镜像。任一步失败都不会发布新镜像。
没有发现上游或 Mihomo 变化时,仓库不会重复发布镜像。检测到变化但验证失败时,用户继续获得上一个通过验证的版本。
flowchart LR
A["客户端"] -->|"访问转换服务"| B["subconverter"]
B -->|"Mihomo Provider 请求特征"| C["订阅服务商"]
| 请求类型 | 处理方式 |
|---|---|
| 机场原始订阅 | 使用 Mihomo Provider 获取行为 |
| 规则、模板等普通下载 | 保持 subconverter 自身身份 |
| 对外转换接口 | 保持上游兼容用法 |
更多说明见 Wiki 的仓库运行逻辑。
Important
本项目减少的是应用层请求特征,不承诺让访问绝对不可识别。
订阅服务商仍可能观察到:
- 服务器出口 IP 和网络路径;
- 请求时间、频率和订阅内容;
- 账号本身的使用模式;
- 外层 CDN、WAF、反向代理和访问日志留下的信息。
使用反向代理时,请阅读隐私部署说明,避免完整订阅 URL 和 Token 被写入日志。
Compose 部署执行以下命令:
docker compose pull
docker compose up -d
curl --fail http://127.0.0.1:25500/version前两条命令拉取并重建容器。最后一条命令用于确认更新后的服务能够返回版本信息。
若希望固定版本,请记录并使用镜像 digest,不要仅依赖可变的 latest 标签。
| 项目 | 地址或范围 |
|---|---|
| Docker Hub | docker.io/aethersailor/subconverter:latest |
| GitHub Container Registry | ghcr.io/aethersailor/subconverter:latest |
| Docker 架构 | linux/amd64、linux/386、linux/arm/v7、linux/arm64 |
所有请求都会模拟成 Mihomo 吗?
不会。只有访问机场原始订阅的请求使用 Mihomo Provider 行为。规则、模板等普通下载仍保持 subconverter 自身身份,避免改变不相关功能。
会始终跟随 Mihomo 最新版本吗?
自动化会检查 Mihomo 最新稳定 Release,但不会在未经验证时直接更新。版本、请求行为、跨平台兼容性和镜像测试全部通过后,才会发布新的公开镜像。
可以保证订阅服务商百分之百无法识别吗?
不能。本项目尽可能缩小 Mihomo 与 subconverter 在 Provider 获取请求上的可观测差异,但无法隐藏出口 IP、访问时机、账号行为或订阅服务商掌握的其他数据。
可以直接替换普通 subconverter 吗?
可以。接口、端口和主要配置方式保持上游兼容。使用自定义 pref.ini、外部配置或规则文件的部署,需要继续挂载原有配置,并把镜像地址换成本项目镜像。
获取订阅失败时会退回普通请求吗?
不会。Mihomo 获取组件或版本校验失败时,本次订阅获取会直接失败,以免在用户不知情的情况下暴露普通 subconverter 请求特征。
更多说明见 Wiki 的常见问题。
subconverter 隐匿特征版