我们今天早些时候通过DDoS攻击进行了攻击。 在我们的负载平衡器(HAProxy)上,连接的数量是正常的20倍,所有的后端节点在这次攻击中继续下降。
System structure: HAProxy > Squid > Apache (for ModSecurity) > IIS app layer.
在攻击过程中,我注意到Apache中出现了一个MaxClients Reach错误,所以我把这个设置从150提升到了250,似乎有所帮助。 但是,似乎我不得不手动重启Apache以使后端恢复。 袭击持续了大约50分钟。
在攻击开始消退之后,每个节点上最后的Apache重新启动将我们带入绿色,但是现在我正在考虑为什么它首先发生。 在Apache的错误日志中,我看到了很多这样的:
[Wed Jun 22 11:46:12 2011] [error] [client 10.xxx] proxy: Error reading from remote server returned by /favicon.ico [Wed Jun 22 11:46:13 2011] [error] [client 10.xxx] (70007)The timeout specified has expired: proxy: error reading status line from remote server www.example.com
Apache使用默认的保持活动设置(保持活动状态,超时设置为15秒)。 在对HAProxy + keep-alives进行了一些额外的阅读之后,相信DDoS由于启用而恶化是否是一个合理的结论?
虽然HAProxy max连接的方式低于Apache设置的最大值,但也许在20x连接的情况下,以'DOS'方式打开的连接太多了,但是Apache却保持打开状态。
我认为你要追究这种情况的错误潜在的修复。 如果您是DDoS,那么您唯一真正的缓解途径就是与上游提供商交谈,并在stream量到达您的networking之前让它们无效路由/黑洞。 否则,不pipe你做什么,它仍然会达到你的networking的边缘,并有可能(可能)在你的最后饱和连接。
唯一要做的就是在到达networking边缘之前先将其阻塞。 任何types的DDoS缓解scheme都不太可能有用,因为stream量必须先进入您的networking才能被忽略/阻止/丢弃。 因此,它仍然会吃掉你的带宽。
另外,如果实际上没有足够的内存用于所有这些subprocess,那么简单地增加可用的工作者数量会使问题变得更糟。 你将开始交换到磁盘,你的机器将停下来。 惊讶的是,没有人提到mod_evasive或mod_security; 有一些自动启发式来阻止访问计算昂贵的资源,在上游不会或无法路由空间的情况下会有相当的帮助。
编辑:这是一个评论,但我把它变成每@Tom O'Connor的build议的答案。
@Tom O'Connor这不是带宽/ ppstypes的DDoS。 听起来像一个简单的服务拒绝。
保持活力会让事情变得更糟,您在这里遇到的问题是,Apache无法尽快处理请求,并产生许多无法跟上请求的工作人员。 随着这种增长,如果继续攻击,恢复的几率几乎为零。
你可以明显地增加MaxClients指令,但是从你描述的内容来看,它只会让你在一两分钟之后失效。
我不确定你正在运行的是什么栈,但是你的目标是简单地改进对单个请求的响应(你正在运行PHP吗?是否连接到MySQL?你没有caching吗?)页面,在0.010秒内加载响应服务拒绝.vs页面,查找大量的东西在MySQL中,并在每个请求2秒内完成。
如果有人提出了100个请求,你的服务器必须工作200秒,但因为它一次完成2秒/请求现在是40秒/请求* 100。更多的请求,更多的负载。
解决这个问题的另一个方法是确定顶级的xyz连接,并简单地阻止它们,但是这会稍微复杂一点,需要更多的知识来正确地尝试。
在最初的“攻击”之后的几个星期里,这个问题再次出现了几次,我不得不深入挖掘,因为我认为我可能已经使用DDoS作为警务人员。
虽然访问日志和netstat快照(根据追加到日志文件中的连接数来获得排名靠前的N个IP)确实显示了非常分散的IP地址量,但是我能够在访问日志中标识出一个看似可疑的特定页面。
显然,开发团队已经build立了一个“代理”页面,以通过AJAX提供第三方API请求。 问题似乎是这个代理页面在HAProxy上占用了宝贵的连接插槽,并且当第三方服务发生API请求服务问题时,会等待很长时间才能超时。 最终,冗长的代理请求使我们的HAProxy后端达到最大限制(所有新请求都排队)。 从那时起,连接计数开始在我们的networking上build立起来,我们面向公众的网站开始将正常的非AJAX请求超时。
在我们的例子中,解决scheme是专门为这些AJAX调用在HAProxy中创build一个额外的后端。 下一次第三方服务有问题,它只会超时的AJAX代理页面调用,其余的网站将继续嗡嗡声。
感谢您的答案。 我认为你们中的大多数人都在减轻“真正”的DDoS攻击,但是我认为这对于其他读者来说是有帮助的,因为这是值得的,因为这样做是值得的,以确保你不会在自己的脚下投枪。