一.问题描述: 客户反馈AD虚拟服务业务系统无法访问,节点池状态异常
二.处理过程: 1、远程查看发现业务系统对应的节点池状态有不停故障的情况。 端口是正常的,能到输入密码的界面;
2、进入设备后台随机挑选一个故障节点10.202.7.9,抓包发现tcp连接建立异常,设备发起syn以后,后端服务器没有应答;
3、沟通了解到AD负载设备到服务器中间是二层的,排除网络问题,且服务器上应用状态是正常的。怀疑可能是时间戳问题导致;
4、AD网口上增加浮动ip地址,扩大业务访问的源地址范围,业务状态没有明显改善。
5、协调客户在业务服务器上执行netstat -s |grep reject,结果如下,确实有由于时间戳拒绝tcp连接的情况。
6、开始是打算让业务服务器上关闭时间戳的校验功能,但是后面客户反馈应用那边要求开启。最终建议在AD上调整四层虚拟服务的tcp策略,时间戳动作为抹除。作用是如果客户端的请求携带时间戳,在AD设备snat后往服务器转发的时候抹除掉时间戳的参数。
调整以后观察测试业务访问恢复正常
三.根因 应用服务器上开启了校验时间戳的策略,tcp_tw_recycle/tcp_timestamps都开启的条件下,同一源ip主机的socket connect请求中的timestamp必须是递增的。服务器收到的请求校验时间戳的时候如果发现这个值没有大于前一个请求的值,就会拒绝掉这个syn请求,表现为服务器不应答syn请求。 服务器开启了时间戳,业务访问在snat的环境下,此类问题比较容易出现
四.解决方案 服务器上不开启时间戳校验,或者确保服务器收到的请求都不带时间戳,当前贵单位是通过AD的tcp优化策略抹除客户端的时间戳参数解决。
五.建议 AD配置虚拟服务时,询问客户业务服务器是否同时开启了tcp_tw_recycle/tcp_timestamps,如果同时开启,建议客户关闭tcp_timestamps,如客户由于业务原因不能关闭,可在AD的TCP优化策略里抹除时间戳。
|