Skip to content

Comments

VMess inbound: Optimize replay filter#5562

Merged
RPRX merged 4 commits intomainfrom
filter
Jan 27, 2026
Merged

VMess inbound: Optimize replay filter#5562
RPRX merged 4 commits intomainfrom
filter

Conversation

@Fangliding
Copy link
Member

删掉了v2fly/ss-bloomring 依赖 现在除开注释和readme 代码里没有v2fly字样了
删掉了seiflotfy/cuckoofilter 依赖 使用一个map进行代替 这个双布谷鸟查一次要几千ns 这个map版本只要500ns
间接依赖 go-metro 也跟着一起消失了
本来想删掉 riobard/go-bloom 但是发觉 SS-AEAD 并不带时间戳 所以需要一个长期有效的过滤器 布隆过滤器基本是唯一选择
尽管如此重启后其实SS还是可以被重放 而且这个功能默认也不是开的 所以 SS-AEAD 其实纯窟窿

@RPRX
Copy link
Member

RPRX commented Jan 18, 2026

这些防重放措施的抗识别意义远大于安全意义,我早就给 @yuhan6665 说过全随机数协议都进黑名单了,这些措施都可以撤了

VMess-AEAD 和 SS2022 带有时间戳机制还可以拿 map ICU 一下,SS-AEAD 重启就没了还是让它寿终正寝吧,布隆过滤器也删了吧

@yuhan6665
Copy link
Member

我的看法:用 v2fly 的优良依赖挺好的 都是开源一家人 能依赖就不用浪费时间自己搞
至于老协议比如 shadowsocks 我觉得应该长期支持 各个地区 不同应用场景 对应的威胁模型都不一样 我们应该维护多协议 多传输层的核心架构
退一步讲就算是作科研对照组 作为经典的 psk 加密模式 也很有价值

@RPRX
Copy link
Member

RPRX commented Jan 19, 2026

倒不是为了把 v2fly 的依赖项给删掉,只是得回忆一下历史,以前全随机数协议搞的这些乱七八糟的措施主要是为了防识别,但是现在任何人搭个 OpenGFW 就能把全随机数协议给识别了且针对的就是全随机数外观,以前这些乱七八糟的措施就没有意义了

Xray-core 的 Shadowsocks、VMess 为了兼容性肯定不会被删掉,说到对称 PSK,VLESS Encryption 其实相当于非对称 PSK 且加密了后量子密钥交换过程,安全系数相比叠上了三层 buff,Mihomo、Shadowrocket 已经支持,仅对称 PSK 也是已经没有意义了

@lyy331
Copy link

lyy331 commented Jan 19, 2026

什么时候把sb的SS2022删掉

@majorcheng
Copy link

outbound多挺好的,特别适合做中继, 能直接接各种落地协议, inbound倒是没必要很多精就完事了

@Fangliding
Copy link
Member Author

我的看法:用 v2fly 的优良依赖挺好的 都是开源一家人 能依赖就不用浪费时间自己搞 至于老协议比如 shadowsocks 我觉得应该长期支持 各个地区 不同应用场景 对应的威胁模型都不一样 我们应该维护多协议 多传输层的核心架构 退一步讲就算是作科研对照组 作为经典的 psk 加密模式 也很有价值

那个ss bloom上次更新几年前了 而且就这一个文件 就跟之前那个ech依赖一样只是拉进来减少gomod 而且这玩意本质其实是 riobard/go-bloom 的一个wrapper 没有任何更新跟上游的必要

再至于要不要移除 bloom 其实ivcheck 这个选项从始至终都没进过文档 默认也是关 xray搭出来的全是可以被重放攻击的

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

go-bloom 默认没开的话就删掉吧

还有你那防重放的 map 是不是写复杂了

@Fangliding
Copy link
Member Author

Fangliding commented Jan 27, 2026

一起才四十多行 整个逻辑也就是加锁 过期检查 写入 interval 方法是接口定义的
还有其实就是文件改了个名从旧的布谷鸟改来的

@Fangliding
Copy link
Member Author

我看了一下这个接口没啥人用把它去掉然后泛型化了一下

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

SS2022 有用到这个新的 replay filter 吗

@Fangliding
Copy link
Member Author

因为它是sing家族的 用的sing里的过滤器(也是map实现)

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

VMess 这个 replay filter 是出入站都有的吗

@Fangliding
Copy link
Member Author

防重放肯定是入站啊 出站哪来防重放

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

请重温 SS-AEAD 的糟糕设计

不过想了下 VMess-AEAD 应该没 SS-AEAD 那个移花接木问题,不然当时也被我揪出来了

@RPRX RPRX changed the title Remove dependency and optimize vmess replay filter VMess inbound: Optimize replay filter Jan 27, 2026
@RPRX RPRX merged commit f6a7e93 into main Jan 27, 2026
77 of 78 checks passed
@Fangliding
Copy link
Member Author

那是密钥重用的问题吧 一般情况下这种都要在初始化的时候灌入server或者client字符串

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

主要是 SS-AEAD 返回流没有关联请求流的问题,任何历史返回流都可以被重放给客户端,导致客户端收到的数据不可靠

“初始化的时候灌入server或者client字符串”并不是必要的,当然 SS-AEAD 连这个也没,导致任何请求流甚至都可以被重放给客户端

再加上 SS-AEAD 没有时间戳机制导致实质上无法有效防重放,呃。。。

虽然时间戳机制不如密钥交换

@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

话说这个 test 好了一段时间后又开始偶尔有 fail 了

@Fangliding
Copy link
Member Author

话说这个 test 好了一段时间后又开始偶尔有 fail 了

不是之前那种莫名其妙的本地连接关闭 似乎的github action到CF的连接有点问题 因为好几个test是需要联网而且是跟CF有关的
比如main刚刚那个就是访问1.1.1.1超时了 app/dns: failed to retrieve response for google.com. > Post "https://1.1.1.1/dns-query": context canceled

@Fangliding Fangliding deleted the filter branch January 27, 2026 18:54
@RPRX
Copy link
Member

RPRX commented Jan 27, 2026

这种需要联网的多 retry 几次吧

@Fangliding
Copy link
Member Author

test不是为retry设计的 一个t.Fatal整个就失败了 要改还得一个个下去动 它的设计是错误就炸好抛出问题
这种自然灾害应该不是很频繁 就让它过去吧

@Fangliding
Copy link
Member Author

我之前甚至还想过从action重试几次来避免之前那个时不时炸的问题 不过后来想了想太扭曲了 人家是跑几次(-count=)发现问题 这改成跑几次掩盖问题有点难绷

@Fangliding
Copy link
Member Author

image 确实有点拉垮了

nebulabox added a commit to nebulabox/Xray-core that referenced this pull request Jan 28, 2026
* commit 'f6a7e939231e5ec6b167628bf730dc70a3c36707': (90 commits)
  VMess inbound: Optimize replay filter (XTLS#5562)
  Bump github.com/pires/go-proxyproto from 0.9.1 to 0.9.2 (XTLS#5614)
  TUN inbound: Add iOS support (XTLS#5612)
  Geodat: Reduce peak memory usage (XTLS#5581)
  Bump github.com/pires/go-proxyproto from 0.9.0 to 0.9.1 (XTLS#5608)
  Hysteria transport: Support range & random for `interval` in `udphop` as well (XTLS#5603)
  TUN inbound: Enhance Darwin interface support (XTLS#5598)
  XUDP client: Initialize Global ID's BaseKey correctly (XTLS#5602)
  TUN inbound: Disable RACK/TLP recovery to fix connection stalls (XTLS#5600)
  v26.1.23
  common/errors/feature_errors.go: Add PrintNonRemovalDeprecatedFeatureWarning() (XTLS#5567)
  API: Add ListRule() for routing (XTLS#5569)
  Log config: More flexible `maskAddress` (XTLS#5570)
  Bump github.com/miekg/dns from 1.1.70 to 1.1.72 (XTLS#5590)
  Bump github.com/cloudflare/circl from 1.6.2 to 1.6.3 (XTLS#5589)
  Hysteria transport: Fix speedtest issue (XTLS#5587)
  README.md: Add fancyss to Asuswrt-Merlin Clients
  Router: Fix panic in ProcessNameMatcher when source IPs are empty (XTLS#5574)
  README.md: Update links for PassWall & PassWall 2 (XTLS#5572)
  Tests: Reduce RAM usage (XTLS#5577)
  ...

# Conflicts:
#	core/core.go
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants