动态阻断高流量站点的ip:最佳策略


Dynamically blocking IPs in high-traffic site: best strategy?

我有一些坏机器人针对我的网站,我需要动态处理这些机器人来自的IP地址。这是一个相当高流量的网站,我们每天有几百万的页面浏览量,这就是为什么我们使用4台服务器(负载均衡)。我们不使用任何缓存(除了资产),因为我们的大多数响应都是唯一的。

代码——从技术上讲,这是一个相当小的PHP网站,没有数据库查询,每个页面浏览一个XML请求。XML请求得到一个非常快速的响应。

我已经开发了一个脚本来(非常频繁地)分析哪些IP地址正在做滥用请求,我想在一定时间内以不同的方式处理来自这些IP的请求。滥用的ip变化很大所以我需要每隔几分钟阻止不同的ip

所以:我看到IP xx.xx.xx.xx是滥用的,我把这个记录在某个地方,然后我想在接下来的x分钟里给这个IP一个特殊的处理。我需要以一种快速的方式完成此操作,因为我不想减慢服务器速度并让合法用户为此而受苦。

方案1:file

将滥用ip写入文件,然后在每次请求时读取该文件太慢了。你同意吗?

方案二:PHP包含

我可以让我的分析脚本写一个PHP包含文件,然后PHP引擎将包含每个请求。但是:我可以想象,在编写PHP文件时,许多用户执行请求后会得到一个错误,因为文件正在被使用。

我可以解决这个潜在的问题,通过写文件,然后做一个符号链接更改(这可能更快)。

方案三:htaccess

另一种区分滥用者的方法是编写一个htaccess来阻止或重定向他们。这可能是最有效的方法,但我需要每隔x分钟写一个htaccess文件。

我很想听听大家对我提出的解决方案的看法/反应,特别是关于速度的问题。

如何动态配置iptables阻止不良ip ?我不认为有任何理由在PHP中做"防火墙"…

对于记录,我最终决定采用(我自己提出的)解决方案2,生成一个包含在每个页面请求中的PHP文件。

完整解决方案如下:Python脚本每隔x分钟分析一次accesslog文件,并对某些IP地址进行"惩罚"。所有当前运行的惩罚都被写入一个相当小(<1Kb)的PHP文件中。这个PHP文件包含在每个页面请求中。在生成PHP文件后,rsync作业将启动,将新的PHP文件推送到负载均衡器后面的其他3个服务器。

在生成PHP文件的Python脚本中,我首先将文件的完整内容连接起来。然后依次打开、写入和关闭文件,以便在尽可能短的时间内锁定文件。

我会认真考虑在内存中放置另一个服务器来保存(不断变化的)块列表,并为前端服务器提供服务。我使用Node.JS实现了这样一个解决方案,发现实现简单,性能非常好。memcached也可以使用,但我从来没有尝试过。