最近遇到一个挺离谱的问题,记录一下排查过程,给以后踩坑的人参考。
我的环境大概是:
- RackNerd VPS
- 3x-ui
- VLESS + TCP + REALITY
- Flow:
xtls-rprx-vision
- Clash Verge
- Cloudflare 只做 DNS 解析,没有开橙云
- REALITY 的目标地址原来是
www.microsoft.com:443
这个节点之前一直正常,后来没有主动修改配置,突然就在 Clash Verge 里测速全部显示 timeout。
一开始以为是域名、Cloudflare、防火墙或者 RackNerd 的端口被封了,但逐项检查后发现都正常:
x-ui 服务是 active
- Xray 正常监听节点端口
- 域名解析到了正确的 VPS IP
- Windows 上测试 TCP 端口可以正常连接
- 关闭 Clash TUN 后,域名也能正常解析到真实 IP
后来在服务器上抓包:
sudo tcpdump -ni any -nn 'tcp port 节点端口'
发现客户端确实连到了服务器,TCP 三次握手也成功了。客户端发送了五六百字节的数据后,服务器马上主动发 FIN 断开连接。
简单说就是:
网络是通的,但 Xray 收到 REALITY 握手后,主动把连接拒绝了。
这时基本可以排除 DNS、Cloudflare、防火墙和端口问题,重点转向 REALITY 握手。
我临时把 Xray 日志等级改成 debug,并给 REALITY 开启 show: true,最后看到关键日志:
Certificate: 8273
isHandshakeComplete.Load(): false
REALITY: processed invalid connection
handshake did not complete successfully
而且日志里显示的客户端 Short ID 和服务端配置是匹配的,所以不是 Short ID 写错。
最后定位到,问题出在 REALITY 的伪装目标 www.microsoft.com:443。
Microsoft 返回的 TLS Certificate 握手记录达到了 8273 字节,REALITY 在处理这类较大的证书记录时握手无法完成。普通的:
xray tls ping www.microsoft.com:443
可能仍然显示握手成功,因为普通 TLS 测试和 REALITY 服务端实际走的处理路径不完全一样,所以这个测试不能完全排除问题。
我的处理方式是把 REALITY 目标换掉。
在 3x-ui 入站设置里,将:
Target / Dest:
www.microsoft.com:443
Server Names:
www.microsoft.com
改为:
Target / Dest:
www.bing.com:443
Server Names:
www.bing.com
UUID、公钥、私钥、Short ID、端口和 xtls-rprx-vision 都不用改。
改之前可以先测试一下:
/usr/local/x-ui/bin/xray-linux-amd64 tls ping www.bing.com:443
我的测试结果是带 SNI 时握手成功。无 SNI 握手失败没有关系,因为 REALITY 客户端本来就会发送 www.bing.com 作为 SNI。
这里还有第二个坑。
我在 3x-ui 面板里保存了很多次,数据库里已经变成了 Bing,但 Xray 实际运行的配置文件仍然是 Microsoft。
检查数据库后看到:
数据库 target/dest = www.bing.com:443
数据库 serverNames = ['www.bing.com']
但检查实际配置:
/usr/local/x-ui/bin/config.json
里面还是原来的:
www.microsoft.com:443
说明面板确实保存进数据库了,但 Xray 没有重新生成配置或者重新加载。
最后手动重启:
sudo systemctl restart x-ui
重启后 Xray PID 发生变化,实际配置也终于变成:
target = www.bing.com:443
serverNames = ['www.bing.com']
节点端口也正常监听。
最后还需要在 Clash Verge 里更新一次订阅,并确认节点配置中的:
servername: www.bing.com
或者:
sni: www.bing.com
已经同步更新,不能还保留 www.microsoft.com。
总结一下,这次实际上有两个问题:
www.microsoft.com 返回的 TLS Certificate 记录过大,导致 REALITY 握手无法完成。
- 3x-ui 面板虽然保存了新配置,但运行中的 Xray 没有自动重新加载,必须手动重启
x-ui。