我有两个linux服务器(让我们将它们命名为A和B),连接到同一个(非托管)交换机.我在两台服务器上都禁用了防火墙(所有表中都没有规则,所有默认策略都设置为ACCEPT).因此,没有什么可以阻止一个服务器发送任何TCP/IP数据包和另一个服务器来接收它们.
现在,在A上,我们运行TCP服务器应用程序,它监听/接受传入的连接,然后在循环中将大量数据发送到连接的客户端.它不会尝试从客户端读取,并且如果/当客户端断开连接时,期望在对套接字执行write()时获得EPIPE错误.
接下来,在BI运行nc(netcat)作为客户端应用程序,连接到A上的服务器应用程序,开始接收数据,几秒钟后我按Ctrl-C中断此连接.
我看到的是,A上的服务器应用程序只是在write()中挂起,它没有获得EPIPE或任何其他错误.
我使用tcpdump跟踪TCP/IP数据包,这是我看到的:
我也尝试在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
Run Code Online (Sandbox Code Playgroud)
以下是TCP会话通常的样子:http://i54.tinypic.com/1zz10mx.jpg
此行为是我的强化内核中启用功能的结果:
Security options --->
Grsecurity --->
Network Protections --->
[*] TCP/UDP blackhole and LAST_ACK DoS prevention
Run Code Online (Sandbox Code Playgroud)
CONFIG_GRKERNSEC_BLACKHOLE:
如果您在此处选择“是”,则不会发送 TCP 重置或 ICMP 目标不可达数据包来响应发送到不存在关联侦听进程的端口的数据包。该功能同时支持IPV4和IPV6,并且可以使Loopback接口免于黑洞。启用此功能可以使主机更能抵御 DoS 攻击,并降低扫描仪的网络可见性。所实现的黑洞功能相当于 FreeBSD 黑洞功能,因为它阻止对所有数据包的 RST 响应,而不仅仅是 SYN。
归档时间: |
|
查看次数: |
3109 次 |
最近记录: |