如何避免这样的洪水?

而不是描述发生了什么,我会张贴Apache的服务器状态页面的截图:

截图

这是一个尼日利亚知识产权。

我现在有这个问题多年了,我从来没有find一个可行的解决scheme,除了禁止攻击者的IP和等待挺举通过另一个返回。

这里有一些进一步的解释。 该网站是自定义开发的,只有当用户login到网站时才能访问下载页面,否则将redirect到login页面。 如果用户的日志logging服务相当大的文件。 但是,服务一次后,该网站就有类似于RapidShare的政策,这意味着用户必须等待。 所以第二次访问它只会提供一个错误消息,告诉用户等待。 然而,看起来攻击者不知何故成功地打开了一个连接,然后是另一个,然后是另一个,直到我的服务器上的MySQL窒息并开始抛出错误。

如果这种攻击是已知的,有一个名字,并已知如何避免redirect我的解决scheme。 任何反馈或想法都非常受欢迎,因为我在这里慢慢地发疯。

有很多方法可以使用:

一个特定的工具,设置来帮助这样的情况是mod_evasive :

您可以按照以下标准屏蔽:

  • 请求相同的页面每秒多次
  • 每秒对同一个孩子发出超过50个并发请求
  • 在临时列入黑名单时(在阻止列表中)发出任何请求

另一种方法是在你自己的东西上滚动一些东西,从命令行中删除Apache的状态(非常简单,我之前做过),然后按IP和URLsorting,然后删除它,

否则,我认为唯一的另一个“好”的解决scheme类似于上面提到的那个,loggingIP活动到那个页面上超过5分钟,然后如果你跨越了这个门槛,把脚本拖过去放在那里防火墙。 你也可以不必阻塞它,你可以做如下的事情,这会阻止30次尝试后的新连接(根据适当的eth设备进行调整):

iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 -j DROP 

由于这是一个定制开发的应用程序,你有能力改变它是正确的吗? 如果是这样,也许下面的build议将有所帮助:

  • 使用您的login页面上的validation码( 另一个链接 )来防止机械手进程取消您的服务器。
  • 更改代码,以便每个用户login每个IP只允许两个连接。 不要redirect用户,只要转储大于2的任何连接。如果允许2个连接,那么在客户端发生了导致连接#1中断的情况下,这应该有所帮助。

我有点困惑,为什么这个“攻击者”会不止一次下载文件。 但是有几种方法可以限制这一点:

  1. 在您的代码中创build一个过程,将IP地址添加到标记当前正在下载文件的文件或数据库中,并在当前正在下载或基于时间(例如每5分钟下载一次)的情况下阻止访问。
  2. 安装一个Apache模块来限制每个IP地址的连接。 Mod_limitipconn似乎是为此而devise的。

我认为mod_limitipconn似乎可以解决您目前的问题,但由于这是一个问题,我认为可能是您在网站上运行的代码逻辑的问题。

这听起来像你的应用程序可能是在文件完成后添加时间延迟logging,而不是在启动时允许并行下载。 尽pipe可能在服务器上解决问题,但最好修复应用程序。 正如你所指出的,这只是一个延迟,而不是每个文件一次,你是否考虑过在发送文件之前将状态logging移到? 打开额外下载的窗口将被减less(或取决于你如何编码),作为一个好处,你可能会释​​放数据库连接回池(或closures它,如果你不是池),而不是保持开放,直到完成后logging完成。