gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:31:44 26 4
gpt4 key购买 nike

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

现在,在 A 上我们运行 TCP 服务器应用程序,它监听/接受传入连接,然后循环发送大量数据到连接的客户端。如果/当客户端断开连接时,它不会尝试从客户端读取,并且在对套接字执行 write() 时预计会出现 EPIPE 错误。

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

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

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

  • 中断 B 上的 netcat 后,B 将 FIN 发送给 A,A 正确地用 ACK 回复该 FIN - 所以,现在我们有公平的半开 TCP 连接,没问题
  • 接下来,A 尝试使用通常的 ACK 和 PSH,ACK 数据包向客户端发送下一个数据,这也是预期和正确的
  • 但是,B 不以任何方式回复这些数据包(虽然我希望它回复 RST 数据包,因为它接收到已经关闭/不存在的 TCP 连接的数据包)
  • A 没有收到 ACK,所以它停止发送新数据并开始重新发送旧数据包(此时对 write() 的下一次调用挂起)

我还尝试在 A 上运行 netcat(因此客户端和服务器应用程序都在同一台物理服务器上运行),这样一切都按预期工作 - 服务器应用程序在我使用 Ctrl-C 中断 netcat 后立即获得 EPIPE。 tcpdump 显示有按预期发送的 RST 数据包。

那么,这种情况下不发送RST可能是什么原因呢?

我正在使用 Hardened Gentoo Linux,最新的内核 2.6.39-hardened-r8,没有任何特定的 sysctl 网络相关配置。

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

    TCP: Possible SYN flooding on port XXXXX. Sending cookies.
net_ratelimit: 19 callbacks suppressed

这是 TCP session 通常的样子:http://i54.tinypic.com/1zz10mx.jpg

最佳答案

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

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

CONFIG_GRKERNSEC_BLACKHOLE:

如果您在这里选择 Y,则不会发送 TCP 重置和 ICMP 目标不可达数据包以响应发送到不存在关联监听进程的端口的数据包。此功能同时支持 IPV4 和 IPV6,并使环回接口(interface)免于黑洞。启用此功能可使主机对 DoS 攻击更具弹性,并降低网络对扫描器的可见性。实现的黑洞功能等同于 FreeBSD 黑洞功能,因为它阻止对所有数据包的 RST 响应,而不仅仅是 SYN。

关于networking - 什么可能导致不发送 TCP/IP 重置 (RST) 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com