Linux上偶尔丢弃SYN数据包

Linux上偶尔丢弃SYN数据包,linux,networking,iptables,Linux,Networking,Iptables,我们运行的Debian内核为2.6.16,启用了iptables。该系统正在运行一个定制的HTTP代理,该代理的负载较轻(在其他站点上使用相同的负载时可以正常工作)。该系统由4台服务器组成,前面是一个具有虚拟IP的负载平衡器,前面是一个由4台ISA 2004计算机组成的阵列,因此基本拓扑为: 客户端->ISA[1-4]->负载平衡器->我们的代理[1-4]->互联网 有时,ISA会向我们发送一个SYN数据包,但没有向其发送SYN-ACK。它将在3秒后重试,第三次在6秒后重试,之后它将报告代理关闭

我们运行的Debian内核为2.6.16,启用了iptables。该系统正在运行一个定制的HTTP代理,该代理的负载较轻(在其他站点上使用相同的负载时可以正常工作)。该系统由4台服务器组成,前面是一个具有虚拟IP的负载平衡器,前面是一个由4台ISA 2004计算机组成的阵列,因此基本拓扑为:

客户端->ISA[1-4]->负载平衡器->我们的代理[1-4]->互联网

有时,ISA会向我们发送一个SYN数据包,但没有向其发送SYN-ACK。它将在3秒后重试,第三次在6秒后重试,之后它将报告代理关闭,并切换到直接连接。在这段时间内,即在这3个SYN之前、之间和之后,来自同一ISA的其他SYN出现并成功响应

其他人报告了一个非常类似的问题(但没有解决方案):

所有这些都来自一种叫做CentOS的Linux风格。它的特点是默认启用iptables

几乎一样:但有点不同:

似乎也与此相关:


我怀疑iptables是罪魁祸首,但欢迎提供任何额外的反馈。

查看listen调用的第二个参数,如您发布的第一个链接所述。这是挂起(尚未接受)连接的最大数量。根据listen(2)手册页,如果协议支持重新传输(TCP支持),则连接请求将在队列已满时被丢弃(期待稍后的重新传输,如果队列中再次有足够的空间,该重新传输将创建连接)。

事实上,iptable就是culPit,使用丢弃无效数据包的规则。我们仍然无法确定是什么使iptables认为这些syn无效(没有时间等待,因为我们在丢弃之前至少30分钟内没有与同一源端口的任何通信)。

这并不能解释对同一端口的其他请求是否成功,当这些请求失败时,其他请求可能会幸运地出现在队列清空一点之后(即,在服务器接受一些挂起的连接之后)。然后下一个SYN可能已经进入,或者在它之后的SYN——但是如果一个SYN没有得到响应,那么这三个SYN都没有得到响应。我发现仅仅靠运气很难解释它。”…靠愚蠢的运气很难解释。”。因此,增加侦听队列的深度,您会发现。