【问题标题】:Dynamically blocking IPs in high-traffic site: best strategy?在高流量站点中动态阻止 IP:最佳策略?
【发布时间】:2011-12-21 05:17:00
【问题描述】:

我有一些针对我的网站的不良机器人,我需要动态处理这些机器人所来自的 IP 地址。这是一个非常高流量的网站,我们每天获得数百万的网页浏览量,这就是我们使用 4 台服务器(负载均衡)的原因。我们不使用任何缓存(资产除外),因为我们的大多数响应都是独一无二的。

从代码技术上讲,它是一个非常小的 PHP 网站,它不进行数据库查询,并且每次浏览量都需要一个 XML 请求。 XML 请求得到一个非常快速的响应。

我开发了一个脚本来(非常频繁地)分析哪些 IP 地址正在执行滥用请求,并且我想在一段时间内以不同的方式处理来自这些 IP 的请求。滥用的 IP 变化很大,所以我需要每隔几分钟屏蔽不同的 IP

所以:我看到 IP xx.xx.xx.xx 存在滥用行为,我将其记录在某处,然后我想在接下来的 x 分钟内对该 IP 进行特殊处理。我需要快速执行此操作,因为我不想降低服务器速度并让合法用户为此受苦。

解决方案 1:文件

将滥用 IP 写在一个文件中,然后为每个请求读取该文件似乎 太慢了。你同意吗?

解决方案 2:PHP 包含

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

我可以通过编写文件然后进行符号链接更改来解决这个潜在问题(这可能会更快)。

解决方案 3:htaccess

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

我很想听听关于我提出的解决方案的一些想法/反应,尤其是关于速度方面。

【问题讨论】:

  • 同意你的 3 个解决方案。我想还有第四个:我正在使用 iptables 和 fail2ban 而不是服务器 php 响应来处理这个问题,但没有对这两种解决方案的速度进行基准测试。您提到的另一个可行的解决方案是在您的服务器 vhost 中使用“包含 /etc/apache2/extra/redirecting_rules”;我也没有对那个进行基准测试,但由于系统需要文件访问,它可能会更慢。
  • .htaccess 无法缩放

标签: php performance apache


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    完整的解决方案如下: Python 脚本每 x 分钟分析一次访问日志文件,并对某些 IP 地址进行“惩罚”。所有当前运行的惩罚都写入一个相当小的 (

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

    【讨论】:

    • 我更喜欢 Python 来做不涉及 HTML 的服务器端工作,比如分析大块数据。
    【解决方案3】:

    如何动态配置iptables 来阻止坏IP?我看不出有任何理由在 PHP 中做“防火墙”...

    【讨论】:

    • 我不想阻止 IP,而是将它们发送到带有验证码或其他进入障碍的另一个页面。如果以这种方式处理合法用户,他仍然可以使用该服务。至少我希望一个糟糕的机器人不会打扰。
    • iptables 不仅可以阻止 - 您还可以更改目标 IP 地址,即如果您愿意,可以重定向到不同的服务器。此外,我认为任何体面的负载均衡器也可以为您做到这一点。在我看来,您的所有 3 个解决方案似乎都归结为在每个请求上读取一个文件,如果您仍然每秒只处理 20-30 个事务,这可能没问题,但在此之前实施更具可扩展性的东西可能是个好主意时间。
    • 在 iptables 级别上执行此操作超出了我的舒适区,也超出了我作为开发人员的“管辖范围”。我也希望尽可能地控制它。请参阅我的回答,了解我是如何实现的。
    • 我已经给了你公认的答案,因为我认为 iptables 可能是性能最高的解决方案,尽管我选择的解决方案目前的性能足以满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2021-08-18
    • 1970-01-01
    • 2022-08-13
    • 2020-11-21
    • 2017-08-05
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多