全站加速WebSocket偶发访问失败-劫持行为

简介: 对于能复现的问题,可以尝试抓包分析具体的请求得出结论。劫持行为可以通过配置HTTPS来改善。

问题描述

客户使用DCDN的WebSocket业务,偶发出现无法访问的情况,线上有1%左右的失败率。根据客户沟通,该问题并不是必现的,目前是其中一位同事家里的wifi网络下能复现问题,而且重启家里的光猫以后能正常,但一段时间以后又会出现问题。

问题排查

1. 客户端信息

尝试让客户复现问题,提供客户端的Netwrok信息和客户端抓包信息。从抓包信息看,是源站响应了500。进一步跟客户确认源站逻辑,根据客户的反馈是源站会先校验Upgrade: websocket 这个请求头,如果没有这个请求头就会返回500。但是奇怪的是,根据抓包文件看,客户端明明是带了Upgrade: websocket请求头的,因此怀疑是DCDN节点转发的问题。

根据WebSocket的RFC协议文档可以知道

  1. Websocket请求必须包含一个Upgrade header字段,它的值必须包含"websocket"。
  2. WebSocket请求必须包含一个Connection header字段,它的值必须包含"Upgrade"。

2. 模拟访问测试

根据抓包信息,使用curl指定到对应的DCDN请求模拟发WebSocket请求测试,发现在客户侧能稳定复现的情况下,我们curl测试并不能复现,排查来看又跟节点没有关系。

curl -sv 'http://xxx.xxx.com/' -H'Connection: Upgrade' -H'Upgrade: websocket' -H'Sec-WebSocket-Key: pCnMykJwUTQB14FCbP2Beg==' -H'Sec-WebSocket-Version: 13' -H'Origin:http://xxx.xxx.com' -H'Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits' -H'Accept-Encoding: gzip, deflate' -x 116.253.29.212:80

3. 源站打印

尝试让客户在源站侧加一下打印,将收到的请求头打印出来,从源站的打印来看,出问题的时候的确是没有收到Upgrade: websocket头。而如果是正常的请求,源站是能打印出Upgrade: websocket头的。如果尝试在源站侧去掉这个Upgrade的校验,虽然可以请求成功,但是无法进行WebSocket通信,因为整条链路并不是走的WebSocket。

3. 排查CDN日志

排查后台CDN的日志,发现正常请求的hit_info字段显示的是WS,也就是走的WebSocket请求。而异常请求的hit_info字段是dynamic,也就是走的动态加速,并不是WebSocket。从现象分析来看,怀疑是L1收到的请求里就没有Upgrade: websocket相关的头,所以L1认为这不是WebSocket请求,走的是普通的动态加速,转发回源站也不会带Upgrade头。

4. DCDN侧增加debug日志

由于日志里并没有记录收到的客户端Upgrade字段,因此需要后台加一下debug日志,打印下该字段。

5. 重新复现问题

重新让客户复现了一次问题,并提供客户端抓包数据。从抓包数据看,客户端请求确实带了Upgrade头,而从DCDN的日志来看,确实是没有收到Upgrade头的,因此走的也是普通动态加速请求。同时从客户端收到的来自DCDN的报文看,这个TTL是64,这明显是不正常的。正常情况由于DCDN节点发出的报文TTL原始值是64,中间每经过一个网络路由节点,TTL减1,客户端收到的报文TTL不应该是64。因此判断是客户端存在劫持行为,走了代理,应该是客户端发出请求以后客户端层面做了异常转发,按照普通的HTTP请求转发,没有转WebSocket相关头导致的。

问题解决

配置HTTPS证书,客户端走wss请求以后,客户侧能复现问题的现场就正常了,无法再复现问题,而且线上错误率明显改善。

适用产品

DCDN

目录
相关文章
|
Web App开发 应用服务中间件 nginx
|
网络协议 Java 关系型数据库
如何公网远程访问本地WebSocket服务端
如何公网远程访问本地WebSocket服务端
172 0
|
网络协议 Java 应用服务中间件
如何将本地websocket发布至公网并实现远程访问服务端
如何将本地websocket发布至公网并实现远程访问服务端
620 0
|
应用服务中间件 nginx
通过nginx访问连接websocket 错误 failed: Error during WebSocket handshake: Unexpected response code: 400
通过nginx访问连接websocket 错误 failed: Error during WebSocket handshake: Unexpected response code: 400
1918 0
|
安全 CDN
阿里云CDN产品解读及全站加速在游戏行业的最佳实践!
阿里云CDN(内容分发网络)为全球用户提供快速、稳定、安全的内容分发加速服务,显著提升访问响应速度和成功率
277 14
|
云计算 CDN
阿里云产品体系分为6大分类——云计算基础——CDN与边缘——全站加速DCDN
阿里云产品体系分为6大分类——云计算基础——CDN与边缘——全站加速DCDN自制脑图
325 1
阿里云产品体系分为6大分类——云计算基础——CDN与边缘——全站加速DCDN
|
边缘计算 缓存 网络协议
|
缓存 开发框架 前端开发
CDN - 阿里云CDN全站加速,说说动态加速那些事
CDN - 阿里云CDN全站加速,说说动态加速那些事
2575 0
CDN - 阿里云CDN全站加速,说说动态加速那些事
《阿里云产品手册2022-2023 版》——全站加速
《阿里云产品手册2022-2023 版》——全站加速
226 0
|
弹性计算 编解码 负载均衡
阿里云全站加速DCDN降价6-30%
阿里云全站加速DCDN降价6-30%,阿里云产品大规模调价,核心云产品价格全线下调,技术红利释放核心产品最高降幅50%,以下产品的价格调整将于2023年5月7日生效,最终以产品详情页实际情况为准,阿里云百科分享阿里云官网发布的降价产品及降价幅度说明:
386 0