问题:
我管理着一个网站,它有很多动态生成的页面。每天,来自 Google、Yahoo 和其他搜索引擎的机器人会下载 100K 以上的页面。有时我会遇到“黑客”试图大量下载整个网站的问题。
我想阻止“黑客”的 IP 地址,同时阻止搜索引擎机器人抓取页面。最好的方法是什么?
注意:
我现在正在按如下方式解决问题。我每隔 X 秒将每个页面请求的 IP 保存到一个文件中。我有一个 crontab 脚本,每 30 分钟计算一次重复的 IP。对于重复次数过多的 IP,脚本会检查主机名 - 如果它不属于 Google/Yahoo/Bing/等,那么我们就有禁止的候选者。但我不太喜欢我的解决方案,我认为自动禁止可以做得更好,或者使用一些开箱即用的解决方案。
答案1
您没有说明您的操作系统,因此我很乐意告诉您 OpenBSD 版本:pf.conf
在您的规则集中放置类似以下内容(每 10 秒最多 100 个连接):
表 <bad_hosts> 持久化 快速阻止来自 <bad_hosts> 通过 $ext_if proto tcp 传递到 $webserver 端口 www 保持状态 \ (最大源连接速率 100/10,过载 <bad_hosts> 刷新全局)
您可以添加一个白名单和一个 cron 作业,在一两天后从 bad_hosts 中踢出地址。
答案2
我原本以为 fail2ban 就是答案。
你可以使用白名单以防止搜索引擎被封锁。
答案3
看一下简单事件相关器。它可以在一段时间内看到一定数量的与正则表达式匹配的行后自动运行命令(即向 中添加阻止iptables
)。它还可以定义过期的“上下文”。当上下文过期时,您可以解除相关 IP 的阻止(即从 中删除iptables
)。