我从事的 Web 服务可能成为拒绝服务攻击的目标。我们已采取一些缓解措施来应对“SYN 洪水”式攻击。但我们的服务还面临其他“应用程序级”攻击,恶意/损坏的客户端可能会反复指示 Web 服务执行昂贵的任务。
我们可以在应用层(即我们的服务器进程中)识别这些滥用客户端。一旦我们的进程识别出滥用客户端连接,我们就会降低对该客户端的服务级别。
一种简单的方法是使用close(2)
、shutdown(2)
或类似方法终止 TCP 连接。但这样客户端就可以立即重新连接(最多可达到为缓解 SYN 洪水而设置的连接数/秒限制),并且由于 TLS 握手和其他连接设置成本,这种重新连接对我们来说成本高昂。我们正在寻找一种方法来暂时阻止客户端与我们的服务交互,但干净的 TCP 连接终止并不能做到这一点。
然而,如果我们的进程能够终止 TCP 连接不干净地,滥用的客户端在重新连接之前会延迟一段时间,从而提供“冷却”期。所谓“不干净的终止”,是指在服务器端关闭 TCP 连接(全双工的两半),而不发送任何FIN
数据包通知客户端终止,也不发送任何引用该连接的进一步数据包。这会延迟客户端,而客户端认为连接仍处于该ESTABLISHED
状态(在 Linux 上为 13-30 分钟)。
但是,我看不到 UNIX/Linux 进程以任何方式不干净地终止 TCP 连接。close(2)
并且shutdown(2)
类似的所有方法似乎都可以干净地终止连接,并且没有提供不干净终止的选项。
UNIX/Linux 中是否存在任何选项可以立即、不干净地终止 TCP 连接,以缓解 DOS 攻击?
答案1
您应该研究的是防火墙和fail2ban
。iptables
这仍然是 Linux 发行版的标准配置,并且fail2ban
可以与大多数服务配合使用。您需要做的是配置fail2ban
使用特定正则表达式模式监视特定日志文件,以了解其中一个“有问题”的客户端何时连接,然后fail2ban
自动添加防火墙规则以丢弃或拒绝连接。fail2ban 可以配置如何保留防火墙规则,以便您可以阻止客户端 5 分钟或 5 天,无论您真正想要什么。
您也可以使用 Web 应用程序防火墙 (WAF) 来处理此类内容。
至于 DOS 攻击,根据攻击方式的不同,您可能无法使用本地防火墙,并且可能必须与上游提供商合作,以黑洞路由或已知存在问题并导致严重服务中断的主机。听起来您不处于这种情况,只是存在潜在的应用层问题需要解决,所以这有点矫枉过正。
答案2
一旦我们的流程识别出滥用的客户连接,我们就会降低对该客户的服务级别。
由于您已经提到建立新连接会产生相关成本,因此我建议您考虑其他方法,而不是终止连接。也许您可以考虑将该连接的速率限制为每分钟 1 字节或类似的速率。使用这种方法,您仍然可以以最低成本让攻击者的资源保持繁忙。如果您有更多时间并想发挥创造力,请将所有此类连接重定向到您环境中的一台服务器,以便其他服务器不会浪费其打开文件限制。正如 Andrew 所提到的,一旦您确认该连接来自攻击者并且可以安全地禁止它几个小时,您还可以考虑使用 fail2ban。