Surge TestFlight Feed

@surgetestflightfeed


该频道用于提供关于 Surge iOS/Mac/tvOS 的最新 beta 版本信息

Surge TestFlight Feed

21 Jan, 00:25


关于 Pre-matching REJECT 的说明已加入到手册中:https://manual.nssurge.com/policy/reject.html

Surge TestFlight Feed

21 Jan, 00:23


Surge Mac & iOS Beta 更新日志
- 增加 pre-matching 标记规则的校验,在不支持的规则上配置该标记将直接产生配置错误。(请注意 PROTOCOL 语句不可用,逻辑规则的子规则也会被校验,但是 RULE-SET 的子规则若不支持仅会该子规则不生效而不会报错)
- 对 TCP RST 拒绝方式增加了全局防御,当 3 秒内触发 100 次后,将临时暂停以避免应用死循环导致 CPU 异常,同时输出日志
- pre-matching 的请求日志,由每 30 分钟一条,下调至 5 分钟
- [iOS] 为 iOS 18.1 下,Poor Network Quality 无法被从通知中心自动消除的问题加入了一个 workaround

Surge TestFlight Feed

21 Jan, 00:22


Surge Mac Beta build 2975 已实现该功能

Surge TestFlight Feed

21 Jan, 00:22


REJECT-NO-DROP 改进
接到部分用户回报,在用于去广告等用途时,如果 DNS 返回 NXDOMAIN/No Record 可能导致应用等待,而返回 127.0.0.1 会使得应用立刻认为请求失败。

出现该区别的原因,是因为应用开发者对于不同错误的处理逻辑不同。然而在 DNS 中返回 127.0.0.1 进行屏蔽,是一项非常不标准的行为,本质是将请求导向了回环网络 lo0,由本地系统产生一个 TCP refused 响应拒绝请求。

1. 如果本地系统上正好监听了访问的端口,会导致对应监听服务收到该请求,产生非预期结果。
2. 如果被屏蔽的应用重试逻辑非常暴力,由于 connect 127.0.0.1 会被系统极快的拒绝,可能导致 CPU 占用 100%。(即手机发热)

为此 Surge 提供了一个全新的解决方案,对于使用 REJECT-NO-DROP 的请求,Surge DNS 将固定返回特殊 IP 地址 198.18.0.244。对于该地址的所有 TCP 请求,将由 Surge VIF 产生 TCP refused,同时当发现往该地址的 TCP SYN 极高时,进行丢包处理以避免引发高 CPU 占用。

这种处理方式既保留了返回 127.0.0.1 的优点,同时消灭了可能导致的副作用。如果在使用 REJECT 时,出现了 app 等待过长的问题,可尝试使用 REJECT-NO-DROP。

Surge TestFlight Feed

21 Jan, 00:22


更新中加入了对代理模式接管的请求的 pre-matching 处理,REJECT 行为是进行 TCP RST,DROP 行为是将 socket 挂起。

Surge TestFlight Feed

21 Jan, 00:22


关于 Pre-Matching 功能的一些补充说明:
1. Pre-Matching 规则的 REJECT 策略依然有意义,对于 REJECT/REJECT-NO-DROP 策略,TCP 请求会在 SYN 时立刻收到 TCP RST(客户端表现为 Connection refused),DNS 请求会收到 No Record 响应。
而对于 REJECT-DROP 策略,TCP 的 SYN 包与 DNS 查询包将被直接丢弃,不做任何响应。
REJECT 同样会在一定频次后(30 秒内 50 次触发),自动升级为 REJECT-DROP。
除有明确的特殊需求外,建议使用默认的 REJECT,没必要主动使用 REJECT-DROP。

Surge TestFlight Feed

21 Jan, 00:22


相比最初版本进行了修订,不再限制 DOMAIN 类型不带有 extended-matching 标记, 不再限制 IP 类型一定需要 no-resolve 标记。
Surge Mac Beta Build 2971 已经可以开始测试该机制。

Surge TestFlight Feed

21 Jan, 00:21


新的订阅功能 Pre-matching
(Mac 版本不需要订阅)

用于描述使用 REJECT 策略的规则,如

[Rule]
DOMAIN,ad.com,REJECT,pre-matching

被标记了 pre-matching 的规则,将在正常的规则匹配流程前就提前生效,因此该规则相当于拥有最高优先级。

该功能的意义是,由于 Surge 的规则系统可判断的内容非常多,所以规则判定需要在收到首个 TCP 数据包后才可以进行,对于应对风暴请求或者去广告需求,产生了过多不必要的开销。

所有被标记了 pre-matching 的规则将会被提取出来进行优先匹配,在 DNS 解析与 TCP SYN 阶段就执行判断。若 DNS 域名命中,则直接返回 No Record,若 TCP SYN 阶段命中,将直接产生 ICMP REFUSED 响应,大量请求时升级至丢包,UDP 同样处理。

同时,对于每条规则,每 30 分钟仅会在最近请求列表中出现一次,避免因为大量请求刷屏。

可以使用 pre-matching 标记的规则类型有:

- DOMAIN 类型:DOMAIN,DOMAIN-SUFFIX,DOMAIN-KEYWORD,DOMAIN-SET,DOMAIN-WILDCARD。
- IP 类型:IP-CIDR,IP-CIDR6,GEOIP,IP-ASN。
- 逻辑规则:AND,OR,NOT
- 其他:SUBNET,DEST-PORT,SRC-PORT,SRC-IP

RULSET 也可以使用,但是其内容同样受到上述限制。

举例来说,对于最近米家 App 的疯狂请求,就可以靠配置

[Rule]
DEST-PORT,5222,REJECT,pre-matching

在低开销的情况下进行屏蔽。

注:未续订的情况下,该标记不会影响 Surge 开启,只是会无法生效,避免造成干扰。

--------------
以上内容为设计草案,有待修改。

Surge TestFlight Feed

21 Jan, 00:20


根据用户报告和反复测试,仅配置 2000::/3 路由对该特定 app 的 IPv6 请求问题的没有作用,下个版本将回滚代码取消该参数。
请尽量不要使用 ipv6-vif=always

Surge TestFlight Feed

21 Jan, 00:20


加入了一项 workaround,现在 ipv6-vif-route-mode 参数可以正确产生作用了

Surge TestFlight Feed

21 Jan, 00:20


由于一些 NE 的系统限制,ipv6-vif-route-mode 参数未能按预期工作,下个版本将提供其他替代参数

Surge TestFlight Feed

21 Jan, 00:20


有用户询问新参数与 ipv6-vif 参数的关系,ipv6-vif 参数控制是否开启 Surge VIF 的 IPv6,而 ipv6-vif-route-mode 控制在开启 IPv6 VIF 后的路由配置模式。
也就是说只有在,ipv6-vif=auto/always 下,ipv6-vif-route-mode 参数才有意义。

Surge TestFlight Feed

21 Jan, 00:20


Surge Mac & iOS Beta 更新日志
新增参数 `ipv6-vif-route-mode`,可选值为 auto、default、gua、manual

- default
配置 Surge VIF 为 default 路由,即先前版本中的工作模式。
- gua
仅配置 2000::/3 的路由,即只对 Global Unicast Address IPv6 地址生效。
- manual
应配合 tun-included-routes 参数使用,Surge 默认不再加入任何路由
- auto (默认选项)
让 Surge 自己决定工作模式

增加该选项的原因是因为,部分用户希望使用 IPv6 VIF 接管一些特定的请求,因此配置了 ipv6-vif=always,但是这会导致微信和其他一些应用认为当前系统存在有效的 IPv6 因此优先尝试,但是由于实际上本地并不存在有效的 IPv6 网络,需要等待出现错误后再回退到 IPv4。

配置为 gua 工作模式,由于不存在 IPv6 的 default 路由,所以不会让这类软件判定 IPv6 可用,但是依然能正确接管 IPv6 请求。

Surge TestFlight Feed

21 Jan, 00:18


Surge iOS Beta 更新日志
- 新增 HTTP Capture 的控制中心开关
- 支持使用 Ponte 策略作为 underlying-proxy

Surge TestFlight Feed

21 Jan, 00:17


Surge iOS Beta 更新日志
- 策略组列表视图支持配置自定义图标
- 修正带行尾注释的 DNS Mapping 项目无法在 UI 显示的问题
- 在全局模式下,若原选中策略不存在,将回退至第一个代理,而非 DIRECT

Surge TestFlight Feed

21 Jan, 00:16


Surge Mac & iOS Beta 更新日志
修改 SIP023 Identity 参数的配置方式为在 password 中使用 : 分隔,不再使用 identity 字段,与其他客户端相一致

Surge TestFlight Feed

21 Jan, 00:16


关于 Shadowsocks 2022 的性能表现:
- 在延迟上,与原版完全相同
- 在吞吐量上,原版中限制单个 AEAD 加密 chunk 最大长度为 16383(0x3FFF),与 TLS 协议的 record 最大长度一致,而 SS-2022 为 0xFFFF。这导致在进行 iperf 等极端压力测试的情况下,SS-2022 的表现会更好。但是 chunk 长度过大可能导致解密延迟(因为必须接收完毕整个 chunk 的数据才可以开始解密)。不过在正常使用中,基本都属于可以忽略不计的区别。

Surge TestFlight Feed

21 Jan, 00:16


Surge Mac & iOS Beta 更新日志
新的订阅功能:Shadowsocks 2022 加密协议支持
- 支持 2022-blake3-aes-256-gcm 与 2022-blake3-aes-128-gcm 两种模式
- UDP 转发同样需要配置 udp-relay=true
- 可配置 identity 参数以使用 SIP023 Shadowsocks 2022 Extensible Identity Headers,目前仅支持配置一层

Surge TestFlight Feed

21 Jan, 00:08


Surge 配置提示
在协助部分用户排查问题时,发现用户配置了过多的 DNS 记录(13000+)。如此多的内容会导致内存与性能问题。
由于 [Host] 段内容支持通配符且有先后顺序,无法进行索引优化,所以匹配的性能很低,因此并不建议在这里配置过多内容,也没有必要。(百条量级的话开销可忽略不计)
如果是为了区分解析,请参考白皮书,应正确配置规则系统确保解析在代理服务器发生,而非在本地进行解析。
如果是为了广告屏蔽,请使用 REJECT 规则。

Surge TestFlight Feed

21 Jan, 00:08


Surge Mac & iOS Beta 更新日志
- [iOS]部分用户的网络存在异常,IPv6 的路由会被不断配置与清除,导致在 ipv6-vif=auto 的情况下 Surge 需要不断重新配置 VPN。该版本加入了一个 workaround,在同一个网络下,如果 IPv6 路由在存在的情况下又被清除,也不再重置 VIF 状态。
- 优化了加密 DNS 的错误处理逻辑,在遇到错误时将立刻进行重试