Clash订阅本地转换QuantumultX
已有 Clash、ClashX、Clash Verge 或 mihomo 订阅,想在 iPhone 的 Quantumult X 里复用同一批节点,但不想把订阅地址交给公共转换站——本文演示如何在同一 Wi-Fi 下,用 Mac 临时充当本地 Subconverter,把 Clash 订阅转成 Quantumult X 可用的服务器资源。
目标不是把 Mac 变成代理网关。Mac 只在「刷新订阅」时参与;节点测速、日常代理、App 流量仍由 iPhone 直连远程节点。
1. 方案概述
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart TB
subgraph refresh ["订阅更新(经过 Mac)"]
QX1["iPhone Quantumult X"]
Mac["Mac Subconverter :25500"]
Up["上游 Clash 订阅"]
QX1 -->|"HTTP 请求转换 URL"| Mac
Mac -->|"拉取原始订阅"| Up
Up --> Mac
Mac -->|"返回 QX 节点列表"| QX1
end
subgraph proxy ["日常代理与测速(不经过 Mac)"]
QX2["iPhone Quantumult X"]
Node["远程代理节点"]
Target["目标网站 / 测速目标"]
QX2 --> Node --> Target
end
classDef mac fill:#3B82F6,stroke:#2563EB,color:#fff
classDef phone fill:#10B981,stroke:#059669,color:#fff
classDef remote fill:#F59E0B,stroke:#D97706,color:#1E3A5F
class Mac mac
class QX1,QX2 phone
class Up,Node,Target remoteSubconverter 输出的是 Quantumult X 的服务器资源(节点列表)。分流规则、策略组、重写、MITM 和证书配置,仍在 Quantumult X 自己的配置里维护。
1.1 适用与不适用
适合以下情况:
- 上游提供 Clash / ClashX / Clash Verge / mihomo 可用的订阅。
- iPhone 上的 Quantumult X 需要同一批节点。
- 订阅地址不能提交给公共转换站。
- iPhone 与 Mac 在同一 Wi-Fi 下刷新订阅。
- 可接受 Mac 开机且 Docker 容器运行中,手机才能更新这条订阅。
不适合以下情况:
- iPhone 在任意网络下都要能更新订阅。
- Mac 持续为 iPhone 转发全部代理流量。
- 需要一次性生成完整 Quantumult X 分流配置、重写、MITM、策略组体系。
明确边界后,下面从环境准备和 Subconverter 部署开始。
2. 准备与部署 Subconverter
2.1 前置条件
需要:
- 一台 Mac,已安装 Docker。
- iPhone 已安装 Quantumult X。
- iPhone 与 Mac 连接同一 Wi-Fi。
- 一条上游 Clash 订阅地址。
为避免泄露订阅,下文统一使用占位符:
1 | <MAC_LAN_IP> Mac 的局域网 IP |
2.2 启动容器
在 Mac 上运行:
1 | docker run -d --restart=always \ |
-p 25500:25500 让同一 Wi-Fi 下的 iPhone 能访问 Mac 的 25500 端口。
若只在 Mac 本机测试,可绑定到 127.0.0.1:
1 | docker run -d --restart=always \ |
此时 iPhone 无法访问:手机上的 127.0.0.1 指向 iPhone 自身,不是 Mac。
验证容器与接口:
1 | docker ps --filter name=subconverter |
正常时会返回类似:
1 | subconverter v0.9.0-xxxxxxx backend |
容器就绪后,需要确认 iPhone 能连上 Mac 的局域网地址。
3. 构造 Quantumult X 订阅链接
3.1 获取 Mac 局域网 IP
在 Mac 上执行:
1 | ipconfig getifaddr en0 |
无输出时尝试 en1:
1 | ipconfig getifaddr en1 |
得到的地址即 <MAC_LAN_IP>,例如 192.168.x.x。
在 iPhone Safari 打开 http://<MAC_LAN_IP>:25500/version。能看到版本号,说明手机已能访问本地转换服务。
3.2 URL 编码与拼接
先把上游 Clash 订阅做 URL 编码。可用 Python 编码并复制到剪贴板:
1 | python3 - <<'PY' | pbcopy |
若担心订阅地址留在 shell 历史里,可临时关闭命令历史,或写入仅本机使用的临时脚本,执行后立即删除。
最终给 Quantumult X 使用的服务器资源订阅 URL:
1 | http://<MAC_LAN_IP>:25500/sub?target=quanx&list=true&udp=true&tfo=true&sort=true&exclude=%28Traffic%7CExpire%7C%E6%B5%81%E9%87%8F%7C%E5%AE%98%E7%BD%91%7C%E5%89%A9%E4%BD%99%7C%E8%BF%87%E6%9C%9F%7C%E9%87%8D%E7%BD%AE%7CReset%7CDate%7CDays+Left%7CG+%5C%7C%29&url=<ENCODED_UPSTREAM_CLASH_SUB_URL> |
3.3 参数说明
| 参数 | 作用 |
|---|---|
target=quanx | 输出 Quantumult X 格式 |
list=true | 只输出节点列表;缺少此参数时可能返回从 [general] 开头的完整配置,不适合作为服务器资源导入 |
udp=true | 为支持的节点开启 UDP relay |
tfo=true | 为支持的节点开启 TCP Fast Open |
sort=true | 按节点名排序 |
exclude=... | 排除流量、到期时间等被误识别为节点的订阅信息行 |
url=... | 上游 Clash 订阅地址(须 URL 编码) |
exclude 示例规则(写入 URL 前须编码):
1 | (Traffic|Expire|流量|官网|剩余|过期|重置|Reset|Date|Days Left|G \|) |
链接拼好后,下一步是在 Quantumult X 里导入并验证。
4. 导入与验证
在 Quantumult X 中添加服务器资源,填入上一节构造的 URL。刷新后若转换成功,会出现一批节点。
也可写入配置文件:
1 | [server_remote] |
验证分三步:
- 手机访问
http://<MAC_LAN_IP>:25500/version,确认连通。 - 浏览器或 curl 访问完整订阅 URL,确认返回 Quantumult X 节点行(格式类似
trojan = <SERVER_HOST>:<PORT>, password=<PASSWORD>, over-tls=true, ...)。公开文章不要展示真实节点行。 - 在 Quantumult X 里更新订阅,测试节点延迟或速度。测速路径为 iPhone → 远程节点 → 测速目标,不再经过 Mac。
若某一步失败,可按下一节的排查清单逐项检查。
5. 故障排查
5.1 打不开 http://<MAC_LAN_IP>:25500/
Subconverter 没有首页 UI。应访问 http://<MAC_LAN_IP>:25500/version 判断服务是否正常。
5.2 Mac 本机能打开,iPhone 打不开
优先检查:
- iPhone 与 Mac 是否在同一 Wi-Fi。
- iPhone 是否开启 VPN 或代理,导致局域网请求被转发走。
- Mac 局域网 IP 是否变化(
ipconfig getifaddr en0)。 - Docker 容器是否仍在运行(
docker ps --filter name=subconverter)。 - Mac 防火墙是否阻止入站连接。
5.3 导入后内容像完整配置
检查 URL 是否包含 list=true。缺少时,target=quanx 可能输出完整配置,而非纯节点列表。
5.4 订阅里出现流量、到期时间等伪节点
增加或调整 exclude 参数,规则写入 URL 前须编码。示例:
1 | (Traffic|Expire|流量|官网|剩余|过期|重置|Reset|Date|Days Left|G \|) |
5.5 离开家后更新失败
这是预期行为:本方案仅支持同一 Wi-Fi 下更新。若需外网更新,可考虑 Tailscale、ZeroTier、内网穿透或自建带认证的转换服务——安全边界与本文方案不同,需单独评估。
排查之外,公开分享时还要注意订阅与节点的脱敏。
6. 安全与脱敏
以下内容不要写入公开文章、截图或 Issue:
- 原始或 URL 编码后的订阅 URL。
- token、UUID、password。
- 节点服务器域名或 IP。
- 完整 Quantumult X 节点行。
公开内容只保留占位符:<MAC_LAN_IP>、<UPSTREAM_CLASH_SUB_URL>、<ENCODED_UPSTREAM_CLASH_SUB_URL>、<SERVER_HOST>、<PASSWORD>。
截图前遮住浏览器地址栏、Quantumult X 订阅 URL、节点详情和服务商信息。
也不建议把 25500 端口暴露到公网。 本文默认边界是同一 Wi-Fi 内使用。
7. 延伸思考
- 若需离家更新,Tailscale 等组网方案可让 iPhone 像在家一样访问 Mac 上的 Subconverter,但需额外配置访问控制。
- Subconverter 还支持更多
target和过滤参数,可按节点类型微调输出。 - 分流与策略仍在 Quantumult X 侧维护;节点列表与规则解耦,便于分别更新。
参考资料
- Subconverter 项目:https://github.com/tindy2013/subconverter
- Subconverter 参数说明:https://github.com/tindy2013/subconverter/blob/master/README-cn.md