最近因为无法到职场办公,所以在家使用VPN远程办公,在这期间其中一个测试环境遇到这样一个问题,服务器部署了Tomcat的Docker服务,访问Tomcat服务的时候总是间歇性出现无法访问的情况,在排除业务代码这一个因素后,一开始以为可能是因为最近在家办公人数较多,公司做了某些网络限制或者VPN有问题,但仔细思考过后觉得应该有其它原因,因为其它测试环境没有出现这样的问题。之后在Tomcat部署的服务器上使用tcpdump命令进行抓包,在Wireshark中使用源IP和目标IP加443端口进行包的过滤,发现即使在访问失败情况下服务器 上是有本机发起握手的包的,只是服务器一直没有回复ACK,在网上查看了几篇文章过后最终将问题定位在如下两个Linux内核参数tcp_timestamps和tcp_tw_recycle,大致的意思是如果在两个参数在同时配置为1的情况下服务器会缓存一些包的时间戳,如果新到达的包时间戳小于之前缓存的时间戳就会被丢弃,而在NAT环境中包的时间戳会出现时间戳混乱。
查看tcp_timestamps和tcp_tw_recycle参数当前配置的方法。
cat /proc/sys/net/ipv4/tcp_timestamps
cat /proc/sys/net/ipv4/tcp_tw_recycle
修改tcp_timestamps和tcp_tw_recycle参数配置的方法。
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle