兔洞博客
兔洞博客
个人博客

Surge 5 使用教程:iOS 开发者的网络工具箱,代理链玩法详解

软件介绍

Surge 5

iOS/macOS 高级网络工具箱,官方定位为面向开发者的网络代理工具,免费下载+内购解锁完整功能

Surge 是 iOS 和 macOS 上的高级网络工具箱,官方 App Store 描述对自己的定位原文是 “advanced network toolbox and proxy utility, designed for developers”(为开发者设计的高级网络工具箱与代理工具)。它和 Shadowrocket、Loon、Quantumult X 的最大区别在定位:官方把接管流量、处理请求响应、转发到代理、拦截记录四件事一起做,再叠加一套纯文本的 Profile 配置体系和 JavaScript 脚本系统。同站另有 Shadowrocket 使用教程Loon 使用教程Quantumult X 使用教程 可对照看。

Surge 的开发者是 Surge Networks Inc.,最早一批做 iOS 代理工具的团队,Snell 协议就是他们自家发明的。商业模式上有个值得注意的转变:Surge 4 是 $49.99 买断制(旧版定价),到了 Surge 5 改成免费下载 + 内购解锁完整功能,下载门槛一下子没了,完整能力仍然要付费解锁。

四大能力(先记个印象)

官方 App Store 描述把 Surge 5 的能力概括为四个词:Takeover、Processing、Forwarding、Intercept——翻译过来就是接管流量、处理请求响应、转发到代理、拦截记录。这四件事是 Surge 的主线:先想办法把设备的流量收进来(系统代理、本地代理端口、虚拟网卡三种方式),请求过一遍规则决定去向(直连、拒绝或走代理),需要时还能改写请求响应、记录查看流量。先用着,后面每个环节都会在对应章节展开——现在只需要知道 Surge 不是"导入订阅就完事"的客户端,它默认把整条链路都做了。

官方 App Store 描述还列了一长串能力清单,除了上面四条主线,还包括:TrustTunnel、SSH、AnyTLS 等小众协议手动/URL 测试/回退/负载均衡/Smart 自学习策略组规则集与脚本WireGuard 与 Tailscale 客户端Ponte 组网、远程 Dashboard、Safari 扩展。这份清单基本就是 Surge 5 的功能地图,教程后面的章节会按"先基础后进阶"的顺序逐块展开。

优点和缺点

优点缺点
功能覆盖广:接管/处理/转发/拦截一条龙,协议清单在几款 iOS 客户端里排在前列上手门槛最高:配置体系、规则、脚本、DNS 都要学,新用户容易懵
代理链玩法完整:官方提供 underlying-proxy 参数,UI 里叫 Through Another Proxy,是几款 iOS 客户端里支持最完整的官方资料英文为主:界面跟随系统语言(中文系统显示中文),但官方手册和社区资料以英文为主
Mac 和 iOS 同一套引擎:同一份 Profile 两边共用,平台专属参数会被忽略内购模式:免费下载但完整功能要内购解锁,具体价格要看 App Store 当前显示
配置体系完整:Profile 纯文本可版本管理,支持模块、分离配置、托管配置生态要自己淘:社区配置和模块分散在 GitHub,没有官方应用商店

下载安装

Surge 5 在 App Store 免费下载,完整功能通过内购解锁(具体价格请查看 App Store 当前显示)。搜索时认准 Surge 5 和开发者 Surge Networks Inc.,App Store 上有同名系列的多款应用,别下错。

项目信息
价格免费下载,内购解锁完整功能(价格查看 App Store 当前显示)
版本v5.21.1,2026-08-11 更新
开发者Surge Networks Inc.
支持平台iOS + macOS(Surge tvOS 随 iOS 版提供,行为基本一致)
下载地址美区 App Store:Surge 5

第一次开启代理时,系统会弹出允许添加 VPN 配置的授权提示,输入密码确认即可。这个 VPN 配置是 Surge 创建的 VIF 虚拟网卡,用来接管本机流量,不是把流量发到某个远程服务器。

Mac 版和 iOS 版共用同一套引擎和 Profile 格式(官方手册说明),配置可以两边互导;Mac 端入口和购买方式看 Mac App Store 页面。iOS 版还顺带覆盖 Apple TV 的 tvOS 版(随 iOS 版提供,部分 iOS 功能适用于 tvOS),Profile 语法大体共用,平台专属参数按平台区分,本文不展开 tvOS 操作。

首次使用建议按这个顺序走:加载一份 Profile → 检查 [General] 里的 DNS 和日志设置 → 导入订阅 → 建策略组 → 开启代理。官方手册里 [General] 段每个选项的解释都能在 App 内查到:Mac 上是 Main Window Menu(主窗口菜单)→ Help(帮助)→ Profile Syntax(配置语法),iOS 上是 More Tab(更多标签)→ HelpProfile Syntax,写配置时随时回来查,不用记参数。

Surge 的界面跟随系统语言(中文系统下显示中文),但配置段名、参数名这些核心概念是英文的(比如 Policy GroupThrough Another Proxyunderlying-proxy)。教程里对这类英文概念都写了中文注释,照着找入口即可。

⚠️ 免费版和完整功能
免费下载不等于免费使用:Surge 5 的完整功能通过内购解锁(免费版与解锁范围的具体边界,看 App Store 内购页面当前显示),价格请查看 App Store 当前显示。网上流传的"Surge 免费版全功能"说法不可信,别去装非官方渠道的所谓破解版,代理工具要处理你全部流量,来源不明的版本风险太高。

使用教程

官方手册说明,Surge 由一个纯文本 Profile 控制:它描述流量怎么接管、请求怎么匹配、走哪个出站策略。入门只需要理解四个段:[General](全局设置)、[Proxy](代理策略)、[Proxy Group](策略组)、[Rule](分流规则)。

Surge 配置文件(Aegis_CN.conf,中文注释)

图注:社区配置 Aegis_CN.conf(图源:YouTube 中文教程「零基础 Surge 教程·macOS」视频画面):策略组和规则都是中文注释,节点带国旗图标,规则引用远程列表

除这四个段之外,官方手册的格式章节还列了这些可选段:[Host](本地 DNS 映射)、[MITM](HTTPS 解密)、[Header Rewrite] / [URL Rewrite] / [Body Rewrite] / [Map Local](重写与模拟)、[Script](脚本)、[Ponte](组网)、[Port Forwarding](端口转发)、[Testing](吞吐测试)、[DHCP](Mac 网关 DHCP)、[Snell Server] / [MTProto](内置服务)、[WireGuard <name>] / [Tailscale <name>] / [Ruleset <name>](对应策略与内联规则集)。写配置时先想清楚要做什么,再决定用哪个段。

Profile 的基础语法只需要记三件事:注释#;// 开头;分离配置段#!include 把某个段拆到另一个文件(比如 Mac 和 iOS 共用一套 [Proxy][Proxy Group][Rule],各自维护 [General]);模块(Module)是 .sgmodule 补丁文件,以覆盖的方式修改 Profile 的一部分,可以独立开关。行级限制用 #!REQUIREMENT 声明,官方给了简化写法 #!IOS-ONLY#!MACOS-ONLY#!TVOS-ONLY——一行配置只在指定平台生效。这些进阶玩法后面"配置生态"一节还会展开,第一次用先跳过。

两种上手方式

机场用户只需要三步,全程不碰配置文件:复制订阅链接 → 按下面「订阅导入」导入 → 打开主开关(见「开启代理」)。代理就跑起来了。

方式一:导入现成配置(官方 quick-start 路线)
官方 quick-start 推荐的起步方式是加载一份现成 Profile:从社区仓库拿一份维护中的 Surge 配置(后面配置生态一节会列来源),在 App 里加载,然后改三样东西——订阅、策略组、规则。加载后启动 Surge,在流量列表或 Dashboard 里确认请求被接管和匹配,就完成了。这条路不碰配置文件,适合第一次用 Surge 的人。
方式二:从空配置开始(学配置体系)
官方 quick-start 也给了最小 Profile 骨架,四个段各写几行就能跑。自己从零搭的步骤:[General] 的 DNS 和测试参数 → 写 [Proxy] 的节点 → 建 [Proxy Group] 策略组 → 写 [Rule] 分流 → 加载并启动。好处是每一行都知道在干什么,后面进阶改配置不慌。官方手册明确说规则列表必须用 FINAL 规则收尾,[Rule] 从上到下匹配、命中即停。

订阅导入(Profile 配置导入)

一键导入最省事:大部分机场的后台都有「Surge 一键导入」按钮(本质是 surge:///install-config?url=订阅地址 这个官方 URL Scheme,官方手册有列),点击后自动打开 Surge 并导入订阅,跟着提示走就行。手动导入也支持:Profile 页 → 策略编辑器 → 添加外部资源,填订阅 URL。

机场订阅大多是通用格式,Surge 直接能读;个别不兼容时,订阅转换解决——用 Sub-Store 或在线订阅转换站把订阅转成 Surge 的 Profile 格式,再把转换后的链接导入。

想弄明白背后原理的再看下面:机场订阅导入的实质,是把订阅里的节点变成 [Proxy] 段里的策略。官方 quick-start 展示的最小 Profile 直接在 [Proxy] 里写节点,但日常用策略组的 policy-path 参数更省事:官方手册说明,策略组可以从外部文件或 URL 导入成员,远程资源会缓存到本地并定期重新下载。

单条节点也可以手动添加:官方手册的协议页给了每种协议的声明语法,比如 Proxy-Snell = snell, 1.2.3.4, 8000, psk=password, version=4。自己有一台 VPS 想加个入口或出口节点时,直接在 Profile 的 [Proxy] 段写一行即可,App 的策略编辑器也支持图形化添加

最小可用 Profile 示例(官方 quick-start 骨架)

以下示例里的 example.com 等域名都是占位地址,配置时替换成你自己的。

[General]
dns-server = system, 1.1.1.1, 8.8.8.8

[Proxy]
ProxyA = https, proxy.example.com, 443, username, password

[Proxy Group]
Proxy = select, ProxyA, DIRECT

[Rule]
DOMAIN-SUFFIX,example.com,Proxy
GEOIP,CN,DIRECT
FINAL,Proxy

官方手册的解读:[General] 里写全局选项,这个例子并发查询系统 DNS 和两台公共 DNS;[Proxy] 定义出站策略,ProxyA 把流量转发给一台 HTTPS 代理服务器;[Proxy Group] 里的 select 组可以在 App 界面手动切换 ProxyADIRECT[Rule] 从上到下匹配,example.com 及其子域走代理组,中国 GeoIP 直连,剩下的交给 FINAL

订阅节点批量导入不用手动写配置:App 的策略编辑器里图形化添加订阅(填订阅 URL 和更新间隔)就行,细节交给 Surge 自动处理。想了解参数含义的看进阶篇的订阅导入完整示例。

订阅导入完整示例(过滤 + 统一改参数)
[Proxy Group]
MyNodes = url-test, policy-path=https://example.com/sub, update-interval=43200, policy-regex-filter="HK|TW|JP", external-policy-modifier="test-url=http://www.gstatic.com/generate_204,tfo=true"

[Rule]
DOMAIN-SUFFIX,google.com,MyNodes
FINAL,MyNodes

这行配置做了四件事:从订阅 URL 导入节点、12 小时更新一次、只保留名字带 HK/TW/JP 的节点、给所有导入节点统一换测试地址并开 TFO。policy-regex-filterexternal-policy-modifier 都只作用于外部导入的成员,不影响显式列出的成员;想覆盖全部来源的成员(包括显式列出的),用策略组级 underlying-proxy 那套组合。

🛠 不想折腾?直接用现成的
规则库:自己不想写规则,社区有现成规则库直接导入——比如 blackmatrix7 的 ios_rule_script,几万个 App 的分流规则按应用分好,填导入链接就能用,还会自动更新。 订阅转换:机场订阅格式不兼容?用订阅转换工具(Sub-Store 或在线订阅转换站)把订阅转成你客户端的格式,再导入即可。

开启代理

Surge Mac 菜单栏控制面板(中文)

图注:Surge Mac 菜单栏下拉控制面板(图源:YouTube 中文教程「零基础 Surge 教程·macOS」视频画面):显示主窗口、出站模式、设置为系统代理、增强模式,节点分组按服务切换

配置加载后,开代理就是开关 + 模式 + 节点三件事:

  • 开关:首页主开关打开,系统弹 VPN 授权,确认后流量开始走 Surge。
  • 出站模式:官方手册说明有三种——Rule-Based(规则分流)、Direct(全部直连)、Global Proxy(全部走全局策略)。切到 Direct 或 Global 时规则列表整体失效,FINAL 只在 Rule-Based 模式下生效。
  • 节点切换select 策略组在界面点选节点;自动组临时覆盖的入口在 Mac 菜单和 iOS 策略组视图(长按)。

日常使用里,Rule-Based 是默认模式,规则把该走的走代理、该直连的直连;临时想确认"是不是节点问题",切到 Direct 对比一下;想全程走一个固定节点,用 Global Proxy 再选全局策略。三种模式的分工,官方手册在规则章节和 FINAL 规则页都有说明。

开启后建议顺手看两个地方:Dashboard 的请求列表确认流量真的在走 Surge(官方 quick-start 的做法),以及策略组的测速结果是不是符合预期。测速是 HEAD 请求到测试 URL 的耗时,反映连通性,实际带宽要看下载体验。

策略组

策略组把多个策略装进一个名字,规则只引用组名,切换节点不用动规则。官方手册策略组章节列了六种类型:select(手动选择)、url-test(按延迟自动选)、fallback(按声明优先级选第一个可用)、load-balance(负载均衡分发)、smart(自学习)、subnet(按当前网络选),旧关键字 ssid 仍作为 subnet 的别名兼容。组里可以套组(嵌套),但 smart 组会静默忽略嵌套组和内置策略成员。

自动组(url-test、fallback、load-balance、smart)靠延迟测试工作:Surge 通过每个成员策略向测试 URL 发一次 HTTP HEAD 请求记录结果,测试是懒触发的——结果过期(超过 interval 参数设定的有效期)或网络变化时才重测,也可以手动触发一轮全量测试。测试 URL 的优先级是:策略自己的 test-url 参数 → [General] 里的全局 proxy-test-url(默认 http://bing.com/)。

嵌套组在测试时会贡献自己的有效结果:嵌套的 select 组按当前选中策略测,其他嵌套组按整个成员集合测。官方手册还提醒一个坑——组引用不能成环:如果 A 组包含 B 组、B 组又包含 A 组,Surge 会记日志警告,受影响的组暂时表现为拒绝策略(日志里显示 FAILED);组里一个可用成员都没有时,回落到 DIRECT(日志里显示 SUBSTITUTE)。

策略组还有几个实用参数:no-alert(切换节点不弹通知)、hidden(菜单和选择视图里不显示这个组)、icon-url(Mac 6.5.0+,给组配图标,需要手工改 Profile)。subnet 组按当前网络选策略,[SSID Setting] 段可以给特定 Wi-Fi 写覆盖参数,比如家里 Wi-Fi 用一套 DNS、公司 Wi-Fi 换一套。

测速参数按成员逐个解析:策略自己的 test-url 优先,否则用 [General] 的全局值(proxy-test-url 给代理策略、internet-test-url 给直连类策略,默认都是 http://bing.com/);超时也是先看策略的 test-timeout,再看全局,最后落到默认值(代理策略 5 秒、直连类 10 秒)。url-testfallback 组还有个 timeout 参数,用来按延迟测试结果过滤候选节点,和单个请求的超时不是一回事,别混。

自动组换最优节点时会发通知,官方手册说明只有 url-testfallback 会发"组有新的最优选项"通知,load-balancesmartselect 永远不会发——不想被打扰的组加 no-alert 即可。

策略组配置示例
[Proxy Group]
Proxy = select, ProxyA, ProxyB, DIRECT
Auto = url-test, policy-path=https://example.com/nodes, underlying-proxy=Relay
Smart = smart, ProxyA, ProxyB, policy-priority="Premium:0.9;Backup:1.3"

select 组在界面手动选;url-test 组自动选延迟最低的;smart 组的 policy-priority 是得分倍率,小于 1 提高偏好、大于 1 降低偏好。手动选了某个节点后,自动组会进入临时覆盖状态:Mac 上在菜单里操作,iOS 上在策略组视图长按对应策略呼出覆盖选项。

Smart 组是 Surge 独有的自学习组(iOS 5.11.0+ / Mac 5.7.0+):给每个成员维护一个持续更新的延迟得分,分数由真实连接的首字节延迟移动平均丢包惩罚(约每 1% 丢包加 50ms)构成,还会按站点记忆哪个策略最近成功或失败——某个站点最近失败的策略会被降权,记忆约一小时后过期。它固定每 5 分钟重测一轮成员(interval 参数对 Smart 组无效);成员超过 12 个时,普通轮次只测试一部分——最常用的策略加最久没测的,手动触发的测试才是全量。连接失败会自动换下一个候选。想省心、不想手动挑节点的用户,把自动组换成 smart 就行。

分流规则

官方手册的规则系统总览:每条规则由类型、匹配值、策略三部分组成,[Rule] 段从上到下求值,第一条命中的规则生效,后面全部忽略,所以官方建议从最具体排到最一般。规则列表必须以 FINAL 收尾,FINAL 是没有匹配值时兜底用的默认策略。

规则类型速查(官方手册规则系列)
  • 域名规则DOMAIN(精确域名)、DOMAIN-SUFFIX(域名后缀)、DOMAIN-KEYWORD(关键字)、DOMAIN-WILDCARD(通配符)。域名规则不触发 DNS 查询,官方建议放在 IP 规则前面。
  • IP 规则IP-CIDRIP-CIDR6(网段)、GEOIP(地理)、IP-ASN(自治域)。请求目标是域名时,遇到第一条 IP 规则会暂停求值做 DNS 查询,no-resolve 参数可以跳过未解析的域名请求。
  • HTTP 规则USER-AGENT(按浏览器标识匹配)、URL-REGEX(按请求 URL 正则匹配),只对 HTTP 引擎处理的请求生效。
  • 进程规则PROCESS-NAME 按发起请求的进程匹配,Mac 专属,iOS 会忽略这类规则。
  • 来源与端口规则SRC-IP(来源 IP)、DEST-PORT / SRC-PORT(目标/来源端口)、DEVICE-NAME(设备名,Ponte 场景用)、MAC-ADDRESS(MAC 地址,Mac 专属)。
  • 协议与网络规则PROTOCOL(按协议匹配,如 PROTOCOL,DOH 匹配 DNS over HTTPS 连接)、SUBNET(按当前 Wi-Fi/有线网络匹配,如 SUBNET,SSID:MyHome,DIRECT)。
  • 逻辑规则ANDORNOT 组合多个子规则,表达"这个域名且来自这个客户端"这类条件。
  • 脚本规则SCRIPT 把匹配决策交给 [Script]type=rule 的脚本。
  • 规则集RULE-SET 引用整包规则(内置、文件或 URL),RULE-SET,https://example.com/streaming.list,Proxy 这种写法可以把长规则列表移出主配置。
  • 兜底FINAL 定义未匹配请求的默认策略,官方要求放在规则列表最后。

规则求值还有两个旁路:带 pre-matching 标记且策略为 REJECT 家族的规则,会在 DNS 查询和 TCP 握手阶段提前求值,用最小开销拒绝广告域名;出站模式切到 Direct 或 Global 时,整个规则列表都不参与。

规则和 DNS 的配合是 Surge 规则的进阶点,官方手册说明:域名类规则只看请求的 hostname,永远不触发 DNS 查询;IP 类规则匹配解析后的 IP——请求目标是域名时,求值在第一条 IP 规则处暂停做一次 DNS 查询(结果有缓存,每个请求最多查一次),带 no-resolve 参数的 IP 规则对未解析的域名请求直接跳过。DNS 查询失败时,规则求值中断、请求报 DNS 错误,除非 FINAL 规则带了 dns-failed 参数,这种情况会改用 FINAL 的策略。extended-matching 参数让域名规则同时匹配 TLS SNI 和 HTTP Host 头,处理那些 URL 和 SNI 不一致的请求。

Surge Mac 中文界面:最近请求列表与新建规则弹窗

图注:Surge 中文界面(图源:YouTube 中文教程「零基础 Surge 教程·macOS」视频画面):左侧是最近请求列表(每行显示命中策略),前景是"新建标准规则"弹窗——规则类型选 DOMAIN-SUFFIX、填 example.com、动作选 DIRECT(直连)

完整规则示例(官方规则总览骨架)
[Rule]
DOMAIN-SUFFIX,company.com,ProxyA
DOMAIN-KEYWORD,google,DIRECT
GEOIP,US,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT
DOMAIN,ad.example.com,REJECT,pre-matching
RULE-SET,https://example.com/streaming.list,Proxy
FINAL,ProxyB,dns-failed

对照官方规则总览的例子:域名规则放最前(不触发 DNS),GEOIP 这类 IP 规则随后,内网网段直连,广告域名用 pre-matching 在握手阶段就拒掉,流媒体规则集单独引用,最后 FINAL 兜底并带上 dns-failed——DNS 解析失败时不再报错中断,直接走 FINAL 策略。

深入配置(进阶篇)

代理链(Underlying Proxy)

代理链是 Surge 的招牌玩法,官方手册的术语是 underlying-proxy 参数官方文档),原文定义是 “Use a proxy to connect to another proxy, aka proxy chain”(用代理去连另一个代理,也就是代理链)。它的拓扑是:client → Entry → Exit → destination(client 是本地客户端,Entry 是入口代理,Exit 是出口代理,destination 是目标网站)——本地先连 Entry,再通过 Entry 连 Exit,最后从 Exit 访问目标。

官方手册给出的最小示例:

代理链完整配置示例
[Proxy]
Entry = https, entry.example.com, 443, username, password
Exit = snell, exit.example.com, 443, psk=pwd, version=5, underlying-proxy=Entry
Relay = snell, relay.example.com, 443, psk=pwd, version=5

[Proxy Group]
Subscription = url-test, policy-path=https://example.com/nodes, underlying-proxy=Relay

上半段是策略级代理链Exit 带上 underlying-proxy=Entry,发给 Exit 的流量全部先过 Entryunderlying-proxy 的值也可以是策略组名,这样入口节点可以动态选。下半段是策略组级代理链Subscription 组(成员来自订阅 URL)整体走 Relay,官方手册明确说这是给整组批量挂代理链的推荐做法——显式列出的成员、policy-path 导入的成员等全部来源都生效,不用逐个节点去改。注意两个例外:成员本身是策略组的不受影响(嵌套组可以自己声明 underlying-proxy),DIRECT、REJECT 这类内置策略原样通过不走链;成员自带 underlying-proxy 时,组级值会覆盖它。

代理链的几个官方注意事项:配置了 underlying 后,目标代理服务器域名的 DNS 解析在远端进行,所以 ip-version 参数不再生效;underlying-proxy 不能和 QUIC 系协议的 port-hopping 参数同时用;策略组级代理链下,每个受影响成员会以 Name (via Relay) 的形式派生出一个带独立测速结果的策略,界面里看到的测速数字反映的是真实链路。

Surge 策略组编辑器 Through Another Proxy 代理链选项

图注:用户实测配置截图——Surge 策略组编辑器里的 **Through Another Proxy**(经另一代理)选项,Include(包含)里选上游节点后,整个策略组的成员都走这条代理链。英文界面为 Surge 原生界面

UI 里这个功能叫 Through Another Proxy(经另一代理),位置在 Policy Group(策略组)的编辑页,官方手册说明策略组级 underlying-proxy 也可以在策略组编辑器里直接配置,用户截图里的 Through Another Proxy 就是它的图形入口(iOS 5.22.0+ / Mac 6.9.0+ 支持)。适合的场景:机场自带节点要先过一台中转机再落地,或者手里有多条家宽节点想串成一条链路(你截图里香港 → 澳门 → 台湾的玩法就是这种,能否用取决于节点协议、UDP 支持和机场配置)。策略组级 underlying-proxy 一行就能给整组配完。

配代理链要注意两个官方提示:别让 underlying 链路绕回自己——如果 underlying 策略最终又选中了当前策略,会形成依赖循环;代理链只影响连接建立,目标站点的实际出口是链路末端的 Exit,所以测速和实际体验都要看整条链路。想给所有节点统一加中转,策略组级 underlying-proxy 是官方推荐的做法;想单独给某个节点加中转,就在那条策略上写 underlying-proxy=xxx

underlying-proxy 的值还可以直接写策略组名——入口节点动态切换:想"入口自己测速选最快的",把值指向一个 url-test 组;想"入口手动选",指向 select 组。官方手册原文说明入口节点可以由策略组动态选择。

重写与 MitM

官方手册的 HTTP 处理章节说明,明文 HTTP 流量默认就进 HTTP 引擎,HTTPS 流量必须先被 MITM 解密才能改写。MITM 的配置在 [MITM] 段:ca-p12 是 base64 编码的 PKCS#12 格式 CA 证书,ca-passphrase 是私钥口令,hostname要解密的域名清单(支持 * 通配符,- 前缀排除,按顺序匹配)。证书生成器在 Mac 版 Dashboard 和 iOS 配置编辑器里,生成后装进系统钥匙串并信任即可。

⚠️ MitM 证书信任
MitM 的机制是让系统信任 Surge 自己生成的 CA 证书,之后 Surge 才能解密 HTTPS。只解密必要域名,别把 hostname 写成 * 全量解密。官方手册专门提醒:部分 App 用证书固定(certificate pinning),解密这些域名会直接断连——客户端完成 TLS 握手但不发请求,就是被证书固定保护了。出问题的域名从 hostname 里删掉即可。
重写与 MitM 配置示例
[MITM]
ca-p12 = MIIJtQ.........
ca-passphrase = password
hostname = *.example.com, -*.apple.com
h2 = true

[Header Rewrite]
http-request ^http://example.com header-add DNT 1
http-request ^http://example.com header-replace-regex User-Agent Safari Chrome

[URL Rewrite]
^http://www\.google\.cn http://www.google.com header

[Body Rewrite]
http-response ^http(s)?://example\.com documents Surge

[Map Local]
^http://surgetest\.com/json data-type=text data="{}" status-code=500

各段的作用:[Header Rewrite] 支持 header-add(追加)、header-del(删除)、header-replace(替换)、header-replace-regex(正则替换);[URL Rewrite] 改请求 URL,三种动作——header(原地改并发给新地址)、302(返回跳转)、reject(直接拒绝);[Body Rewrite] 用正则或 jq 改请求/响应体;[Map Local] 直接在本地拼响应返回,请求根本不会发到上游,数据可以是文件、文本、1px GIF 或 base64。

官方手册关于 Body Rewrite 的边界说明:请求使用 Transfer-Encoding: chunkedExpect: 100-continue 时,请求体重写不被支持,Surge 会记日志并原样转发;修改响应体后 Surge 会自动解压并重新计算 Content-Lengthrequires-body 之类的整包读取选项要按需开,开得越多内存占用越大。

官方手册把 HTTP 处理管线排了个顺序:Header Rewrite → URL Rewrite → Body Rewrite → Script 处理,请求和响应各自只能被一个脚本处理,重写规则没有这个限制,多条命中会按顺序生效。Map Local 在请求路径上单独求值——命中就直接返回本地响应,跳过上游请求。调完重写规则,用 Dashboard 看请求详情里的备注,能确认规则到底命中没有。

MITM 的 hostname 清单还有几个细节:裸域名只匹配 443 端口,example.com:8443 匹配指定端口,example.com:0 匹配所有端口;带 SNI 的 TLS 连接裸域名也能匹配(不限于 443);hostname-disabled 是临时停用某个域名(App 界面停用某项时写回配置的键);client-source-address 可以只对指定客户端启用解密。h2 = true 开 MITM over HTTP/2,能提升并发请求性能;auto-quic-block 默认开启,遇到 QUIC 连接会先拦掉让它回落 HTTP/2,保证流量能被解密。

脚本(Scripting)

官方手册的脚本章节说明,Surge 用 JavaScript 扩展能力,脚本声明在 [Script] 段,共七种类型:http-request(改请求)、http-response(改响应)、rule(自定义规则)、dns(自定义 DNS 解析)、event(响应系统事件)、cron(定时任务)、generic(手动/快捷指令触发)。声明格式是 name = type=...,pattern=...,script-path=...,requires-body=true 这种键值对,script-path 必填,可以是本地路径或 URL,远程脚本会自动下载并缓存(默认每天更新一次)。

[Script]
script1 = type=http-response,pattern=^http://www.example.com/test,script-path=test.js,requires-body=true
script2 = type=cron,cronexp="0 8 * * *",script-path=fired.js
script3 = type=dns,script-path=dns.js

脚本默认超时 5 秒,跑不完会报 timeout 警告;requires-body=true 会把整个请求/响应体读进内存,大响应体可能把 iOS 的 Network Extension 内存顶爆,官方建议 pattern 写窄一点、只对必要 URL 开 body 访问。调试时开 debug 参数,脚本每次运行前重新从磁盘加载,console.log() 的输出会进流量查看器的请求备注。

脚本的常用参数再列几个:max-size 限制读进内存的 body 大小(iOS 默认 1 MB、Mac 默认 10 MB,超限的响应直接跳过脚本走透传);argument 给脚本传一个任意字符串,脚本里用 $argument 读;engine 选脚本引擎,auto 默认优先 WebView(老系统只有 JSC)。cron 脚本的 cronexp 是标准 5 段或带秒的 6 段格式,每小时触发超过 10 次会弹省电警告。event 脚本监听系统事件(比如网络变化),适合做"切网后自动重连"这类自动化。

官方手册还提到 Information Panel(信息面板):iOS 版可以在主视图显示自定义面板,展示流量、时间之类自己定义的内容;面板由 [Panel] 段配置,动态内容可以调用 generic 类型脚本script-name= 参数)渲染,想折腾首页展示可以研究这个。

一个 http-response 脚本示例(官方语法)
[Script]
modify-resp = type=http-response,pattern=^https?://www\.example\.com/test,script-path=test.js,requires-body=true,max-size=16384

声明行的关键参数:type=http-response 在响应到达客户端前处理它;pattern 是匹配请求 URL 的正则;requires-body=true 把响应体完整读进内存交给脚本;max-size 限制 body 上限,超过就跳过脚本走透传。官方手册提醒,每个请求只能跑一个 http-response 脚本,Profile 里排在最前且 pattern 命中的那个生效。

⚠️ 脚本来源要可信
脚本能读写被解密流量的内容,等于把你的流量数据交给脚本作者。只用长期维护、star 多、作者可追溯的仓库,装前把脚本内容读一遍,别用来路不明的"福利脚本"。cron 定时脚本每小时触发超过 10 次会触发省电警告,无意义的轮询脚本不要留。

DNS

Surge 用自己的 DNS 客户端,不依赖系统解析器,官方手册的 DNS 章节说这套实现为性能和可靠性调优,不严格遵守 RFC 解析语义[General] 里两个关键参数:dns-server 配普通 DNS(并发查询、先到先得),encrypted-dns-server 配加密 DNS,支持 DoHhttps://)、DoH3h3://)、DoQquic://)、DoTtls://) 四种加密传输,配置了加密 DNS 后普通 DNS 只用来测连通性和解析加密服务器自己的域名。

加密 DNS 默认总是走 DIRECT 出站、不参与规则匹配;打开 encrypted-dns-follow-outbound-mode 后,加密 DNS 连接会像普通请求一样参与规则匹配,这时可以用 PROTOCOL 规则单独管它:PROTOCOL,DOH 匹配 DoH、PROTOCOL,DOQ 匹配 DoQ、PROTOCOL,DOT 匹配 DoT。想给某个网络单独换 DNS,[SSID Setting] 段里可以覆盖 dns-serverencrypted-dns-serverencrypted-dns-server=off 表示该网络关掉加密 DNS)。

Enhanced Mode 开启后,VIF 会给所有 DNS 查询回假 IP198.18.0.0/15 段),连接打到假 IP 时 Surge 再映射回原域名做规则匹配——这就是 fake-IP 模式,配合规则系统能省掉大量真实 DNS 查询。

[Host] 段再补两个用法:server:system 把解析交给系统(Enhanced 模式下系统解析器可能被绕过,官方给了 server:force-syslib 强制走系统库,专门给 mDNS 这类特殊域名用,普通域名别用);把整个规则集绑到 DNS 映射——DOMAIN-SET:https://example.com/domains.txt = server:https://doh.example.com/dns-query 这种写法,让一批域名的解析统一走指定加密 DNS,不用逐条写。

测试与调试工具

Surge Mac 中文界面:流量日志

图注:Surge 中文界面(图源:YouTube 中文教程「零基础 Surge 教程·macOS」视频画面):最近请求/活动请求/DNS/设备/流量统计五个标签页,每条连接显示客户端进程、命中规则、流量和耗时

Surge 的调试工具比竞品完整,官方手册给了一整套:Dashboard 看请求、查 DNS 缓存、管设备;surge-cli 命令行控制本地或远程实例;HTTP API 程序化控制;Logbook 记录事件;URL Scheme 自动化操作。

吞吐测试用 [Testing]配置(Mac 6.4.4+):download-url / upload-url 指定测速源,download-concurrency / upload-concurrency 控制并发数(默认 4),download-duration-limit 限制单次测速时长。节点延迟测试和吞吐测试是两套机制:前者是策略组的 HEAD 请求,后者才是真正拉流量算带宽。

HTTP API 的配置在 [General] 段:http-api = examplekey@0.0.0.0:6171 开监听,所有请求带 X-Key 头认证,http-api-web-dashboard = true 会在同一端口起网页版控制台。写自动化脚本(比如定时切换节点、抓取流量统计)用的就是这个接口。

Logbook(Mac 6.6.0+)持久记录 Profile 重载、网络切换、崩溃恢复、更新等事件,默认保留最近 7 天,Dashboard 和 surge-cli logbook 都能远程读。URL Scheme 支持 surge:///startsurge:///stop 这类操作,iOS 上还能配合快捷指令做"到公司自动开代理"之类的自动化。

DNS 配置示例
[General]
encrypted-dns-server = https://8.8.8.8/dns-query, quic://dns.adguard-dns.com

[Host]
abc.com = 1.2.3.4
*.dev = 6.7.8.9
foo.com = bar.com
bar.com = server:8.8.8.8
example.com = server:https://cloudflare-dns.com/dns-query

[Host] 段是官方手册的 Local DNS Mapping(本地 DNS 映射),功能比 /etc/hosts 强:可以映射固定 IP、用 *? 通配符、写别名(效果类似 CNAME)、用 server: 给指定域名分配 DNS 服务器、用 script: 交给 DNS 脚本解析。Mac 上 Surge 还会自动读 /etc/hosts,条目排在 Profile 的 [Host] 之后。

一个实用的进阶参数:use-local-host-item-for-proxy = true——默认情况下代理请求带原始域名、DNS 在远端解析,[Host] 映射被跳过;开启后匹配本地映射的目标域名会用映射的 IP 发代理请求。

特色功能

  • WireGuard / Tailscale 客户端:官方手册把 wireguardtailscale 定义为策略类型,把 L3 VPN 隧道变成普通出站策略——只有规则选中的流量进隧道,不装系统级 VPN,也不改全局路由表。WireGuard 策略支持 underlying-proxy,可以让加密的 UDP 数据报再套一层代理。Tailscale 策略(iOS 5.20.0+ / Mac 6.7.0+)加入 tailnet 后还能解析 MagicDNS 域名。
  • Enhanced Mode(增强模式):Mac 上的虚拟网卡开关,官方手册说明有些 App 不遵守系统代理设置(比如 Mail),Enhanced Mode 用 VIF 接管它们的原始流量。VIF 只能处理 TCP、UDP、ICMP,ICMP 不能代理(Surge 直接应答,ping 照常工作)。
  • Remote Dashboard(远程调试):Mac 版内置 Surge Dashboard,配置 external-controller-access = password@ip:port 后可以远程连另一台 Mac 或 iOS 设备。官方手册说明 iOS 上 127.0.0.1 只允许 USB 连接,0.0.0.0 才允许局域网 Wi-Fi 连接,蜂窝网络进来的连接一律拒绝
  • Surge Ponte(远程访问家庭网络):把多台 Surge 设备组网,实现"人不在家也能访问家里网络"。设备用 iCloud 自动注册,每台设备以 <设备名>.sgponte 互相可达,规则里可以用 DEVICE:<name> 策略把流量导向另一台设备;只有 Mac 能当 Ponte 服务器(家庭网络的接入点),iOS 只能当客户端。
  • Snell 协议Surge 团队自家设计的加密代理协议,官方手册说明支持 v1–v6,Mac 版还内置 Snell Server[Snell Server] 段)可以对外提供 Snell 接入。
  • Gateway 模式(Mac 专属):Mac 作为 L3 网关接管局域网其他设备(游戏机、电视)的流量,还能兼做 DHCP 服务器,配合 DEVICE-NAMESRC-IPMAC-ADDRESS 规则做按设备分流。
  • MTProto 与端口转发:官方手册还有 MTProto 代理服务[MTProto] 段,给 Telegram 客户端用)和 端口转发[Port Forwarding] 段),Mac 网关模式下还能开 DHCP 服务[DHCP] 段)。这些是给自建服务场景准备的,普通用户用不到。
  • iCloud 集成:Ponte 的设备注册、密钥和端口状态都存 iCloud;Mac 与 iOS 共用同一套 Profile 语法,跨设备维护时官方推荐用 #!include[Proxy][Proxy Group][Rule] 拆成共享文件,平台差异的 [General] 各写各的。
  • Safari 扩展:App Store 描述里列出的 iOS 集成功能,把 Surge 的拦截能力延伸到 Safari 场景。

配置生态

Surge 的进阶玩法绕不开社区配置。官方手册说明 Profile 支持 #!include 分离配置段(多文件拆分享段)和 Module 模块.sgmodule 文件,以补丁方式覆盖 Profile 的一部分,可以独立开关)。模块是 Surge 生态最常见的分发格式:

模块有三种来源:内置模块(Surge 自带)、本地模块(Profile 目录里的 .sgmodule 文件)、在线安装模块(填 URL 安装)。官方手册说明模块能改 [General][MITM]、规则等段,但不能碰 [Proxy][Proxy Group],也不能改 MitM 的 CA 证书;规则行只能插到规则列表顶部,且限于内置策略(DIRECT、REJECT 这类)——所以社区模块基本都做去广告、DNS、重写这类事,做不了节点管理。模块覆盖 Profile 的值用 key = value,追加用 key = %APPEND% value,插到最前用 key = %INSERT% value

  • Sub-Store:同站有 Sub-Store 使用教程,它的目标格式列表里有 Surge 和 Surge Mac,还有把 Sub-Store 本身装进 Surge 的 iOS 模块方案.sgmodule),订阅转换、合并、过滤都在手机上完成。
  • blackmatrix7/ios_rule_script:社区大型规则仓库,提供分流规则、重写规则和脚本,规则集按客户端格式分发,Surge 用 RULE-SET 引用对应格式的链接即可。
  • 社区模块:国内社区流行的"毒奶"系列去广告等玩法也以 .sgmodule 模块分发,装上后在模块列表里独立开关;模块改不了节点段,适合纯加规则和重写。

模块生态的纪律:一个模块只干一件事,装多了互相覆盖反而难排查;.sgmodule 本质是文本,导入前用文本编辑器打开看一眼内容再装。

常见问题

免费版和完整功能有什么区别? Surge 5 免费下载,完整功能通过内购解锁(免费版与解锁范围的具体边界、价格,看 App Store 内购页面当前显示)。免费下载可以先用基础代理功能评估适不适合自己。

值得买吗? 看用途。只想要稳定的基础代理,Shadowrocket 更便宜更省心;常折腾去广告、重写、脚本、代理链、多设备远程调试,Surge 的综合能力在几款 iOS 客户端里排前列(个人判断)。上手成本也最高,先拿免费版跑两周再决定。

和 Shadowrocket / Loon / Quantumult X 怎么选? Shadowrocket 最便宜、开箱即用;Loon 插件系统有特色;Quantumult X 配置文件玩法上限高;Surge 综合能力最全且只有它有策略组级代理链和 Smart 自学习组。对比与取舍一节有完整表格。

代理链怎么配? 官方术语是 underlying-proxy 参数,UI 里叫 Through Another Proxy:在 Policy Group(策略组)编辑页勾选 Through Another Proxy、在 Include 里选上游节点,整个组的成员都先连上游再连目标(iOS 5.22.0+ / Mac 6.9.0+ 支持)。配置文件里写 Exit = snell, exit.example.com, 443, psk=pwd, version=5, underlying-proxy=Entry 即可。

Snell 是什么? Surge 团队自己设计的加密代理协议,官方手册说明支持 v1–v6,主打精简和高性能;Mac 版内置 Snell Server 可以对外提供接入。机场或自建节点用它,配合 Surge 是原生态配原生态。

Surge Ponte 是什么? 官方手册的定位是把多台 Surge 设备连成设备间网络,人在外面也能访问家里网络。设备用 iCloud 注册互认,主机名是 <设备名>.sgponte,只有 Mac 能当服务器。

界面是英文的吗? Surge 界面跟随系统语言——中文系统下显示中文(出站模式、DNS、策略组这些菜单都是中文)。真正全英文的是官方手册和社区资料,以及配置段名、参数名这些概念(underlying-proxyPolicy Group 等),本教程对这些英文概念都写了中文注释,对照操作即可。

支持 Clash 配置吗? 官方手册没有 Clash 配置导入的说明,Surge 用自己格式的 Profile。社区通用做法是先用 Sub-Store 把 Clash 订阅转换成 Surge 格式(?target=Surge),再把转换后的链接填进策略组的 policy-path

Mac 和 iOS 的配置能共用吗? 官方手册说明两端是同一套引擎和 Profile 格式,平台专属的键会被直接忽略,所以一份配置可以两边共用;想精细控制,用 #!MACOS-ONLY#!IOS-ONLY 这样的行级限制,或 #!include 拆分共享段。

Smart 组和 url-test 组有什么区别? url-test 靠周期性延迟测试选节点,Smart 组基于真实连接质量打分,还会按站点记忆成败、失败自动换下一个。官方手册说明 Smart 组固定每 5 分钟重测,interval 参数对它无效。

MitM 之后有些 App 打不开? 证书固定(certificate pinning)的 App 只认自己预置的证书,官方手册说明解密这类域名会直接断连。把出问题的域名从 [MITM]hostname 里删掉,或先确认证书已安装并完整信任。

代理链上测速数字准吗? 官方手册说明策略组级代理链下,每个成员以 Name (via Relay) 派生,测速结果是真实链路(含中间节点)的延迟,不是单段延迟;underlying-proxy 配置后目标节点域名在远端解析,本地 ip-version 参数不生效。

免费版会不会偷偷限速? 官方没有"免费版限速"的说法,限制在功能边界上——完整功能要内购解锁。限速与否取决于你用的节点,和客户端无关。

下载安装要注意什么? 认准 Surge 5 和开发者 Surge Networks Inc.,App Store 上同名系列应用很多;第一次开代理的 VPN 授权提示是创建本地虚拟网卡,不是连远程服务器。

出站模式三选一怎么选? 日常用 Rule-Based;排查"是不是节点问题"切 Direct 对比;想全程走一个固定节点用 Global Proxy。切出 Rule-Based 后规则列表整体不参与,FINAL 只在 Rule-Based 模式下生效(官方手册说明)。

订阅多久更新一次? 由策略组的 update-interval 控制,默认 86400 秒(每天一次);远程 policy-path 资源缓存到本地、按周期重下。机场节点变动频繁的话可以改成 43200(12 小时)或更短。

信息面板和 MTProto 是干什么的? Information Panel 是 iOS 版主视图的自定义信息面板,由 generic 脚本驱动;MTProto 是 Surge 内置的 MTProto 代理服务([MTProto] 段),给 Telegram 客户端直连用的。都是进阶功能,普通代理用户不需要碰。

代理链会不会拖慢速度? 会。链路每多一跳,就多一次握手和转发延迟,代理链的测速数字和实际体验都要看整条链路。想确认值不值,用两跳前后的测速对比一下;串链玩法的乐趣在落地 IP 和网络质量,不在速度。

代理链的入口和出口必须同一家机场吗? 不需要。underlying-proxy 的值是策略或策略组名,入口和出口各自独立,可以来自不同订阅;官方手册说明策略组级代理链对从订阅导入的成员同样生效,所以"机场 A 的节点经机场 B 的节点落地"这种混搭也能配。

为什么节点列表是空的? 官方手册说明 policy-path 导入时无效行会被记录并跳过、名字重复的策略会被跳过并警告——订阅格式不对、或者链接返回的不是 Surge 可解析的内容,都会导致列表空。先单独测订阅链接能不能直接打开,再看 Profile 加载时的警告日志。

Gateway 模式适合谁? Mac 专属的 L3 网关模式,给游戏机、电视这类跑不了 Surge 的设备用:把设备的网关和 DNS 指向跑 Surge 的 Mac,流量就走同一套规则和策略管线(官方手册说明)。想按设备分流,配合 DEVICE-NAMESRC-IPMAC-ADDRESS 规则。

Smart 组会自己换节点吗? 会,但方式是"失败自动换"而不是频繁跳动:官方手册说明 Smart 组给每个成员维护实时延迟得分和站点记忆,选中的策略挂了会自动试下一个候选,面板显示的当前选择是近期最常用的策略,每条新连接实际走哪个按实时得分定

Ponte 需要公网 IP 吗? 不需要。官方手册说明 Ponte 连接会根据网络情况自动选通道:Direct Access(直连)、NAT Traversal(NAT 穿透)、Proxy NAT Traversal(代理穿透)、LAN Only(仅局域网)、IPv6,穿透不了的场景走代理通道。配置用 App 里的引导向导,大部分状态存 iCloud,Profile 里只留引用代理策略的两行参数。

免费版下载后先做什么? 先别急着内购:加载一份社区 Profile → 导入订阅 → 开代理跑两天,确认 Surge 的接管方式和界面你能接受,再决定要不要解锁完整功能。基础代理流程走得顺,再谈策略组、重写、脚本这些进阶玩法。

Surge 4 用户要不要升 5? Surge 4 是旧版($49.99 买断),Surge 5 是当前版本(免费下载 + 内购解锁),官方 App Store 描述和官方手册讲的功能都跟着 5 走。旧版用户直接在 App Store 下载 Surge 5 用免费版体验,需要完整功能再走内购。

为什么手册里功能都标了版本号? 官方手册在不少功能后面标注最低支持版本,比如策略组级代理链要 iOS 5.22.0+ / Mac 6.9.0+。版本没到,对应功能就不可用,升级前先对照版本号,别配了参数发现没生效。

对比与取舍

四款 iOS 主流代理客户端横向对比(价格均为美区,截止到本文更新时间):

项目Surge 5ShadowrocketLoonQuantumult X
价格免费下载 + 内购$2.99 买断$7.99 买断$9.99 买断
策略组类型最全,含 Smart 自学习有,类型少有,类型全有,类型全
代理链策略级 + 策略组级,独一份无完整支持无完整支持支持(脚本级)
重写/MitM支持,四类重写 + Map Local支持(基础)支持(插件化)支持(最强)
脚本7 类入口支持(基础)支持(5 类)支持(最全)
平台iOS + macOS + tvOSiOS + macOSiOS + tvOSiOS + macOS
上手难度中等
界面跟随系统语言英文为主原生风格英文为主
典型用户开发者、爱折腾进阶功能、多设备用户基础代理、开箱即用插件生态爱好者配置文件玩家、脚本重度用户

结论:预算敏感只想要代理功能,选 Shadowrocket;想要插件生态但不想啃配置,选 Loon;愿意为最高自由度钻研配置,选 Quantumult X;想要功能全覆盖、代理链玩法和 Mac/iOS 同一套体系,选 Surge 5——前提是接受它的英文界面和上手门槛。四款都买的人也不少,Surge 当主力、Shadowrocket 当备用是常见的组合。

买断和内购的账可以这样算:三款竞品都是买断制,一次付清、换设备不重复花钱;Surge 5 走免费下载 + 内购解锁,先体验后付费,完整功能的花费看 App Store 当前显示。只算下载价 Surge 门槛最低,算解锁完整功能的总花费,就要看内购页面而不是下载按钮了。

Comments

评论

本地 Worker 预览版,后续可切换到 Cloudflare D1。

正在加载评论...

连接本地评论服务中...

Surge iOS macOS 代理客户端 代理链 重写 MitM 脚本
使用指南