我不会描述发生了什么,而是发布 Apache 服务器状态页面的屏幕截图:
这是一个尼日利亚 IP。
我已经遇到这个问题很多年了,除了禁止攻击者的 IP 并等待这个混蛋通过另一个 IP 返回之外,我从来没有找到可行的解决方案。
这里需要进一步解释一下。该网站是定制开发的,只有用户登录网站后才能访问下载页面,否则会重定向到登录页面。如果用户登录,它会提供一个相当大的文件。但是,在提供一次之后,该网站的策略类似于 RapidShare,这意味着用户必须等待。因此,第二次访问时,它只会显示一条错误消息,告诉用户等待。然而,看起来攻击者以某种方式成功打开了一个连接,然后又打开了一个,然后又打开了一个,直到我服务器上的 MySQL 阻塞并开始抛出错误。
如果这种攻击是已知的,有名字,并且有已知的解决方案可以避免它,请重定向我。任何反馈或想法都非常欢迎,因为我在这里慢慢疯了。
答案1
您可以使用以下几种方法:
为解决此类情况而设置的一个特定工具是mod_evasive:
您可以按照以下标准进行阻止:
- 每秒请求同一页面多次
- 每秒对同一个子进程发出超过 50 个并发请求
- 在暂时被列入黑名单(阻止名单)期间发出任何请求
另一种选择是自己做一些事情,从命令行抓取 apache 状态(非常简单,我以前做过),然后按 IP 和 URL 排序,然后放下它,
否则,我认为唯一其他“好”的解决方案与上面提到的解决方案类似,即在 5 分钟内将 IP 活动记录到该页面,然后如果它们超过该阈值,则让脚本爬过并将其放入防火墙中。您也不必阻止它,您可以执行类似以下的操作,这将在 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
答案2
答案3
我有点困惑,为什么这个“攻击者”想要多次下载该文件。不过,有几种方法可以限制这种情况:
- 在代码中创建一个进程,将 IP 地址添加到文件或数据库,标记它当前正在下载文件,并阻止访问当前正在下载或基于时间(例如,每 5 分钟下载一次)的访问。
- 安装一个 apache 模块来限制每个 IP 地址的连接数。Mod_limitipconn似乎是为此设计的。
我认为 mod_limitipconn 似乎可以解决您当前的问题,但由于这是一个开始的问题,我认为您在网站上运行的代码逻辑可能存在问题。
答案4
听起来您的应用程序可能在文件完成后而不是启动时添加时间延迟记录,以允许并行下载。虽然可以在服务器上解决这个问题,但最好修复应用程序。正如您所说,这只是一个延迟,而不是每个文件一次,您是否考虑过将该状态记录移至发送文件之前?打开其他下载的窗口将会减少(或消除,具体取决于您的编码方式),并且作为附带好处,您可能会将数据库连接释放回池(或者如果您没有池化,则关闭它),而不是将其保持打开直到完成后才记录完成。