Networking 什么可能导致TCP/IP重置(RST)标志不发送?

Networking 什么可能导致TCP/IP重置(RST)标志不发送?,networking,tcp,ip,Networking,Tcp,Ip,我有两个linux服务器(让我们把它们命名为A和B),它们连接到同一个(非托管)交换机。我在两台服务器上都禁用了防火墙(所有表中都没有规则,所有默认策略都设置为接受)。因此,没有什么可以阻止一台服务器发送任何TCP/IP数据包,另一台服务器按原样接收这些数据包 现在,我们在一个TCP服务器应用程序上运行,该应用程序侦听/接受传入的连接,然后在循环中向连接的客户端发送大量数据。它不会尝试从客户端读取数据,并且在客户端断开连接时,在对套接字执行write()操作时会出现EPIPE错误 接下来,在B上

我有两个linux服务器(让我们把它们命名为A和B),它们连接到同一个(非托管)交换机。我在两台服务器上都禁用了防火墙(所有表中都没有规则,所有默认策略都设置为接受)。因此,没有什么可以阻止一台服务器发送任何TCP/IP数据包,另一台服务器按原样接收这些数据包

现在,我们在一个TCP服务器应用程序上运行,该应用程序侦听/接受传入的连接,然后在循环中向连接的客户端发送大量数据。它不会尝试从客户端读取数据,并且在客户端断开连接时,在对套接字执行write()操作时会出现EPIPE错误

接下来,在B上,我运行nc(netcat)作为客户端应用程序,连接到A上的服务器应用程序,开始接收数据,几秒钟后,我按Ctrl-C中断此连接

我看到的是,服务器上的应用程序只是挂起在write()中,它没有EPIPE或任何其他错误

我已经使用tcpdump跟踪了TCP/IP数据包,下面是我看到的:

  • 在中断了B上的netcat之后,B将FIN发送给A,A正确地用ACK回复该FIN-所以,现在我们已经公平地半开放了TCP连接,这是正常的
  • 接下来,A尝试使用通常的ACK和PSH、ACK数据包向客户端发送下一个数据,这也是预期的和正确的
  • 但是,B不以任何方式回复这些数据包(我希望它以RST数据包回复,因为它接收到的数据包是已经关闭/不存在的TCP连接)
  • A没有收到ACK,因此它停止发送新数据并开始重新发送旧数据包(此时,对write()的下一个调用挂起)
我还尝试在上运行netcat(因此客户端和服务器应用程序都在同一个物理服务器上运行),通过这种方式,一切都按预期运行-在我使用Ctrl-C中断netcat后,服务器应用程序立即获得EPIPE。tcpdump显示有按预期发送的RST数据包

那么,在这种情况下,是什么原因导致不发送RST

我使用的是硬化GentooLinux,是最新的内核2.6.39-hardend-r8,没有任何特定的sysctl网络相关配置

注意到这些服务器上存在大量的网络活动可能很重要,也可能不重要,
netstat-alnp
随时列出大约5000个tcp连接,我想平均每秒打开和关闭1000个连接。在内核日志中通常会看到类似的内容(但端口号与上面讨论的服务器应用程序使用的端口号不同):


TCP会话通常是这样的:

此行为是我的强化内核中启用的功能的结果:

Security options  --->
    Grsecurity  --->
        Network Protections  --->
        [*] TCP/UDP blackhole and LAST_ACK DoS prevention
CONFIG_GRKERNSEC_黑洞:


如果您在这里说Y,则TCP重置和ICMP目标不可访问的数据包都不会发送,以响应发送到不存在相关侦听进程的端口的数据包。此功能同时支持IPV4和IPV6,并免除环回接口的黑洞攻击。启用此功能可使主机更能抵御DoS攻击,并降低扫描程序对网络的可见性。所实现的黑洞功能相当于FreeBSD黑洞功能,因为它防止RST响应所有数据包,而不仅仅是SYN。

在其他站点上讨论:1)netcat退出后,netstat不再在服务器B上列出它的连接(而我认为它应该在FIN_WAIT_2状态下列出),在服务器上,netstat仍然以关闭等待状态显示此连接,如预期的那样;2) 有人认为这可能是因为SO_LINGER,但我不同意,因为netcat不会手动激活SO_LINGER,并在退出()之前关闭(),所以它不应该自动激活,而且SO_LINGER也不会影响传入数据包的ACK/RST回复。看起来像旧内核(2.6.28-hardend-r9)按预期工作-发送RST数据包。
Security options  --->
    Grsecurity  --->
        Network Protections  --->
        [*] TCP/UDP blackhole and LAST_ACK DoS prevention