syn无响应情况

问题表象

部分节点通过k8s node节点的svc访问容器内容,部分节点正常,部分节点时好时坏

通过抓包查看 

tcpdump  -i eth0 host 客户端ip and port 29004 -vvv 

发现不通的节点在不通的情况下  发出的seq包到达了k8s node节点  但是k8s node节点没有响应syn

产生原因

当客户端发出的syn包带有时间戳的情况下,经过NAT转换后,如果使用的端口被之前使用过,而且时间戳大于本次syn包中的时间戳。系统将会直接丢弃。造成本次链接无法正常完成TCP/IP的3次握手。    

可能是因为阿里云环境不同网段或者转发有nat,所以造成了这个情况

解决方案

1. 执行命令 vi /etc/sysctl.conf。
2. 添加如下内容:net.ipv4.tcp_tw_recycle=0
   net.ipv4.tcp_timestamps=0。
3. 输入指令 # sysctl -p 使配置生效。 

原理

通过查阅资料,发现tcp_timestamps默认是开启,如果再把tcp_tw_recycle设置为1,则60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。也就是说服务器打开了 tcp_tw_reccycle了,就会检查时间戳,如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,这样服务器肯定不会回复,所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,就出现了开始说的syn不响应。

您可能还喜欢...

发表评论

您的电子邮箱地址不会被公开。