我正在运行一个大型 WordPress 多用户网站。我在 WordPress 应用服务器前面有一个 varnish 缓存。由于缓存 POST 请求毫无意义,因此我很容易对 varnish 缓存服务器使用大量 POST 来实施 DDoS 攻击。
我尝试设置防火墙规则,只接受每个客户端的 20 个同时连接,但这会对共享代理后面的用户和同一网关后面有大量用户的学校产生影响。
Varnish 没有对 POST 数量进行速率限制的选项,我想在 POST 到达应用服务器之前进行速率限制。有没有可以完成这项工作的小型透明代理?
目前 Varnish 每秒接收大约 100-150 次点击,代理至少应该能够处理这个负载。
答案1
我之所以把这个作为答案,只是因为它会很长。正如你非常准确地说的那样,阻止来自 1 个 IP 的 20 个以上并发请求不会奏效。你必须设置“更智能”的标准。我甚至可以说,在代理和应用程序服务器之间放置另一个代理既不优雅也不实用。
我不知道你为什么要在访问 Apache 之前进行速率限制,因为你错过了fail2ban
、、 (高度具体)和其他解决方案。此外mod_qos
,mod-antiloris
我不知道 POST 请求是否是你遇到的唯一 DDoS 问题。
缓存 POST 请求回复是可能的,也是有意义的。除非您每次都提供动态内容。当然,这并不意味着您可以缓存经过身份验证的页面。
如果请求花费的时间超过 5 秒,您可以对 POST 应用请求超时。尽管连接速度较慢的用户无法发布任何内容。您还可以结合上述规则,针对每个 URL 应用规则。这很有意义,因为用户在文件上传页面上发布 1000kb 是合理的,但在登录页面上则不行。正如我所说,创建“更智能”的标准。它们可能很长,制定它们可能需要一些时间,但它们将为您提供可持续的解决方案,因为我不知道在这种情况下是否有一种万能的解决方案。
另一个可以结合使用的解决方案是应用程序防火墙。它可能比你所需要的更多,但它也可以保护你免受许多其他事物的侵害。这是一个带有建议的 owasp 页面和相关维基
varnish
编辑:我不得不承认,我对该配置(和)没有任何经验antiloris
。迟早,varnish 可以缓存的内容太多了(尽管它具有高度“可编程性”)。你能做的主要事情是了解使用模式以及何时偏离常态。如果你只是想防止这种非常特殊的攻击,那么为 Varnish 编写更好的规则应该可以做到。然而,请求到达 apache 并不是一件坏事,只要你有适当的 mods/confs,Apache 就可以判断请求何时合法,从而处理它,何时不处理。阻止来自每个客户端的 X 个连接不是一件好事,除非你可以明确将该 IP 列入黑名单。你可以在 apache 上通过 fail2ban(regex) 或修改服务质量
答案2
我认为,正确配置的 Varnish 可以很好地完成这项工作。
我对 wordpress 了解不多,但我认为有效的帖子会在 cookie 或表单参数中有一个会话变量。如果是这样,您要限制的是重复的 POST 值相同,或没有此值的 POST。
我在这里发表了一篇博客文章:http://blog.dansingerman.com/post/4604532761/how-to-block-rate-limited-traffic-with-varnish基于 IP 地址或 URL 参数的速率限制;应该可以直接针对 POST 进行定制,并基于表单变量或 cookie 变量进行定制。