一年前,iOS 上唯一免费开源的代理客户端被苹果一纸”误判”冻在 App Store 里:不能更新,不能下架重传,连申诉都石沉大海。内核停在 1.9,机场上的新协议节点一个接一个连不上,官网只能把 App Store 链接划掉,留一句”TestFlight 用户不受影响”。用户能做的只有等。

换成任何一个闭源软件,故事到这里就结束了。

但 sing-box 是开源的。作者等了一年,然后做了一件只有开源项目才做得到的事:换个账号,重新上架,内核直接拉到最新。

今天,它回来了。

先说事

打开美区 App Store 搜 sing-box,多了一个新条目:sing-box MT,开发者 Metamerism LLC,版权署名 nekohasekai,官网指向

sing-box.sagernet.org

。就是那个 sing-box,换了个开发者账号、新的 Bundle ID,核心版本从 1.9 时代直接跳到 1.14,和桌面端彻底对齐。作者的处理方式非常互联网:打不过就换号。

几个硬数据:

  • 名字:sing-box MT(不是 VT,别下错了)
  • 价格:免费
  • 系统:iOS / iPadOS 15+,tvOS 17+,visionOS 1.0+
  • 体积:约 96 MB
  • 当前版本:1.14.4
  • 门槛:需要一个非中国大陆地区的 Apple ID(这一点和小火箭、Loon 一样,谁也躲不掉)

一句话总结:iOS 上唯一免费、开源、内核跟上游同步的代理客户端,回来了。

sing-box 到底是个啥

给完全没接触过的朋友一个心智模型。

你手机上装的”代理软件”,其实分两层:

  1. 内核:真正干活的那部分,负责把流量按协议打包、加密、发到你的服务器。
  2. :你看到的界面,按钮、订阅管理、开关。

小火箭、Loon 是”内核 + 壳”一体的闭源软件,内核是各家自己写的。sing-box 反过来:内核是一个开源的通用代理平台,然后作者给每个系统各套了一个壳:

  • SFI:sing-box for iOS
  • SFA:sing-box for Android
  • SFM:sing-box for macOS
  • SFT:sing-box for tvOS

App Store 里的 sing-box MT 就是 SFI 的最新马甲。

这个”内核和壳分离”的设计,是后面所有优势的根。

这次 MT 带了什么新东西

对比老 VT,MT 不只是换壳:

1. 内核 1.14.x 老 VT 因为无法更新,内核停在 1.9 时代,很多机场新上的节点根本连不上。MT 直接对齐当前最新内核,Hysteria2、TUIC、AnyTLS、VLESS+Reality 这些一个不落。

2. 配置编辑器带语法高亮和实时检查 以前手写 JSON 少一个逗号,点启动才报错,还得自己数括号。现在编辑器边写边标红,对新手是实打实的减负。

3. 工作目录对”文件”App 开放 你可以在系统”文件”里直接看到 sing-box 的目录,往里拖文件。这意味着——

4. 支持本地 rule-set 自己写的分流规则集,不用再上传到哪个 URL 再让手机下回来,直接放本地目录引用。玩规则的人懂这有多爽。

5. 一个提醒 因为是新条目,VT 里的配置不会自动继承。如果你手上还有能打开的 VT,先把配置复制出来。

为什么我建议你放弃小火箭和 Loon

先声明立场:我是来站台的。

小火箭和 Loon 都是好软件,我也用过很多年。但 2026 年了,如果你是今天才开始选 iOS 客户端,我不觉得还有理由去付费买闭源。

sing-box MT Shadowrocket Loon
价格 免费 $2.99 $9.99
开源 GPLv3,代码可审计 闭源 闭源
内核 sing-box 上游同步 自研闭源 自研闭源
配置格式 JSON,全平台通用 私有格式 私有格式(Surge 风格)
跨平台 iOS / Android / macOS / Windows / Linux / 路由器 / Apple TV / Vision Pro iOS / macOS / tvOS iOS / macOS
规则来源 官方 geosite / geoip 二进制 rule-set,社区海量 自有格式,依赖第三方维护 自有格式,依赖第三方维护
策略组 selector / urltest 原生支持
面板 内置 Clash API,可接任意面板
本地规则文件 支持(MT 新增) 支持 支持

表格看着平,展开讲几个真正拉开差距的点。

\1. 免费且开源,不是”免费”就完了

免费的代理软件 App Store 里一堆,绝大多数是流氓。sing-box 不一样的地方在于代码全公开、协议是 GPLv3,你不信作者可以自己编译。App Store 隐私标签写的是”不收集任何数据”,这个词在开源软件嘴里和在闭源软件嘴里的分量不一样。

\2. 一份配置,全家桶通吃

这是我最看重的一点。你在 iPhone 上调好的那份 JSON,原封不动扔到 Mac、Windows、安卓、OpenWrt 路由器上,行为完全一致。学一次,到处用。

小火箭和 Loon 的配置只能在它们自己的 App 里生效。换个设备换个系统,从头再来。

\3. 内核跟上游走,新协议不用等

闭源客户端支持新协议,得等作者一个人手写实现。sing-box 本身就是很多新协议的参考实现(AnyTLS 就是这么来的),客户端拿内核过来就有了。

老 VT 停更那一年,多少人被”节点连不上”折磨,本质就是内核跟不上。MT 把这个问题解决了:内核在哪,客户端就在哪。

\4. 规则集生态

sing-box 的 rule-set 是编译好的二进制格式(.srs),加载快、内存省,这在 iOS 这种给 VPN 扩展限死内存的平台上不是小事。官方维护的 geosite / geoip 规则集一行 URL 就能引用,社区还有大量按应用、按地区拆好的现成集合。

\5. JSON 是好朋友,不是敌人

很多人被”要手写 JSON”吓退。但换个角度:JSON 是一种全世界通用的、有严格语法的格式,意味着——

  • 可以直接把配置扔给 AI 让它帮你改
  • 可以放 GitHub 上做版本管理
  • 可以直接发给朋友,对方粘贴即用
  • 出错了报错信息精确到字段

私有格式做不到这些。而且 MT 这次的高亮和实时检查,把 JSON 最大的痛点也补上了。

\6. 不用担心”一个人的软件”

小火箭是一个人的公司,Loon 也是。开发者哪天不干了,软件就停在那里。sing-box 也是一个人主导,但它是开源的:作者不干了,社区可以接着干。这次 VT 被苹果卡死、作者换号重来,就是最好的压力测试——闭源软件遇到这种事,你只能等。

安装

  1. 切换到非中国大陆地区的 Apple ID(美区、港区、日区都行)。
  2. App Store 搜索 sing-box MT。
  3. 确认开发者是 Metamerism LLC,图标是那个熟悉的盒子。搜索结果里可能混着蹭名字的山寨货,认准开发者。
  4. 下载,首次打开允许添加 VPN 配置。

装好就是一个几乎空白的界面,别慌,接下来分两条路。

路线 A:机场党,导入订阅(三分钟)

适合大多数人。

如果机场提供 sing-box 订阅

现在主流机场基本都有。在机场面板找到”sing-box”或”SFI”格式的订阅链接,复制。

打开 sing-box MT:

  1. 底部切到 Profiles(配置)
  2. 右上角 +New Profile
  3. Name 随便填,比如机场名
  4. Type 选 Remote
  5. URL 粘贴订阅链接
  6. 打开 Auto Update,间隔默认即可
  7. 保存

回到 Dashboard,确认选中的是刚建的配置,点那个大大的开关。第一次启动会去下载规则集,等十几秒。

Dashboard 下方有 Groups,里面就是你的节点列表和策略组,点一下切节点。

如果机场只给 Clash / V2Ray 订阅

两个办法:

办法一:直接把机场的 Clash 订阅链接填进去试试。不少机场后端会根据客户端 User-Agent 自动返回 sing-box 格式,试一下不亏。

办法二:用 Sub-Store 转换。Sub-Store 是一个开源订阅管理器,可以把任意格式的订阅转成 sing-box JSON,还能顺便加上分流规则。搜”Sub-Store sing-box 模板”能找到很多现成方案,这里不展开。

路线 B:自建党,手写 VLESS + Reality(十分钟)

适合有自己 VPS 的人。下面这份配置是针对 sing-box 1.14 写的,没有任何已废弃字段,可以直接抄。

在 MT 里:Profiles → + → Type 选 Local → 保存后点进去 → Edit Content,把下面的内容粘贴进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
{
"log": {
"level": "info",
"timestamp": true
},
"dns": {
"servers": [
{
"type": "udp",
"tag": "dns-cn",
"server": "223.5.5.5"
},
{
"type": "https",
"tag": "dns-proxy",
"server": "1.1.1.1",
"detour": "proxy"
}
],
"rules": [
{
"rule_set": "geosite-cn",
"action": "route",
"server": "dns-cn"
}
],
"final": "dns-proxy",
"strategy": "prefer_ipv4"
},
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"address": ["172.19.0.1/30"],
"auto_route": true,
"strict_route": true
}
],
"outbounds": [
{
"type": "vless",
"tag": "proxy",
"server": "你的服务器IP或域名",
"server_port": 443,
"uuid": "你的UUID",
"flow": "xtls-rprx-vision",
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "你的公钥",
"short_id": "你的shortId"
}
}
},
{
"type": "direct",
"tag": "direct"
}
],
"route": {
"rules": [
{
"action": "sniff"
},
{
"protocol": "dns",
"action": "hijack-dns"
},
{
"ip_is_private": true,
"outbound": "direct"
},
{
"rule_set": ["geosite-cn", "geoip-cn"],
"outbound": "direct"
}
],
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "proxy"
},
{
"tag": "geoip-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
"download_detour": "proxy"
}
],
"final": "proxy",
"auto_detect_interface": true,
"default_domain_resolver": "dns-cn"
},
"experimental": {
"cache_file": {
"enabled": true
}
}
}

你需要替换的只有五个地方

全在 outbounds 第一段里:

字段 填什么 从哪来
server VPS 的 IP 或域名 你自己知道
uuid 客户端 UUID 服务端配置里的 clients[].id
server_name Reality 伪装的域名 服务端 serverNames 里的那个,必须一致
public_key Reality 公钥 生成密钥对时输出的 Public key
short_id Reality shortId 服务端 shortIds 里的一个,可以是空字符串

server_port 如果不是 443 也改一下。其他一个字都不用动。

每一段在干什么(看懂了以后自己改)

log:日志级别。排错时改成 debug,平时 info 就够。

dns:两个 DNS 服务器。国内域名走阿里 DNS 直连,其他走 Cloudflare 的 DoH,并且通过代理去查(detour: proxy),防止 DNS 污染。rules 那一条的意思是:命中国内域名列表的,用国内 DNS。

inbounds:TUN 模式,iOS 上只能这么接管流量。auto_route 自动接管全部流量,strict_route 堵住绕过 VPN 的漏网之鱼。

outbounds:两个出口。proxy 是你的 VLESS+Reality 节点,direct 是直连。这就是分流的”两条腿”。

route.rules:分流规则,从上往下匹配:

  1. sniff:嗅探流量里的域名,不然只看得到 IP,规则没法按域名匹配
  2. hijack-dns:把系统的 DNS 请求劫持到 sing-box 自己的 DNS 模块,交给上面 dns 那段处理
  3. 局域网 IP 直连
  4. 国内域名 + 国内 IP 直连
  5. 剩下的全部走 final: proxy

route.rule_set:上面用到的两个规则集从哪下载。download_detour: proxy 是因为 GitHub 直连不稳,下载规则集本身也走代理。

experimental.cache_file:把下载好的规则集缓存到本地,不用每次启动都下。

想加第二个节点?

在 outbounds 里再加一段 vless(或者 hysteria2、随便什么),tag 起个不一样的名字,然后加一个策略组:

1
2
3
4
5
{
"type": "selector",
"tag": "proxy",
"outbounds": ["节点A", "节点B"]
}

把原来那个 vless 的 tag 从 proxy 改成 节点A,新节点叫 节点B。这样 proxy 变成一个可以在 Dashboard 里手动切换的选择器。想自动测速选最快的,把 selector 换成 urltest 即可。

小白必踩的坑,我先替你踩了

1. 多了一个逗号 / 少了一个引号 JSON 最后一项后面不能有逗号。MT 的编辑器现在会标红,看到红色先检查这个。

2. 从网上抄的老配置启动报 legacy / deprecated 1.14 内核把 1.12 之前废弃的老格式全删了。典型的:dns.servers 用 address 字段、outbounds 里有 type: block 或 type: dns、tun 用 inet4_address。看到这类报错,别修,直接换本文这份。

3. 规则集别堆太多 iOS 给 VPN 扩展的内存上限很紧(几十 MB 级别)。有人把 geosite 全家桶几十个规则集全塞进去,一启动就被系统杀。日常两三个够用,按需加。

4. Reality 的 server_name 和服务端不一致 最常见的连不上原因。客户端填的 server_name 必须是服务端 serverNames 列表里的其中一个,一个字母都不能差。

5. 开了代理 App Store 变慢 苹果的 CDN 有时走代理反而慢。加一条规则:

1
2
3
4
{
"rule_set": "geosite-apple",
"outbound": "direct"
}

对应的 rule_set 地址把 geosite-cn.srs 换成 geosite-apple.srs 即可。

6. 装错 App 再说一遍:sing-box MT,开发者 Metamerism LLC。不是 VT,不是任何带”Pro””Plus””VPN”后缀的东西。

最后

sing-box 这个项目最迷人的地方,是它把”代理”这件事从一个个封闭的 App 里拆出来,变成一份可以随身携带的、明明白白的配置文件。你不再是某个软件的用户,你是自己网络的管理员。

这个理念以前在 iOS 上有一道门槛:App 更不了,内核老了,配置写好了也没地方跑。今天这道门槛没了。

免费的,开源的,内核最新的,全平台一份配置。去装吧,装完把这篇文章的 JSON 抄进去,十分钟以后你就再也不想付那 $2.99 了。