在Linux上偶尔会丢弃SYN数据包



我们运行的Debian内核为2.6.16,并启用了iptables。该系统正在运行一个定制的HTTP代理,该代理会受到轻微的负载(在其他网站上,它可以很好地处理相同的负载)。该系统由4台服务器组成,前面有一个带虚拟IP的负载均衡器,前面有4台ISA 2004机器,因此基本拓扑结构为:

客户端->ISA[1-4]->Load Balancer->Our Proxy[1-4]->互联网

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

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

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

http://www.linuxhelpforum.com/showthread.php?t=931912&模式=线性http://www.centos.org/modules/newbb/viewtopic.php?topic_id=16147

几乎相同:但有点不同:http://www.linuxquestions.org/questions/linux-networking-3/tcp-handshake-fails-synack-ignored-by-system.-637171/

似乎也很相关:http://groups.google.com/group/comp.os.linux.networking/browse_thread/thread/b1c000e2d65e0034

我怀疑iptables是罪魁祸首,但欢迎任何其他反馈。

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

事实上,iptables原来是culrpit,其规则是丢弃INVALID数据包。我们仍然不确定是什么让iptables认为这些SYN无效(当然没有TIME_WAIT,因为在丢弃之前,我们至少有30分钟没有任何具有相同源端口的流量)。

最新更新