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深度用户,一直付费更新,当前版本已更为如下,以下教程仍适用
- Surge Mac
v5.7.3
- 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代理走的是专线,所以很快/稳定。加上代理后,发现稳定,畅通。于是网络问题解决。当然代理链后,毕竟多了一层或者多层代理,延迟也对应会加大些。
代理规则[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
注意,测试地址别用谷歌,听说不好
订阅外部策略
除了将本地配置的代理策略添加到策略组,还可以直接从远程订阅地址中提取策略。
比如我这里将机场订阅地址填写进去,确定后新建的策略组将会自动添加所有机场的策略代理进去。这样可以既使用了远程的代理节点免去自己维护,同时也可以使用自己的代理规则,而不是整个配置都走机场的。
注意,如果想过滤代理,还可以使用Including Filter
,比如我设置US,这样代理中US名称的匹配后都会命中,其它的就不会加入。
升级需求-临时切到某节点?
有时,有这样的需求,虽然自动切换节点很爽,但比如我现在上Apple注册美区ID,就是想美国IP访问,但这种需求是临时的,我想到的办法是,我去编辑组策略,去掉非美国节点,这是个办法,但是有更好的办法吗?有!
- 新建策略组比如叫[group-final-select],类型为select,策略选择刚才的自动切换策略组,及想要的US代理
- 修改Rule规则,代理部分原来是选择的group-auto-switch,
全部替换
为group-final-select。
注意,策略组本身也是个策略,明白这点,有益于理解。
这样,日常我们手动选择执行group-auto-switch,假如临时需要切换到US,只需要手动选择US即可。
智能策略组Smart Group
v5版本推出了smart策略组类型,其目的是替代之前的automatic test. 之前的自动化切换代理是定期检查决定代理,而smart是记录了每个站点的历史选中策略,再动态收集代理情况,因此理论上是越来越smart。
对于普通用户建议的修改如下
将
url-test
可以直接改为成smart
。特定站点对于IP要求高的,建议还是单独配置策略组,手动选择代理,不要使用smart。
smart同时也支持自定义权重,非特殊需求不建议进行设置。
1
policy-priority="Premium:0.9;SG:1.3"
系统代理
系统代理与VPN并存?
可以,需要执行以下配置,将内网域名填写上。这样即可内网解析及代理外网解析同时work。
1 | [Host] |
surge官方给出了完整解答,戳这里
注意:如果需要匹配多个子域名,使用*.example.com
,但不要使用example.com
,测试后者写法会有时不work。
增强模式
部分应用并不走系统代理,使用增强模式可以解决此问题。
比如登录Mac版电报,发现一直loading,勾选该项可以解决。当然你也可以在电报里设定下代理,但是能在一个APP中解决岂不更优雅?
点击菜单栏,勾选增强模式
增强模式下,连接其它VPN?
比如我远程办公时需要使用OpenConnect连接公司VPN,而Surge的增强模式会让所有应用都走代理,本身两者是冲突的。因此增强模式打开的情况下,是连不上公司VPN之类的。所以需将增强模式关闭。
而增强模式如果关闭了,Mail,或者电报就需要单独配置代理,从而科学上网?
Mail客户端可以根据增加ProcessName类型的Rule进行解决
Telegram通过配置Rule无法解决,但App本身提供了代理设定
Setting => Data and Storage => Proxy
所以,假如需要同时连接公司VPN等,增强模式需要关闭
iCloud同步配置文件
Surge很好的支持了iCloud,建议将配置文件放在iCloud路径下,可以方便的同步到多终端设备和备份
iOS同步配置
iOS端需要设定同步,more=》Profile Sync,从iCloud中导入Profile即可完成同步化。
配置自动更新
Mac版,
Surge=>More=>Profile
下选择Automatically reload
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
- 与上述
skip-proxy
根本区别见下图
隐藏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 | #!name=browser proxy under whistle |
[Panel]
iOS版支持自定义panel,搭配Script还可以实现动态Panel
界面语言
Surge Mac版默认跟随系统设置语言,且未提供语言切换开关。如果不想修改系统显示语言的话,可以走如下命令进行语言切换
1 | 英文 |
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可以查看本地/远程设备的请求数据。
常见用途
- 确定请求走代理情况
- MitM后抓包数据
- DNS解析结果,功能与iOS版
工具- DNS结果
一致
ipv6
Surge开启代理的情况下,http://www.test-ipv6.com 还是会出现失败,对应需要开启v6开关。
1 | ipv6 = true |
测试版尝鲜
iOS
iOS测试版想使用,需要加入TestFlight。如果是Web邮箱注册进行的购买,按照以下操作。
- 登陆Surge网站 https://nssurge.com/account
- 点击
Apply TestFlight
- 手机访问邀请网址,会跳转到下载TestFlight app
- 然后选择更新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三端运行,为了灵活的使用各设备,个人在实际使用中有如下几个实践,供参考
- Mac与iOS独立主配置文件,TV端直接使用iOS端配置文件即可。
代理策略,代理组,代理规则抽离为独立文件,主配置文件进行include。
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配置,同时又想增加自定义规则,大致有如下两个方案。
- 走模块方案,模块中规则优先级高于配置文件中的RULE
- 机场只用代理,规则完全走本地自定义的
Windows支持?
Surge无计划支持Windows,仅支持Apple生态。Windows下可以使用Clash等替代。
相关文档
还有疑问?
- 官方论坛 https://community.nssurge.com/
- 邮件作者 support@nssurge.com
- 博客下评论,或者直接邮件我,乐意分享我的知识
写在最后
昂,似乎到此为止,我们可以很轻松的访问了,并且加入代理服务器某个挂了,还可以自动切换。这些事都是Surge帮我们背后去做,我们无感。完美强大吧。
当然这里我也只解决了基本的科学上网,但Surge的强大远不止此,慢慢摸索吧。