今天早些时候,我们遭受了一次 DDoS 攻击。我们的负载均衡器 (HAProxy) 上的连接数是正常情况下的 20 倍,并且在这次攻击期间,所有后端节点都持续处于瘫痪状态。
System structure: HAProxy > Squid > Apache (for ModSecurity) > IIS app layer.
在袭击过程中,我注意到已达到 MaxClientsApache 中出现错误,所以我将设置从 150 提高到 250,这似乎在一定程度上有所帮助。但是,似乎我必须不断手动重启 Apache 才能让后端恢复。攻击持续了大约 50 分钟。
在攻击开始减弱后,每个节点上的最后一次 Apache 重启使我们恢复正常,但现在我正在调查为什么会发生这种情况。在 Apache 的错误日志中,我看到了很多这样的错误:
[Wed Jun 22 11:46:12 2011] [error] [client 10.x.x.x] proxy: Error reading from remote server returned by /favicon.ico
[Wed Jun 22 11:46:13 2011] [error] [client 10.x.x.x] (70007)The timeout specified has expired: proxy: error reading status line from remote server www.example.com
Apache 使用默认的保持连接设置(保持连接已启用,超时设置为 15 秒)。在阅读了有关 HAProxy + 保持连接的一些其他内容后,相信启用保持活动功能会使 DDoS 攻击恶化,这是一个合理的结论吗?
虽然 HAProxy 最大连接数远低于 Apache 中设置的最大值,但是也许 20x 连接数以旧的 DOS 方式打开了太多连接,但 Apache 仍保持它们打开。
答案1
我认为你正在为这种情况寻找错误的潜在解决方案。如果你遭到 DDoS 攻击,那么唯一真正的缓解途径就是与上游提供商沟通,让他们在流量到达你的网络之前将其路由为空/黑洞。否则,无论你做什么,它仍然会到达你的网络边缘,并且可能(可能)使你这边的连接饱和。
唯一要做的就是在它到达网络边缘之前阻止它。任何类型的 DDoS 缓解方案都不太可能有用,因为流量必须先进入您的网络,然后才能被忽略/阻止/丢弃。因此,它仍然会占用您的带宽。
答案2
此外,如果实际上没有足够的内存供所有这些子进程使用,那么简单地增加可用工作进程的数量可能会使问题变得更糟。您将开始交换到磁盘,并且您的机器将停止运行。令人惊讶的是,没有人提到 mod_evasive 或 mod_security;在上游不会或不能进行空路由的情况下,使用一些自动启发式方法来阻止对计算资源的访问会有很大帮助。
编辑:这是一个评论,但我根据@Tom O'Connor 的建议将其变成了答案。
答案3
@Tom O'Connor 这不是带宽/pps 类型的 DDoS。在我看来,这听起来像是简单的服务拒绝。
保持活动会使情况变得更糟,这里的问题是 Apache 无法以应有的速度处理请求,并会产生大量无法跟上请求的工作进程。随着这种情况的增加,如果攻击继续,恢复的可能性几乎为零。
您显然可以增加 MaxClients 指令,但从您所描述的情况来看,它只会让您在一两分钟后停机。
我不确定您正在运行什么堆栈,但您的目标是简单地改善 Apache 对单个请求的响应(您正在运行 PHP 吗?它是否连接到 MySQL ?您没有缓存吗?)在 0.010 秒内加载的页面将对服务拒绝 .vs 页面的响应好 100 倍,该页面在 MySQL 中查找大量内容并每个请求在 2 秒内完成。
如果有人发出 100 个请求,您的服务器必须工作 200 秒,但由于它是一次性完成所有请求,因此 2 秒/请求现在变成了 40 秒/请求 * 100。请求越多,负载就越大。
解决这个问题的另一种方法是识别顶部 xyz 连接并简单地阻止它们,但这会更棘手一些,需要更多的知识才能正确尝试。
答案4
在初次“攻击”后的几周内,该问题又出现了几次,我不得不深入挖掘,因为我认为我可能一直在使用 DDoS 作为借口。
虽然访问日志和 netstat 快照(按附加到日志文件的连接数排序的前 N 个 IP)确实显示了非常分散的 IP 地址数量,但我能够在访问日志中识别出看似可疑的特定页面。
显然,开发团队已经构建了一个“代理”页面,以便通过 AJAX 提供第三方 API 请求。问题似乎是这个代理页面占用了 HAProxy 上宝贵的连接槽,当第三方服务在提供 API 请求时出现问题时,它会等待很长时间才能超时。最终,冗长的代理请求使我们的 HAProxy 后端达到最大限制(因此所有新请求都排队)。从那时起,我们的网络上的连接数开始增加,我们面向公众的网站开始超时正常的非 AJAX 请求。
在我们的案例中,解决方案是在 HAProxy 中专门为这些 AJAX 调用创建一个额外的后端。下次第三方服务出现问题时,它只会使 AJAX 代理页面调用超时,而网站的其余部分将继续正常运行。
谢谢您的回答。我认为你们大多数人对于缓解“真正的” DDoS 攻击的回答都是正确的,但我认为让其他读者知道值得进行内部检查以确保不会自食其果是有帮助的。