Surge Mac使用指南

入手了Surge for Mac。
购买的直接动机是希望对网络请求有更好的管理,比如我想实现Mail客户端下,发送Gmail邮件走代理,而发送其它邮件不走代理。这个如果不用Surge能做到吗?可以,但是麻烦些,比如使用ShadowSocks配合Proxier。

有时软件多也是累赘,对于Surge大名,早有耳闻,看了下官方手册,好长。不过官网的一段介绍-Meets All Your Personalization about Network,清晰准确的描述了Surge的定位及解决的点。
于是就下单【69.99刀】,可授权设备数为3台,当然iOS版的话又是单独付费【49.99刀-授权设备数3为台】,不得不说,贵!

但当你用上一段时间后,对比同类的其它APP时,你会发现真香!

购买地址:戳这里官网
支付手段:支付宝或信用卡
购买建议:网页购买,不要App内购!!!,因为网页购买直接可以得到license key和绑定邮箱,内购的需要90天后才可以绑定,不要小看这个邮箱,比如想加入测试或者,多设备注册就需要啊
购买成功,OK,开搞吧。

更新

本人是Surge深度用户,一直付费更新,当前版本已更为如下,以下教程仍适用

  1. Surge Mac v5.7.3
  2. Surge iOS v5.21.0

下载

官方网页下载,Surge Mac版App Store未上架,仅有iOS-App Store版和TV版

初始化配置

Surge配置复杂,有一定的学习门槛儿,最好是先利用一个模板初始化,然后根据实际情况调节即可。

启动Surge,点击设定-配置文件

选择URL方式安装,https://raw.githubusercontent.com/alanhg/surge-config/main/surge.conf

代理策略

上述配置安装后,点击代理,即可看到有代理服务器,这里按照实际的代理服务器地址进行修改即可。如图,我配置了多台SS服务。

配置完成后,点击代理服务器,连接成功,访问Google,OK,另外比如mail中, 当我们发送邮件到Gmail也显示为代理了,但是比如163就还是直连。

  • SS已经成为过去式,建议不要搭建或购买SS服务

V2Ray支持

Mac版自3.3.1,iOS版自4.1.0,已经支持

配置格式

1
v2rayProxy = vmess, xxx.xxx.com, 30544, username=xxxxxx-xx-406xe-8d63-x,, tls=true, ws=true, ws-path=/helloMario

Trojan支持

Yes,3.4已经支持

配置格式

1
ProxyTrojan = trojan, 192.168.20.6, 443, password=password1

免费代理节点?

我们下载的配置文件中的代理肯定是不能用的,那个只是个例子而已。部分同学问我为啥代理不起作用。。。。OK,那个本来就不可用。有免费的代理节点吗?有,请自行查找。

免费的是最不靠谱的,都有其代价,比如时间,比如隐私。

代理链

在添加代理服务器时会看到有个代理链配置,大致作用就是该代理可以以下游的某代理直接访问,而非我们的目标主机直接访问。从而隐藏了我们机器的访问信息。

比如我这里新开一台新加坡机器,走SSH直接代理发现并不稳定,分析后发现主要是国内网络环境,具体可能是IP本身进了名单之类的,总之访问困难。这里我可以为其配置代理链,即新加坡机器的下游代理设置为我的HK代理,HK代理走的是专线,所以很快/稳定。加上代理后,发现稳定,畅通。于是网络问题解决。当然代理链后,毕竟多了一层或者多层代理,延迟也对应会加大些。

https://static.1991421.cn/2022/2022-11-08-002821.jpeg

代理规则[Policy Rules]

境外走代理,境内走直连

一味的增加规则,对特定域名站点加入代理很繁琐,并且规则的增加会导致解析速度变慢,所以可以通过设定CN的走直连,默认的走代理。操作如下

一般来说不建议超过 500 条规则。规则集中的规则数量也计算在内。

广告拦截规则

  • 针对广告拦截,原理就是reject了某些链接/站点。不想操心维护的,可以使用网上现成的规则,Surge会定时更新,增加如下配置即可。

  • Surge处理rule是自上向下,懒惰匹配,如果该规则集不符合个人需求,可以单独对某个规则自动添加修改即可。

1
DOMAIN-SET,https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-surge2.txt,REJECT

​ 对应repo地址:戳这里

策略组[Policy Group]

这里,我增加策略组[比如叫group-auto-switch],如下配置,这样每隔600毫秒,会去ping一下该地址,选择延迟最小的代理节点。比如哪天Macau的挂了,就会自动切换到US

注意,测试地址别用谷歌,听说不好

订阅外部策略

除了将本地配置的代理策略添加到策略组,还可以直接从远程订阅地址中提取策略。

比如我这里将机场订阅地址填写进去,确定后新建的策略组将会自动添加所有机场的策略代理进去。这样可以既使用了远程的代理节点免去自己维护,同时也可以使用自己的代理规则,而不是整个配置都走机场的。

https://static.1991421.cn/2024/2024-06-12-221818.jpeg

注意,如果想过滤代理,还可以使用Including Filter,比如我设置US,这样代理中US名称的匹配后都会命中,其它的就不会加入。

升级需求-临时切到某节点?

有时,有这样的需求,虽然自动切换节点很爽,但比如我现在上Apple注册美区ID,就是想美国IP访问,但这种需求是临时的,我想到的办法是,我去编辑组策略,去掉非美国节点,这是个办法,但是有更好的办法吗?有!

  1. 新建策略组比如叫[group-final-select],类型为select,策略选择刚才的自动切换策略组,及想要的US代理
  2. 修改Rule规则,代理部分原来是选择的group-auto-switch,全部替换为group-final-select。

注意,策略组本身也是个策略,明白这点,有益于理解。

这样,日常我们手动选择执行group-auto-switch,假如临时需要切换到US,只需要手动选择US即可。

智能策略组Smart Group

v5版本推出了smart策略组类型,其目的是替代之前的automatic test. 之前的自动化切换代理是定期检查决定代理,而smart是记录了每个站点的历史选中策略,再动态收集代理情况,因此理论上是越来越smart。

对于普通用户建议的修改如下

  1. url-test可以直接改为成smart

  2. 特定站点对于IP要求高的,建议还是单独配置策略组,手动选择代理,不要使用smart。

  3. smart同时也支持自定义权重,非特殊需求不建议进行设置。

    1
    policy-priority="Premium:0.9;SG:1.3"
https://static.1991421.cn/2024/2024-07-06-104612.jpeg

系统代理

系统代理与VPN并存?

可以,需要执行以下配置,将内网域名填写上。这样即可内网解析及代理外网解析同时work。

1
2
[Host]
internal.example.com = server:syslib

surge官方给出了完整解答,戳这里

注意:如果需要匹配多个子域名,使用*.example.com,但不要使用example.com,测试后者写法会有时不work。

增强模式

部分应用并不走系统代理,使用增强模式可以解决此问题。

比如登录Mac版电报,发现一直loading,勾选该项可以解决。当然你也可以在电报里设定下代理,但是能在一个APP中解决岂不更优雅?

点击菜单栏,勾选增强模式

增强模式下,连接其它VPN?

比如我远程办公时需要使用OpenConnect连接公司VPN,而Surge的增强模式会让所有应用都走代理,本身两者是冲突的。因此增强模式打开的情况下,是连不上公司VPN之类的。所以需将增强模式关闭。

而增强模式如果关闭了,Mail,或者电报就需要单独配置代理,从而科学上网?

  1. Mail客户端可以根据增加ProcessName类型的Rule进行解决

  2. Telegram通过配置Rule无法解决,但App本身提供了代理设定

    Setting => Data and Storage => Proxy

所以,假如需要同时连接公司VPN等,增强模式需要关闭

iCloud同步配置文件

Surge很好的支持了iCloud,建议将配置文件放在iCloud路径下,可以方便的同步到多终端设备和备份

iOS同步配置

iOS端需要设定同步,more=》Profile Sync,从iCloud中导入Profile即可完成同步化。

配置自动更新

  1. Mac版,Surge=>More=>Profile下选择Automatically reload

    https://static.1991421.cn/2022/2022-12-10-122134.jpeg

  2. iOS版会自动更新,如果在app激活状态下,同步更新了新配置也会有消息提醒

HTTPS内容抓包

三步配置后,在dashboard中,即可看到解密后的请求报文和响应报文了。

配置项

Surge还有些设置是比较高阶的,普通玩家可以忽视,高级玩家继续看。

skip-proxy

之前已经使用Surge+Whistle来解决工作中代理规则的切换问题,但是最近遇到192.168.x.x rule不生效,查看network发现也没有相关记录。一开始以为是Whistle问题,但是对比外网IP却OK,因此断定是surge代理没有将该请求分发到whistle代理的问题。最终定位skip-proxy配置规则影响。

解决办法对应去掉192.168.1.1/16配置即可。

该参数设定的域名/IP段Surge接收该请求并不会进行代理,而是直接跳过,比如127.0.0.1本地IP,没有代理必要,如果强行设定走代理,只会浪费性能。因此按需配置。

bypass-tun

  1. 与上述skip-proxy根本区别见下图

  1. 隐藏VPN图标

    增加bypass-tun = 0.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

代理说明

  • Surge Proxy server: Surge 功能开启后将自动代理 iOS 设备上所有的 HTTP/HTTPS ,同时对所有的 HTTP/HTTPS 代理使用同一个代理会话,以最高限度提高 Surge 的代理性能。Surge 可以通过 skip-proxy 指定哪些流量不被 proxy server 所代理
  • Surge TUN interface: iOS 上大部分应用程序的网络交互使用 HTTP/HTTPS,但也存在部分应用程序(如:iOS邮件客户端、Facebook客户端)等应用程序使用其他的通讯方式(如:SPDY等),这些应用无法被 Proxy server 所代理,这就需要使用更为底层的TUN interface 隧道方式。Surge 可以通过 bypass-tun 指定哪些数据流量不送 TUN interface 处理
  • 当前 Surge TUN interface 只能处理 TCP 流量,对于 ICMP、UDP 流量将被直接丢弃,因此需要通过配置* bypass-tun *选项来放行这些流量。

force-http-engine-hosts

最近利用Surge抓包微信小程序中请求数据,发现这些请求在Surge下显示为TCP连接而并非HTTP请求。因此考虑如何能够解密抓包请求数据,社区咨询后发现还是有办法的。增加如下配置

1
force-http-engine-hosts=112.65.*.*

正常的TCP请求可以通过以上设定抓包解决,但微信中的不行,因为微信中的请求都进行了mmtls加密,即使设定为HTTP解析,对于请求体/响应体解码失败。

dns-server

dns也需要注意,不然dns阶段就会超时,可能代理/代理访问站点都可能超时失败。

1
dns-server = 114.114.114.114,223.5.5.5,208.67.222.222, system

本地DNS映射

  • Surge支持本地DNS映射,这样此类需求就不需要独立APP了,比如SwitchHosts,iHosts,又或者直接操作/etc/hosts文件了。

  • 本地DNS映射的好处是,比如在开发中本地或局域网WEB服务,需要使用域名访问来测试效果,就可以用该设定来解决。

如图,我给内网服务及本地服务均配置了域名,这样就可以使用mymac.cn域名来访问了。

注意

  • Surge下skip-proxy配置项一般会有localhost和127.0.0.1等配置,这些配置的作用是Surge在执行代理规则时,对这些访问地址会采取跳过代理。而如上的DNS映射与此项并不冲突,因此localhost这种地址仍然work。
  • 部分App默认不走Surge代理,比如终端App,确保DNS配置生效的前提是确保App本身走代理,简单配置的话就直接开启增强模式

Vmess-alterId

VMess协议节点需要配置alterId=0的话,Surge勾选该选项即可满足要求。如果alterId为其它值就没办法。

关于alterId为0的含义

现在 VMess 的 AlterID 设置为 0,则代表开启 VMessAEAD 头部加密,用于对抗重放和读取长度探测。

module-rule

除了配置本身定义规则,优先级从上向下执行外,还有一种方法可以插入规则,同时可以动态关闭,那就是module

需要注意的是:Module的配置优先级高于当前Profile,且多个Module按照顺序执行,即后覆盖前。

常用的姿势是比如我需要条件化/动态关闭某个规则,比如chrome走指定代理,但有时还想快速关闭,rule本身是没有动态开关的,那么就可以搞个module,而module可以动态开关。

比如如下的module

1
2
3
4
5
6
7
8
9
10
#!name=browser proxy under whistle
#!desc=浏览器【Chrome,Safari】走Whistle代理,需要创建名称为Dev-Whistle-local的whistle代理节点
#!system=mac

[Rule]
# 解决开发调试-Whistle
PROCESS-NAME,Google Chrome*,Dev-Whistle-local
OR,((PROCESS-NAME,Safari*), (PROCESS-NAME,/Library/Apple/System/Library/StagedFrameworks/Safari/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.Networking.xpc/Contents/MacOS/com.apple.WebKit.Networking), (PROCESS-NAME,/System/Library/Frameworks/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.Networking.xpc/Contents/MacOS/com.apple.WebKit.Networking)),Dev-Whistle-local
OR,((PROCESS-NAME,/Applications/Firefox.app/Contents/MacOS/firefox)),Dev-Whistle-local

[Panel]

iOS版支持自定义panel,搭配Script还可以实现动态Panel

https://static.1991421.cn/2023/2023-12-19-231443.jpeg

界面语言

Surge Mac版默认跟随系统设置语言,且未提供语言切换开关。如果不想修改系统显示语言的话,可以走如下命令进行语言切换

1
2
3
4
# 英文
defaults write com.nssurge.surge-mac AppleLanguages '(en)'
# 中文
defaults write com.nssurge.surge-mac AppleLanguages '(zh-Hans)'

iOS版的话可以去系统设置里面找到Surge,点进去改“首选语言”,默认是跟随系统语言。

[URL Rewrite]

利用Surge也可以实现某些域名/网址重定向,比如下面这样

1
^https?://(www.)?google.cn https://www.google.com 302

注意:HTTPS URL重定向的话比如MitM开启该域名解密。

module

上面已经提到了module中可以配置规则,但除此之外module可以做的事还有很多。粗粒度来说,本身Surge的配置大部分都可以通过module来组织,比如Rule,Script,MitM hostname,自定义Panel等。

关于模块贴下我自用的一些

https://github.com/alanhg/surge-config

Dashboard

通过Dashboard可以查看本地/远程设备的请求数据。

常见用途

  1. 确定请求走代理情况
  2. MitM后抓包数据
  3. DNS解析结果,功能与iOS版工具- DNS结果一致

ipv6

Surge开启代理的情况下,http://www.test-ipv6.com 还是会出现失败,对应需要开启v6开关。

1
2
ipv6 = true
ipv6-vif = auto

https://static.1991421.cn/2024/2024-05-06-094856.jpeg

测试版尝鲜

iOS

iOS测试版想使用,需要加入TestFlight。如果是Web邮箱注册进行的购买,按照以下操作。

  1. 登陆Surge网站 https://nssurge.com/account
  2. 点击Apply TestFlight
  3. 手机访问邀请网址,会跳转到下载TestFlight app
  4. 然后选择更新surge到测试版即可

内购版的就麻烦些,需要等90天,在app license栏目下,绑定邮箱,这时就会得到license key,然后按照上面步骤进行即可。

相关文档:戳这里

Mac

选择包含beta版,点击check now,安装成功后

Surge升级

Mac版本为买断制,老的版本可以通过付费升级。

访问,https://nssurge.com/buy_now ,点击Upgrade

比如 Surge 2.x 版本已于 2018 年就停止维护。如果是v2的老用户建议还是付费升级下。

历史版本

Surge Mac历史版本下载:这里

Mac/iOS/TV多端配合实践

当前Surge支持在Mac/iOS/tvOS三端运行,为了灵活的使用各设备,个人在实际使用中有如下几个实践,供参考

  1. Mac与iOS独立主配置文件,TV端直接使用iOS端配置文件即可。

https://static.1991421.cn/2024/2024-07-07-115529.jpg

  1. 代理策略,代理组,代理规则抽离为独立文件,主配置文件进行include。

    https://static.1991421.cn/2024/2024-07-07-115606.jpg

    1
    2
    3
    4
    5
    6
    7
    8
    [Proxy]
    #!include block_proxy.dconf

    [Proxy Group]
    #!include block_group.dconf

    [Rule]
    #!include block_rule.dconf

其它问题

License设备数限制

购买的License不同,设备数不同,最大为5设备数License,不支持升级到5台以上,有需要的话,只能再单独购买。

机场规则与本地规则结合

假如订阅机场提供的Surge配置,同时又想增加自定义规则,大致有如下两个方案。

  1. 走模块方案,模块中规则优先级高于配置文件中的RULE
  2. 机场只用代理,规则完全走本地自定义的

Windows支持?

Surge无计划支持Windows,仅支持Apple生态。Windows下可以使用Clash等替代。

相关文档

还有疑问?

  1. 官方论坛 https://community.nssurge.com/
  2. 邮件作者 support@nssurge.com
  3. 博客下评论,或者直接邮件,乐意分享我的知识

写在最后

昂,似乎到此为止,我们可以很轻松的访问了,并且加入代理服务器某个挂了,还可以自动切换。这些事都是Surge帮我们背后去做,我们无感。完美强大吧。

当然这里我也只解决了基本的科学上网,但Surge的强大远不止此,慢慢摸索吧。

参考文档