最后更新于:2026年7月

还在用别人的 subconverter 公共服务? 公共服务有三个硬伤:速度慢(排队转换)、不稳定(经常挂)、不安全(你的订阅链接明文传给第三方)。2026 年了,自建一个 subconverter 服务的成本已经低到忽略不计——一台最低配的 VPS,甚至一个 Cloudflare Worker 就能跑。
本文是 subconverter 的进阶指南,假设你已经了解基础用法。如果你是新手,建议先看 订阅转换完全指南 打好基础。
【本文适合谁?】
- 有多个机场订阅,想统一管理的用户
- 想自定义分流规则和节点分组的进阶用户
- 有 VPS,想自建订阅转换服务的技术爱好者
- 追求隐私安全,不想把订阅链接交给第三方的用户
一、为什么要自建 subconverter?
1.1 公共服务的三大问题
| 问题 | 描述 | 影响 |
|---|---|---|
| 速度慢 | 公共服务用户多,转换要排队 | 更新订阅等几十秒甚至超时 |
| 不稳定 | 免费服务没保障,随时可能关停 | 某天突然发现订阅不更新了 |
| 不安全 | 订阅链接明文传给第三方 | 节点信息泄露,被盗用风险 |
1.2 自建的好处
- ⚡ 速度快:独享资源,秒级转换
- 🔒 安全:订阅链接不经过第三方
- 🎛️ 自定义:完全控制规则、分组、重命名
- 💰 省钱:最低配 VPS 就够用,月费 $2-3
- 🔄 稳定:自己控制,不会突然关停
二、Docker 自建 subconverter 服务
2.1 最简部署:一条命令搞定
如果你已经有 Docker 环境,一条命令就能跑起来:
docker run -d \
--name subconverter \
--restart always \
-p 25500:25500 \
-v /opt/subconverter:/subconverter \
tindy2013/subconverter:latest访问 http://你的IP:25500 看到版本信息,说明启动成功。
2.2 Docker Compose 部署(推荐)
更规范的方式是用 Docker Compose:
version: '3'
services:
subconverter:
image: tindy2013/subconverter:latest
container_name: subconverter
restart: always
ports:
- "25500:25500"
volumes:
- ./config:/subconverter
environment:
- TZ=Asia/Shanghai启动:
docker-compose up -d2.3 配置文件详解
subconverter 的核心配置文件是 pref.toml(或 pref.ini)。从 Docker 容器中复制默认配置:
docker cp subconverter:/subconverter/pref.toml ./pref.toml关键配置项:
[common]
# 服务监听地址
address = "0.0.0.0"
# 服务端口
port = 25500
[managedconfig]
# 是否开启缓存
enable_cache = true
# 缓存时间(秒)
cache_expire = 3600
[userinfo]
# 流量信息显示
enable_flow = true
enable_expire = true
[emojiflag]
# 节点名添加国旗 emoji
enable = true2.4 加上 HTTPS(重要)
订阅链接建议走 HTTPS。用 Nginx 反代 + Let’s Encrypt 证书:
server {
listen 443 ssl http2;
server_name sub.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/sub.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sub.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:25500;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}用 certbot 申请免费证书:
certbot --nginx -d sub.yourdomain.com三、自定义规则集与分组策略
这是自建 subconverter 最强大的功能——完全自定义分流规则和节点分组。
3.1 规则集配置文件
subconverter 支持外部规则集文件。在 pref.toml 中配置:
[clash_rule_base]
base_path = "config/rule/"3.2 自定义 Clash 配置模板
创建一个自定义模板文件 config/clash/custom.yaml:
# 自定义 Clash 配置模板
port: 7890
socks-port: 7891
allow-lan: true
mode: rule
log-level: info
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
# 代理组定义 - subconverter 会自动填充节点
proxy-groups:
- name: "🚀 节点选择"
type: select
proxies:
- ♻️ 自动选择
- 🎯 故障转移
- 🌍 国外媒体
- DIRECT
- name: "♻️ 自动选择"
type: url-test
url: "http://www.gstatic.com/generate_204"
interval: 300
tolerance: 50
- name: "🎯 故障转移"
type: fallback
url: "http://www.gstatic.com/generate_204"
interval: 60
- name: "🌍 国外媒体"
type: select
proxies:
- 🚀 节点选择
- ♻️ 自动选择
# 分流规则
rules:
# 流媒体
- DOMAIN-SUFFIX,netflix.com,🌍 国外媒体
- DOMAIN-SUFFIX,nflxvideo.net,🌍 国外媒体
- DOMAIN-SUFFIX,youtube.com,🚀 节点选择
- DOMAIN-SUFFIX,googlevideo.com,🚀 节点选择
- DOMAIN-SUFFIX,disney.com,🌍 国外媒体
- DOMAIN-SUFFIX,hbomax.com,🌍 国外媒体
# 社交媒体
- DOMAIN-SUFFIX,twitter.com,🚀 节点选择
- DOMAIN-SUFFIX,x.com,🚀 节点选择
- DOMAIN-SUFFIX,telegram.org,🚀 节点选择
# AI 服务
- DOMAIN-SUFFIX,openai.com,🚀 节点选择
- DOMAIN-SUFFIX,anthropic.com,🚀 节点选择
- DOMAIN-SUFFIX,claude.ai,🚀 节点选择
# 国内直连
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,DIRECT
# 兜底
- MATCH,🚀 节点选择3.3 在订阅链接中使用自定义模板
https://sub.yourdomain.com/sub?target=clash&
url=你的订阅链接&
config=https://raw.githubusercontent.com/你的仓库/custom.yaml&
emoji=true&
udp=true&
tfo=true关键是 config 参数指向你的自定义模板。
3.4 多套规则模板
你可以准备多套模板,不同场景用不同模板:
| 模板名 | 适用场景 | 特点 |
|---|---|---|
minimal.yaml | 日常使用 | 规则精简,速度快 |
streaming.yaml | 看视频 | 流媒体分流详细 |
gaming.yaml | 打游戏 | 游戏域名直连/低延迟 |
ai.yaml | AI 开发 | AI 服务专用节点 |
full.yaml | 全功能 | 规则最全,适合折腾 |
切换模板只需要改订阅链接里的 config 参数。
四、多订阅源合并与去重
4.1 合并多个机场订阅
如果你有多个机场的订阅,可以合并成一个订阅链接。用 | 分隔多个订阅 URL:
https://sub.yourdomain.com/sub?target=clash&
url=订阅A|订阅B|订阅C&
config=你的模板subconverter 会把三个订阅的节点合并到一起。
4.2 节点去重
多个机场可能有重复的节点(比如都用同一个机房)。开启去重:
https://sub.yourdomain.com/sub?target=clash&
url=订阅A|订阅B&
config=你的模板&
rename=1&
dev_id=true4.3 节点重命名
不同机场的节点命名风格不一致,看起来很乱。用 rename 参数统一命名:
&rename=原名@新名批量重命名示例:
&rename=香港@🇭🇰 香港&rename=日本@🇯🇵 日本&rename=新加坡@🇸🇬 新加坡&rename=美国@🇺🇸 美国4.4 节点筛选过滤
只保留特定地区的节点:
# 只保留日本和新加坡节点
&include=日本|新加坡
# 排除某些节点
&exclude=过期|官网|流量
# 正则过滤
&filter=(日本|新加坡).*(IEPL|IPLC)五、性能优化与缓存配置
5.1 开启缓存
转换订阅需要抓取原始订阅、解析、转换,比较耗时。开启缓存后,相同请求直接返回缓存结果。
在 pref.toml 中:
[managedconfig]
enable_cache = true
cache_expire = 3600 # 缓存1小时或者在订阅链接中加参数:
&cache_expire=36005.2 数据库缓存(高级)
对于大量用户场景,可以用 Redis 做缓存:
# docker-compose.yml
version: '3'
services:
subconverter:
image: tindy2013/subconverter:latest
depends_on:
- redis
ports:
- "25500:25500"
volumes:
- ./config:/subconverter
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
volumes:
redis-data:5.3 CDN 加速
在你的 Nginx 前面再套一层 Cloudflare CDN:
- 域名 DNS 解析到 Cloudflare
- 开启缓存规则:
/sub?*缓存 30 分钟- 静态资源缓存 1 天
这样即使原始订阅更新了,CDN 缓存没过期也不会重新转换,大幅降低服务器负载。
5.4 性能对比
| 方案 | 转换耗时 | 并发能力 | 适用场景 |
|---|---|---|---|
| 无缓存 | 3-8 秒 | 低 | 测试调试 |
| 内存缓存 | 首次 3 秒,后续 <100ms | 中 | 个人使用 |
| Redis 缓存 | 首次 3 秒,后续 <50ms | 高 | 多人共享 |
| CDN + 缓存 | 首次 3 秒,后续 <10ms | 极高 | 大量用户 |
六、多客户端适配
subconverter 支持转换成多种客户端格式。
6.1 支持的输出格式
| target 值 | 客户端 | 格式 |
|---|---|---|
clash | Clash / Mihomo | YAML |
clashr | Clash R | YAML |
surge&ver=4 | Surge 4 | INI |
quan | Quantumult | INI |
quanx | Quantumult X | INI |
loon | Loon | INI |
ss | Shadowsocks | SIP008 |
ssr | ShadowsocksR | SSR |
ssd | SSD | JSON |
singbox | Sing-Box | JSON |
v2ray | V2Ray | JSON |
6.2 Clash / Mihomo 适配
https://sub.yourdomain.com/sub?target=clash&
url=你的订阅&
config=你的模板&
emoji=true&
udp=true&
tfo=true&
append_type=true&
fdn=true关键参数:
| 参数 | 作用 | 推荐值 |
|---|---|---|
emoji | 节点名加国旗 | true |
udp | 开启 UDP | true |
tfo | TCP Fast Open | true |
append_type | 节点名加协议类型 | true |
fdn | 过滤不可用节点 | true |
6.3 Sing-Box 适配
Sing-Box 的配置格式和 Clash 完全不同,但 subconverter 可以自动转换:
https://sub.yourdomain.com/sub?target=singbox&
url=你的订阅&
config=你的singbox模板Sing-Box 模板示例(JSON 格式):
{
"log": {
"level": "info"
},
"dns": {
"servers": [
{"address": "https://dns.alidns.com/dns-query"},
{"address": "https://1.1.1.1/dns-query", "detour": "proxy"}
]
},
"inbounds": [
{
"type": "tun",
"interface_name": "singbox-tun",
"inet4_address": "172.19.0.1/30"
}
],
"outbounds": [
{"type": "selector", "tag": "proxy"},
{"type": "urltest", "tag": "auto"},
{"type": "direct", "tag": "direct"},
{"type": "block", "tag": "block"}
]
}6.4 Shadowrocket 适配
https://sub.yourdomain.com/sub?target=ss&
url=你的订阅&
emoji=trueShadowrocket 支持直接导入 SS 链接,也支持 Clash 格式的配置文件。
6.5 一键生成所有客户端订阅
如果你同时用多个设备,可以用 subconverter 的配置文件管理功能,一键生成所有格式。
在 pref.toml 中配置 managed_config:
[managedconfig]
# 生成 Clash 订阅
clash = "https://sub.yourdomain.com/sub?target=clash&url=SUB_URL&config=TEMPLATE"
# 生成 Sing-Box 订阅
singbox = "https://sub.yourdomain.com/sub?target=singbox&url=SUB_URL&config=TEMPLATE"
# 生成 Surge 订阅
surge = "https://sub.yourdomain.com/sub?target=surge&ver=4&url=SUB_URL&config=TEMPLATE"七、自动化:定时更新与通知
7.1 定时刷新订阅缓存
用 crontab 定时触发缓存刷新:
# 每 30 分钟刷新一次
*/30 * * * * curl -s "https://sub.yourdomain.com/sub?target=clash&url=你的订阅&config=模板&force_refresh=true" > /dev/null7.2 节点变更通知
用脚本检测节点变化,有变动时发 Telegram 通知:
#!/usr/bin/env python3
import requests
import json
import hashlib
# 配置
SUB_URL = "你的订阅链接"
BOT_TOKEN = "你的Telegram Bot Token"
CHAT_ID = "你的Chat ID"
def get_nodes_hash():
"""获取当前节点列表的哈希值"""
resp = requests.get(SUB_URL)
return hashlib.md5(resp.text.encode()).hexdigest()
def send_telegram(message):
"""发送 Telegram 通知"""
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
data = {"chat_id": CHAT_ID, "text": message}
requests.post(url, data=data)
# 读取上次哈希
try:
with open("/tmp/nodes_hash.txt", "r") as f:
old_hash = f.read().strip()
except:
old_hash = ""
# 获取当前哈希
new_hash = get_nodes_hash()
# 对比
if new_hash != old_hash:
send_telegram("⚠️ 订阅节点有变更!请检查你的节点列表。")
with open("/tmp/nodes_hash.txt", "w") as f:
f.write(new_hash)加入 crontab:
# 每小时检查一次
0 * * * * python3 /opt/subconverter/check_nodes.py八、安全加固
8.1 添加访问密码
不希望别人用你的 subconverter?加个密码:
在 Nginx 中配置基本认证:
# 生成密码文件
htpasswd -c /etc/nginx/.htpasswd your_username
# Nginx 配置
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:25500;
}8.2 限制访问频率
防止滥用:
# Nginx 限流
limit_req_zone $binary_remote_addr zone=sub:10m rate=10r/m;
location /sub {
limit_req zone=sub burst=5 nodelay;
proxy_pass http://127.0.0.1:25500;
}8.3 只允许自己的客户端访问
如果你的客户端 IP 固定,可以加白名单:
location / {
allow 1.2.3.4; # 你的 IP
allow 192.168.0.0/16; # 内网
deny all;
proxy_pass http://127.0.0.1:25500;
}九、常见问题排查
9.1 转换失败
| 原因 | 解决方法 |
|---|---|
| 原始订阅链接失效 | 检查订阅链接是否能正常访问 |
| 网络不通 | 服务器是否能访问订阅源 |
| 格式不支持 | 检查 target 参数是否正确 |
| 模板配置错误 | 检查 config 模板 URL 是否有效 |
9.2 节点数量不对
| 原因 | 解决方法 |
|---|---|
| 过滤规则太严 | 检查 include/exclude 参数 |
| 去重导致合并 | 关闭 dev_id 参数测试 |
| 机场限制了 IP | 换一个 IP 获取订阅 |
9.3 速度慢
| 原因 | 解决方法 |
|---|---|
| 没开缓存 | 开启 enable_cache |
| 服务器配置低 | 升级 VPS 或用 CDN |
| 原始订阅慢 | 用缓存减少请求频率 |
十、总结
10.1 自建 subconverter 的成本
| 项目 | 费用 |
|---|---|
| 最低配 VPS | $2-3/月 |
| 域名 | $1/月(年付 $10 左右) |
| Cloudflare CDN | 免费 |
| Let’s Encrypt 证书 | 免费 |
| 合计 | 约 $3-4/月 |
10.2 完整方案架构
机场订阅 A ─┐
机场订阅 B ─┼──→ subconverter(转换)──→ Clash 配置
机场订阅 C ─┘ │ ──→ Sing-Box 配置
│ ──→ Shadowrocket 配置
│
Redis 缓存
│
Cloudflare CDN
│
你的所有设备10.3 学习路径
- 第一步:Docker 部署 subconverter,用默认配置跑通
- 第二步:加 HTTPS,配置域名访问
- 第三步:自定义规则模板,实现个性化分流
- 第四步:多订阅合并,统一管理所有机场
- 第五步:缓存优化 + CDN 加速,提升性能
- 第六步:安全加固 + 自动化通知
【相关推荐】
- 订阅转换完全指南(基础篇) - 新手入门
- Mihomo WebUI 完全配置指南 - 可视化管理
- AI 智能路由完全指南 - 自动选节点
自建 subconverter 是代理进阶的必经之路。一次部署,长期受益。今天就动手搭一个属于自己的订阅转换服务吧。🚀
