目录
一、背景:
接到相关人员的反馈,公司OA系统访问很慢经常性访问不到登录页,有时候多刷新几次又可以访问,有时候甚至会出现连接超时报错。
二、证实业务人员反馈的情况:
通过域名访问验证符合业务人员反馈信息,通过公网域名访问OA系统经常性访问异常。通过分析OA系统应用是正常的,并且通过私网访问OA系统正常,访问速度也快。
预想问题:
1、可能域名DNS受到污染,解析异常
2、可能公网丢包导致
三、分析:
1、 检查DNS解析,没有发现异常,网络的运维反馈DNS解析是正常的
2、实在是想不到办法了,只能通过抓包分析了
下载Wireshark软件,过滤调条件为域名,通过PC访问OA系统公网域名,抓包期间发现,访问OA公网域名,也是有时候能访问正常,有时候刷新好几次才能访问到首页,有时候甚至出现连接超时
此时抓包看到的结果是,竟然三次握手没成功,出现了两个怀疑结果:tcp port number reuse 和 tcp retransmission。 好家伙竟然三次握手发生了重传,重新发起了三次我收的请求,没有收到服务端的确认应答。怀疑是服务端过多的会话连接导致失败,但是通过 netstat -nao |grep 443 没有发现很多连接,并且服务器负载也正常,为什么会三次重传呢?
抓包的情况见下图:
一头雾水,为什么三次握手失败,但是通过内网地址访问三次握手正常,这个问题一直在脑子里回响,没招了,只能拿出终极武器了,打开了浏览器问度娘,通过一段时间的查阅资料,最终找到了一条让我豁然开朗的博客,内容提到了该博主在云主机上映射了公网,一定要注意NAT的问题,在服务器参数上关闭net.ipv4.tcp_tw_recycle。 否则从一个ip来的不同客户端请求很有可能导致大量请求失败并且从其他博客资料找到云服务器NAT环境必须为0
https://blog.csdn.net/weixin_43192403/article/details/114780273
解决阿里云服务器偶尔连接不上的问题(由tcp_tw_recycle参数引发的)_杀神Q的博客-CSDN博客_阿里云服务器连接不上
查看映射了该域名公网的服务器Nginx,发现 net.ipv4.tcp_tw_recycle = 1
四、问题解决
修改OA系统映射了公网地址的Nginx服务器参数(NAT):
修改 linux /etc/sysctl.conf
## 修改 linux /etc/sysctl.conf sysctl -p
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0
修改完成后需要刷新内核参数生效:
## 刷新内核参数
sysctl -p
五、验证
NAT映公网,修改NAT环境 net.ipv4.tcp_tw_recycle = 0 后,系统访问正常,并且抓包未发现三次握手失败的现象,并且此后一个月时间观察都未曾出现公网访问异常现象,每次访问OA系统都能正常访问,并且访问速度较快。
timestamp扩展:
同时开启timestamp(时间戳)和tw_recycle(快速回收),会导致在一个MSL时间内只响应timestamp递增的请求,对于时间戳较小的请求都抛弃了(不响应ack)
MSL扩展: RFC793中规定MSL为2分钟,也就是说2分钟内同一个ip的请求的时间戳要求递增,不是递增的话服务器不予响应。