前言
一直表现都中规中矩的的V2ray,不记得从什么时间开始,发现连不上,但一直以为是普通抽疯问题,一直没管,直到最近抽空测试,发现连接时,出现 “failed to process outbound traffic”错误提示。
up用的科学上网一直都是自有VPS搭建的Vmess,用的traefik反代(详细设置,可跳转:【Traefik 快速部署V2ray+WS+TLS 】)。然而一直用着都没出现问题的v2ray,最近莫名奇妙的长时间持续不能连接,在v2rayN中测试,出现以下错误提示:
[Waring] app/proxyman/outbound: failed to process outbound traffic > proxy/vmess/ outbound: connection ends > proxy/vmess/ outbound: failed to read header > proxy/vmess/ encoding: failed to read response header > websocket: close 1000 (normal)
一直提示failed to process outbound traffic,failed to read response header的失败。
解决办法
原因
经过一翻搜索,之所以会出现“failed to process outbound traffic”这种错误,原来根本问题是v2ray更新过后,修改了一些认证机制,导致原有配置在服务器端认证失败。说简单点,你可以理解为alertid被v2ray抛弃了。至于修改内容,大概如下:
在 v4.28.1 版本后,客户端 AlterID 设置为 0 代表启用 VMessAEAD ;服务端为自动适配,可同时兼容启用和未开启 VMessAEAD 的客户端。对于 VMess MD5 认证信息的兼容可以被关闭。(v4.35.0+)
VMess MD5 认证信息 玷污机制
为了进一步对抗可能的探测和封锁,自 v4.24 版本起,每个 VMess 认证数据的服务器端结构都会包含一个一次写入的玷污状态标记,初始状态为无瑕状态,当服务器检测到重放探测时或者因为其他原因入站连接出错以致校验数据不正确时,该连接所对应的请求认证数据会被玷污。
被玷污的认证数据无法被用于建立连接,当攻击者或客户端使用被玷污的认证数据建立连接时,服务器会输出包含 "invalid user" "ErrTainted" 的错误信息,并阻止该连接。
当服务器没有受到重放攻击时,该机制对正常连接的客户端没有影响。如果服务器正在被重放攻击,可能会出现连接不稳定的情况。
拥有服务器 UUID 以及其他连接数据的恶意程序可能根据此机制对服务器发起拒绝服务攻击,受到此类攻击的服务可以通过修改 proxy/vmess/validator.go 文件中 func (v *TimedUserValidator) BurnTaintFuse(userHash []byte) error 函数的 atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 1) 语句为 atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 0) 来解除服务器对此类攻击的安全保护机制。使用 VMessAEAD 认证机制的客户端不受到 VMess MD5 认证信息 玷污机制 的影响。
VMess MD5 认证信息 淘汰机制
VMessAEAD 协议已经经过同行评议并已经整合了相应的修改。 VMess MD5 认证信息 的淘汰机制已经启动。
自 2022 年 1 月 1 日起,服务器端将默认禁用对于 MD5 认证信息 的兼容。任何使用 MD5 认证信息的客户端将无法连接到禁用 VMess MD5 认证信息的服务器端。
在服务器端可以通过设置环境变量 v2ray.vmess.aead.forced
= true
以关闭对于 MD5 认证信息的兼容。 或者 v2ray.vmess.aead.forced
= false
以强制开启对于 MD5 认证信息 认证机制的兼容 (不受到 2022 年自动禁用机制的影响) 。 (v4.35.0+)
更多详细信息,查看官方说明页:https://www.v2fly.org/config/protocols/vmess.html
解决
服务器端
所以不想进一下了解机制的话,解决办法很简单了,就是把AlertID 改成 0即可。
客户端
两者都改AlertId为0后,重启服务器端v2ray,即可修复错误。