记录下工作中遇到的中继服务做端口映射遇到的问题
起因:由于公司的远控有外网的需求,为了保证控制两端的接口复用,我们使用了两个代理和一个中继服务器,其架构为,使用一个ClienAgent来与中继服务器通信,获取被控制端的相关信息,然后控制端客户端直接连接中继服务器,并携带被控制端的信息,由中继服务器完成一条控制端与被控端的链接;每一个被控端都需要自己连接中继器并上报自己的信息;
中继服务器上的中继服务一般会通过端口映射的方式,将服务映射到外网上;前不久,某个客户反应通过中继做远控,刚出现远控初始化界面时,连接就断开了。
起初,我认为是中继服务器自身存在网络问题,通过日志排查,发现中继读取数据返回的错误码为10054(在这里吐槽一句,客户的服务器使用的是**windows ** server,排查windows服务器真有种无从下手的感觉);根据错误码显示,连接的断开原因是远端异常关闭了,而且根据响应的套接字可以确定是被控制端关闭,我又不得不赶紧去排查被控制端的代理,结果发现被控制端代理也返回了10054错误码;
到这里,我又就有点郁闷了,按理来说不会两边都同时返回10054的错误码,不过好在,我能够确定是中继器和被控端之间出现了异常;解决问题最好的方法就是先模拟出来问题,首先,我写了一个tcp客户端,连接到中继服务器,并不停的发送消息,发现连接并未断开,然后我又通过修改服务器代码,让他回显我的客户端的数据,发现两边都未断开,而关于服务端各种压力的问题最先就排除了,因为测试异常用的是一条连接,铁定是数据的原因了。
既然常规数据不行,那只能模拟远程控制数据包了,没想到一下子就捅到点子上了;在发送远程模拟包时,远程双方交互有一个交互结束确认包,为四个字节,分别是0x00 0x00 0x00 0x03,客户端一旦发送这四个字节到中继服务,两边就会异常断开,并且服务器和客户端同时会发送RST,并且根据路由的ttl分析,发生异常是明显经过的路由节点少了,很明显异常发生在防火墙和服务器之间的中间设备上;为此只能一台台中间设备抓包调试了;
最终解决:最后发现是华为设备的网络准入限制,将0x00 0x00 0x00 0x03识别为steam游戏数据,该数据被准入策略禁用了!!
记录下自己的日常供多年后遇到重复问题有个参考