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 remote

Subconverter 输出的是 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
2
3
<MAC_LAN_IP>                       Mac 的局域网 IP
<UPSTREAM_CLASH_SUB_URL> 原始 Clash 订阅地址
<ENCODED_UPSTREAM_CLASH_SUB_URL> URL 编码后的 Clash 订阅地址

2.2 启动容器

在 Mac 上运行:

1
2
3
4
docker run -d --restart=always \
--name subconverter \
-p 25500:25500 \
tindy2013/subconverter:latest

-p 25500:25500 让同一 Wi-Fi 下的 iPhone 能访问 Mac 的 25500 端口。

若只在 Mac 本机测试,可绑定到 127.0.0.1

1
2
3
4
docker run -d --restart=always \
--name subconverter \
-p 127.0.0.1:25500:25500 \
tindy2013/subconverter:latest

此时 iPhone 无法访问:手机上的 127.0.0.1 指向 iPhone 自身,不是 Mac。

验证容器与接口:

1
2
docker ps --filter name=subconverter
curl http://127.0.0.1:25500/version

正常时会返回类似:

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
2
3
4
5
6
python3 - <<'PY' | pbcopy
import urllib.parse

raw = "<UPSTREAM_CLASH_SUB_URL>"
print(urllib.parse.quote(raw, safe=""))
PY

若担心订阅地址留在 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
2
[server_remote]
http://<MAC_LAN_IP>:25500/sub?target=quanx&list=true&udp=true&tfo=true&sort=true&exclude=...&url=<ENCODED_UPSTREAM_CLASH_SUB_URL>, tag=本地转换节点, update-interval=86400, opt-parser=false, enabled=true

验证分三步:

  1. 手机访问 http://<MAC_LAN_IP>:25500/version,确认连通。
  2. 浏览器或 curl 访问完整订阅 URL,确认返回 Quantumult X 节点行(格式类似 trojan = <SERVER_HOST>:<PORT>, password=<PASSWORD>, over-tls=true, ...)。公开文章不要展示真实节点行。
  3. 在 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 侧维护;节点列表与规则解耦,便于分别更新。

参考资料