最近使用Surge时遇到几个坑,相关设定在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请求。因此考虑如何能够解密抓包请求数据,社区咨询后发现还是有办法的。增加如下配置
force-http-engine-hosts=112.65.*.*

正常的TCP请求可以通过以上设定抓包解决,但微信中的不行,因为微信中的请求都进行了mmtls加密,即使设定为HTTP解析,对于请求体/响应体解码失败。
本地DNS映射
- Surge支持本地DNS映射,这样此类需求就不需要独立APP了,比如SwitchHosts,iHosts,又或者直接操作/etc/hosts文件了。
- 本地DNS映射的好处是,比如在开发中本地或局域网WEB服务,需要使用域名访问来测试效果,就可以用该设定来解决。
如图,我给内网服务及本地服务均配置了域名,这样就可以使用mymac.cn域名来访问了。

注意,Surge下skip-proxy配置项一般会有localhost和127.0.0.1等配置,这些配置的作用是Surge在执行代理规则时,对这些访问地址会采取跳过代理。而如上的DNS映射与此项并不冲突,因此localhost这种地址仍然work。
Vmess-alterId
VMess协议节点需要配置alterId=0的话,Surge勾选该选项即可满足要求。如果alterId为其它值就没办法。

关于alterId为0的含义
现在 VMess 的 AlterID 设置为 0,则代表开启 VMessAEAD 头部加密,用于对抗重放和读取长度探测。
写在最后
既然买了这些复杂的app,玩好才可以事半功倍。