哪吒监控套CDN后agent报错websocket: bad handshake导致无法连接终端的解决方案
前言
自己部署了哪吒监控用来监控服务器状态,然而在一次更换 CDN 之后,发现部分节点无法通过哪吒面板连接终端。
问题排查
我查阅了哪吒面板的文档,进行错误排查。
首先确认了 CDN 启用了 WebSocket 的支持,然后我在无法连接的节点上添加 -d
参数手动运行哪吒 agent。随后在哪吒面板发起终端连接。
再观察 agent 输出,然而并没有提示 x509:certificate signed by unknown authority
,说明不是证书链的问题。
agent 报错 websocket: bad handshake
。
我这时没头绪了啊,CDN 明明是支持 WebSocket 的啊?!
次日,我查阅 CDN 日志发现对应节点存在这样一条请求 GET /terminal/d4c102ec-xxxx-131a-xxxx-xxxxeb92a42d HTTP/1.1
,由于 UserAgent 包含 Go-http-client
而被 CDN 屏蔽,我恍然大悟
问题所在
哪吒面板的在线终端需要 浏览器和目标节点各向管理面板发起一条 WebSocket 连接,而目标节点的请求被 CDN 屏蔽了,就导致了这个问题。
示意图:浏览器 <--WebSocket--> 管理面板 <--WebSocket--> Agent
解决方案
在 CDN 上取消被屏蔽/拉黑的节点 IP,并把所有节点添加到白名单。