背景
服务器、客户端所在网络环境均为NAT模式。
案例环境信息
服务器操作系统:Centos 7.9
客户端操作系统:Windows 10 专业版
客户端浏览器:Google Chrome
现象
- 客户端会不定时出现:无法访问此网站,XXX.XXX的响应时间过长,报错代码:ERR_CONNECTION_TIMED_OUT
- 当客户端出现无法访问网站时,同一时刻用手机上网访问同一个站点时能正常访问,同时ping目标网站也能正常ping通。
排查过程
- 当网站不能访问时,检查服务器出口及客户端出口带宽是否被占满,发现流量正常,带宽未占满。
- 在客户端进行长ping,能正常ping通,且延时较低。
- 使用其他网络环境发现可以正常访问。
- 在客户端进行抓包,解析抓包数据显示第一个数据包发送就存在TCP重传包:TCP RETRANSMISSION
- 第一个数据发送就存在TCP重传,说明在规定的时间内,服务器并未回包。
- 网上查询相关资料,得知在NAT网络环境中,Linux服务器内核参数配置TCP快速回收【net.ipv4.tcp_tw_recycle = 1】和TCP时间戳【net.ipv4.tcp_timestamps = 1】,多个客户端使用同一个外网IP地址访问服务器时,NAT网络传输的数据包时间戳存在乱序可能,导致服务器认为数据包不可信从而丢弃。
- 检查WAF服务器及后端服务器发现均配置了内核参数:
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1
解决方案
在WAF服务器及后端服务器取消TCP快速回收和TCP时间戳配置
- 修改sysctl.conf文件
vim /etc/sysctl.conf
2.修改配置
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0
3.应用生效
sysctl -p
验证
多个客户端对网站进行大量访问操作,以及使用JMeter进行长达30分钟压测,均未出现无法访问网站,问题解决。