subconverter 订阅转换完全指南 2026:自建 Docker 部署 + pref 配置 + 多客户端格式输出 + sub-store 现代方案
subconverter 是科学上网工具链里最被低估、却几乎人人都离不开的一环。你已经有了机场订阅,也装好了 Clash / sing-box / Shadowrocket,但把「机场给的那串链接」变成「客户端能直接用、还带分流规则和去广告」的配置,中间这一步,90% 的新手都卡住过。
本文把这件事讲透:为什么需要订阅转换、subconverter 怎么工作、如何自建部署、pref 配置每个参数什么意思、转换 API 怎么调,再到 Clash Meta / sing-box / Shadowrocket / Quantumult X 的实战输出,最后介绍一下更现代的 sub-store 方案。读完你就能把任意订阅收拾成「开箱即用」的配置。
阅读提示本文与 《mihomo(Clash Meta)完全配置指南》、《sing-box 全平台使用教程》、《Clash Verge Rev 进阶配置》 互为补充:那几篇讲「客户端怎么用配置」,本文讲「配置从哪来」。四篇合起来就是 2026 年「机场订阅 → 可用配置」的完整链路。
一、为什么需要订阅转换
直接把机场订阅丢进客户端,绝大多数情况下都用不顺。原因有五:
1.1 订阅里只有节点,没有规则
机场的订阅本质是一份「节点清单」——一串 vmess://、vless://、trojan:// 或 Clash YAML。它不包含分流规则:哪些域名走代理、哪些直连、哪些走广告拦截。Clash / sing-box 拿到一份「只有代理节点、没有规则」的配置,要么全部走代理(国内网站也绕一圈,慢且费流量),要么全部直连(代理形同虚设)。
1.2 不同客户端的格式不通用
| 客户端 | 接受的订阅格式 |
|---|---|
| Clash / mihomo | Clash YAML |
| sing-box | sing-box JSON |
| Shadowrocket | 原始链接 / Surge 格式 |
| Quantumult X | Quantumult X 专有格式 |
| V2RayN | V2Ray JSON |
机场通常只提供一种或两种格式(大多是 Clash 或原始链接)。你想用 sing-box,但机场只给 Clash 订阅?这就是转换的刚需。
1.3 节点名里外混杂、没有 emoji
很多机场的节点名是 HK-01|BGP|3x100Mbps 这类机器生成的字符串。转换时可以自动加国旗 emoji、重命名为中文、按地区分组,一眼就能找到想用的节点。
1.4 需要去广告、加自定义规则
subconverter 能在输出时注入通用规则集(国内直连、国外代理、去广告、流媒体解锁),免去手动维护几百行规则的痛苦。
1.5 想聚合多个机场
手里有多家机场?可以用 subconverter 把多个订阅合并成一个,统一管理、按延迟排序。
二、subconverter 是什么:工作原理
subconverter 是一个订阅「中转处理」服务。它不生产节点,只做节点的「搬运 + 加工」:
订阅URL(机场/原始链接) │ ▼ ┌─────────────────────────────┐ │ subconverter(本地/自建) │ │ 1. 拉取原始订阅 │ │ 2. 按 pref 配置处理: │ │ 加emoji / 重命名 / 去广告 │ │ 过滤节点 / 注入规则集 │ │ 3. 转换成目标格式 │ └─────────────────────────────┘ │ ▼ 输出:Clash / sing-box / SSR / Quantumult X ... │ ▼ 导入客户端直接用核心就三步:拉取 → 处理 → 输出。处理规则写在 pref 配置文件里,输出格式通过 URL 的 target 参数指定。
三、在线转换的隐患:必须自建/本地优先
网上有很多「一键订阅转换」网页。方便,但有代价:
- 节点泄露:转换服务在服务端能完整拿到你的节点(服务器、端口、密码、UUID)。作恶或数据库泄露 = 节点被滥用 + 被精准封锁。
- 规则投毒:恶意服务可能在转换时往配置里塞它自己的节点或劫持规则。
- 订阅失效:在线服务随时跑路,转换链接就废了。
安全底线生产环境一律自建 subconverter(一个 Docker 容器,内存占用几十 MB,跑在本地或自己的 VPS 上)。临时救急用在线服务可以,但转完立刻删掉配置、别保存转换链接。
四、自建部署:Docker Compose 部署 subconverter
官方镜像叫 stillnesszwm/subconverter 或社区维护的 tindy2013/subconverter。下面用 Compose 跑一个本地实例。
4.1 准备目录
mkdir -p ~/subconverter && cd ~/subconvertermkdir -p data/base data/config data/template4.2 docker-compose.yml
version: "3"services: subconverter: image: stillnesszwm/subconverter:latest container_name: subconverter restart: unless-stopped ports: - "25500:25500" volumes: - ./data/base:/base - ./data/config:/config - ./data/template:/template environment: - TZ=Asia/Shanghai4.3 启动
docker compose up -d# 验证curl http://localhost:25500# 返回 "SubConverter" 即成功默认端口是 25500,基础访问路径是 /sub。接下来所有转换请求都发往 http://<你的地址>:25500/sub。
放公网?如果只是自己用,subconverter 跑在
127.0.0.1即可,用 SSH 端口转发(ssh -L 25500:localhost:25500 user@vps)从本地访问,完全不暴露端口。真要公网开放,务必加一层 Nginx + 密码/Token 保护。
五、pref 配置详解
subconverter 的行为由 pref.toml(或 pref.ini)控制,放在 data/config/ 里。下面逐参数说明最常用的:
api_mode = truebackend = "https://api.dler.io" # 默认后端,自建时可用本地或公共后端default_url = "" # 默认订阅(留空则每次用 url 参数指定)default_target = "clash" # 默认输出格式
# 节点名美化emoji = true # 加国旗 emojiemoji_char = "🚀" # 自定义前缀 emojiremove_old_emoji = true # 先清掉原节点名里的 emoji 再处理append_proxy_type = false # 是否在节点名后追加类型(如 [Trojan])
# 连接特性udp = true # 启用 UDP 转发skip_cert_verify = false # 是否跳过证书校验(默认 false,更安全)expand = true # 展开为多条规则clash_new_field = true # 输出 Clash.Meta 新字段(rule-providers 等)
# 节点增删enable_insert = false # 是否插入额外节点insert_url = "" # 要插入的额外订阅common_rules = "" # 通用规则文件路径
base_path = "sub" # 访问基础路径api_short_url = false # 是否用短链strict_mode = false # 严格模式5.1 核心参数速查表
| 参数 | 作用 | 推荐值 |
|---|---|---|
emoji | 节点名加国旗 emoji | true |
remove_old_emoji | 清除原有 emoji 重新加 | true |
udp | 开启 UDP(游戏/语音必需) | true |
clash_new_field | 输出 mihomo 新字段 | true |
expand | 展开规则 | true |
skip_cert_verify | 跳过 TLS 校验 | false(安全) |
append_proxy_type | 节点名后缀协议类型 | 看个人喜好 |
enable_insert / insert_url | 合并额外订阅 | 多机场时启用 |
backend | 后端转换服务地址 | 自建指向本地或可信公共端 |
六、转换 API 与参数
subconverter 的转换本质是拼一个 URL。格式:
http://<host>:25500/sub?target=<格式>&url=<订阅链接>&emoji=true&udp=true&append_proxy_type=true6.1 target 目标格式一览
| target 值 | 输出格式 | 适用客户端 |
|---|---|---|
clash | Clash YAML | Clash / mihomo |
clashr | Clash + SSR | 老版 Clash |
singbox | sing-box 1.x JSON | sing-box |
singbox&ver=2 | sing-box 2.x | 新版 sing-box |
surge&ver=4 | Surge 配置 | Surge |
quan | Quantumult X | Quantumult X |
surfboard | Surfboard | Surfboard |
ss | Shadowsocks | SS 客户端 |
v2ray | V2RayN JSON | V2RayN / v2rayN |
trojan | Trojan 配置 | Trojan 客户端 |
mixed | 混合格式 | 通用 |
base64 | Base64 编码原始链接 | 批量导入 |
6.2 常用 URL 参数
| 参数 | 说明 | 示例 |
|---|---|---|
url | 原始订阅(需 URL 编码) | url=https%3A%2F%2F... |
target | 输出格式(见上表) | target=clash |
emoji | 加 emoji | emoji=true |
udp | 启用 UDP | udp=true |
rename | 重命名(逗号分隔 源=目标) | rename=HK=香港 |
exclude | 排除匹配正则的节点 | exclude=(\u52a0\u72ed|过期) |
filter | 只保留匹配正则的节点 | filter=(香港|日本) |
sort | 排序方式 | sort=rsesi(按延迟) |
insert | 额外订阅合并 | insert=https://... |
append_proxy_type | 节点名追加类型 | append_proxy_type=true |
clash_new_field | 输出 mihomo 新字段 | clash_new_field=true |
注意:
url参数里的订阅链接必须 URL 编码(把:变成%3A、/变成%2F)。可以用python -c "import urllib.parse;print(urllib.parse.quote('你的订阅'))"快速编码。
七、实战一:机场订阅 → Clash Meta 配置
假设机场给你一个 Clash 格式订阅,你想转成「带 emoji + mihomo 新字段 + 国内直连规则」的配置:
http://localhost:25500/sub?target=clash&url=<URL编码的订阅>&emoji=true&udp=true&clash_new_field=true&append_proxy_type=false把返回的 YAML 保存为 config.yaml,导入 Clash Verge Rev / mihomo 即可。
7.1 加上外部规则集(rule-providers)
subconverter 默认输出基础分流规则。要获得持续更新的精细规则(国内直连、国外代理、去广告、流媒体解锁),在生成的配置里引用社区维护的 rule-providers:
# 在 config.yaml 末尾追加rule-providers: reject: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt" path: ./ruleset/reject.yaml interval: 86400 icloud: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt" path: ./ruleset/icloud.yaml interval: 86400 proxy: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt" path: ./ruleset/proxy.yaml interval: 86400 direct: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt" path: ./ruleset/direct.yaml interval: 86400 lancidr: type: http behavior: ipcidr url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt" path: ./ruleset/lancidr.yaml interval: 86400这正好对接 《mihomo(Clash Meta)完全配置指南》 里讲到的 rule-provider 用法。
八、实战二:机场订阅 → sing-box 配置
sing-box 用 JSON 格式,target 换成 singbox:
http://localhost:25500/sub?target=singbox&ver=2&url=<URL编码的订阅>&emoji=true&udp=true注意 sing-box 版本差异较大,用
singbox&ver=2(对应 1.8+ 的路由/outbound 结构)或singbox&ver=3(最新版)匹配你客户端版本。不确定的话,打开 sing-box 客户端看它要求的订阅格式提示。
把生成的 JSON 存为 config.json,在 sing-box 客户端里加载即可。详见 《sing-box 全平台使用教程》。
九、实战三:机场订阅 → Shadowrocket / Quantumult X
9.1 Shadowrocket(iOS)
Shadowrocket 接受原始链接或 Surge 格式。最稳的方式是 target=surge&ver=4,再用 Shadowrocket 导入 Surge 配置:
http://localhost:25500/sub?target=surge%26ver=4&url=<URL编码的订阅>&emoji=true也可以直接 target=ss 或保留原始链接格式,在 Shadowrocket 里「订阅」栏粘贴转换后的链接。
9.2 Quantumult X
http://localhost:25500/sub?target=quan&url=<URL编码的订阅>&emoji=true&udp=true生成的配置直接覆盖 Quantumult X 的「配置文件」即可。更细的用法见 《Quantumult X 配置完全指南》。
十、sub-store:更现代的订阅管理方案
如果你觉得 subconverter 的 pref + URL 参数不够灵活,可以看 sub-store——一个带 Web 界面的订阅管理面板,核心优势是「脚本化」:
- JavaScript 脚本处理:可以用 JS 对节点做任何处理(批量改名、按正则分组、按延迟排序、注入自定义字段)。
- 多订阅聚合:把一个面板里管理多家机场,统一输出。
- 本地运行:同样可 Docker 部署,数据在自己手里。
- Web UI:可视化编辑、预览、一键复制。
# sub-store 最简 Compose(示意)services: sub-store: image: stillnesszwm/sub-store:latest container_name: sub-store restart: unless-stopped ports: - "3001:3001" volumes: - ./data:/datasub-store 适合进阶用户:需要按延迟自动选优、批量把节点改成中文名、按地区/运营商分组、对同一份订阅做多种输出。普通用户用 subconverter 已经足够。
两者如何选
- 只想「一键把机场订阅变成 Clash/sing-box 配置」→ subconverter(简单、稳定)。
- 想精细控制节点、写脚本、聚合多机场、有 Web 界面 → sub-store(灵活、强大)。
- 实战中很多人两者并存:sub-store 管订阅,subconverter 做最终格式转换。
十一、常见问题排错
11.1 转换后节点为空
- 检查
url是否做了 URL 编码(最常见的坑)。 - 机场订阅是否过期(浏览器直接打开订阅链接,看还有没有内容)。
- backend 是否可达(自建时
backend指向的服务能否联网)。
11.2 规则不生效 / 还是全走代理
- Clash 确认有
rules段且GEOIP,CN,direct等规则存在;sing-box 确认route.rules配置正确。 - 检查是否用了外部 rule-providers 但路径/path 写错导致加载失败(看客户端日志)。
11.3 emoji 不显示
emoji=true且remove_old_emoji=true同时开;部分旧客户端字体不支持国旗 emoji,属正常现象。
11.4 证书错误 / TLS 握手失败
- 默认
skip_cert_verify=false最安全,但如果机场订阅本身证书链异常,可临时设true排查(不建议长期开启)。
11.5 输出的 Clash 配置某些字段客户端不认
- mihomo 新字段需要
clash_new_field=true;确认你的客户端内核版本(Clash Premium 旧版不支持rule-providers/script)。
十二、安全与隐私建议
- 自建优先:subconverter / sub-store 都跑在自己机器或 VPS 上,订阅链接不外泄。
- 别存转换链接:转换出的配置导入客户端后,删掉浏览器里的转换 URL。
- SSH 端口转发:本地用
ssh -L 25500:localhost:25500访问 VPS 上的 subconverter,端口不暴露公网。 - 公网开放必加 auth:Nginx 反代 + Basic Auth 或 Token,避免被扫到滥用。
- 定期换订阅:机场订阅有泄露风险,定期在机场后台「重置订阅链接」。
十三、总结与延伸阅读
subconverter 是「机场订阅 → 可用配置」这条链路上不可或缺的加工站:它把杂乱的原始订阅,变成带 emoji、带规则、带去广告的「开箱即用」配置,并能在 Clash / sing-box / Shadowrocket / Quantumult X 之间自由转换。自建一份只需一个 Docker 容器,安全和灵活性都远胜在线服务。
想要更精细的订阅管理,再上 sub-store 用脚本做任意处理。两者配合,订阅这件事就彻底解决了。
延伸阅读(形成完整闭环):
- 《mihomo(Clash Meta)完全配置指南》 —— 转换出的 Clash 配置怎么深度调
- 《sing-box 全平台使用教程》 —— sing-box 客户端怎么用
- 《Clash Verge Rev 进阶配置完全指南》 —— 分流规则与性能调优
- 《Quantumult X 配置完全指南》 —— iOS 高级代理客户端
- 《Shadowrocket 新手使用教程》 —— iOS 小火箭基础