nginx req limit & fail2ban & Cloudflare Large Attacks



我开始使用主题说nginx与req limit + fail2ban + cloudflare。如果有人超过了任何php文件的请求,则IP将通过Cloudflares侧"IP防火墙"中的cloudflare api被阻止。它工作正常,但问题是,我今天受到了大约 1000~ 个机器人的攻击,这些机器人能够绕过 javascript 检查(又名在攻击模式下)并使我的网站超载。Fail2ban直接开始阻止350多个不同的IP,但由于某种原因,它失败得很厉害。nginx错误日志充斥着"限制请求,过剩:",速度如此之快,以至于当我对它运行尾巴-f时,我无法读取任何内容。许多 ip 应该被阻止,因为它们也超过了限制,但 failure2ban 不再阻止任何新 ip,它只是重复了日志文件中已经禁止的所有时间 x.x.x.x。也许问题是,fail2ban 无法读取那么多新的日志条目,它无法正常工作。

我目前的配置:

来自nginx.conf:

limit_req_zone  $binary_remote_addr  zone=one:100m  rate=1r/s;

在启用站点的 PHP 块中:

limit_req zone=one burst=5;

jail.config:

[http-dos]
enabled  = true
filter   = http-dos
action   = cloudflare-blacklist
logpath  = /var/log/nginx/error.log
maxretry = 10
findtime = 600
bantime  = 3600

和失败正则表达式:

failregex = limiting requests, excess:.* by zone.*client: <HOST>

并且您会看到错误有多大.log在限制请求的攻击后:

wc -l /var/log/nginx/error.log
602582 /var/log/nginx/error.log
出现的另一个问题是,慢速机器人速度慢,每秒

只能发送 2-3 个甚至更少的请求,不会被此配置阻止,但如果我降低配置上的值,它将开始阻止普通用户也。显然,每秒 2-3 个请求不会损害站点,但是有超过 100 个机器人像这样很慢,因此它的总和高达 300-400 r/s,不会被阻止。这也不是那么多,但由于后面的网站是一个板,每次您请求索引时都会运行 mysql 查询.php因此会导致非常高的 CPU 负载。

我不知道如何解决这个问题,也许你们中的一个人知道这个问题的解决方案。我也对不起我的英语,我自己教它,希望你能理解我写的内容。

许多 ip 应该被阻止,因为它们也超过了限制,但 fail2ban 不再阻止任何新的 ip

我看不到您的自定义操作cloudflare-blacklist,但您必须确保已进行 API 调用。您的呼叫可能会被拒绝,因为有 1200req/5 分钟的限制。如果您的日志记录未提供此类信息,您可以询问 Cloudflare 支持。

我也不确定当您达到 IP 规则列表的最大大小时会发生什么。也许他们拒绝尝试在列表中创建条目,并且您的进一步违规者根本没有被禁止。

它只是一直重复 x.x.x.x 已经禁止

我相信这是一种正常行为。某些具有 IP x.x.x.x 的用户违反了您的速率限制 n 次,因此创建了 n 个日志条目。您的监狱有maxretry = 10,因此在重复10个日志条目后,必须禁止用户。之后 fail2ban 读取剩余的 n-10 个日志条目,并看到用户继续违反您的速率限制,但它并没有禁止他,而只是写他已经被禁止了。

显然,每秒 2-3 个请求不会损害站点,但是有超过 100 个机器人像这样很慢,因此它的总和高达 300-400 r/s,不会被阻止。

根据您允许的 1r/s 速率和 5 的突发,它们仍然应该定期限制速率并最终被禁止。如果它们没有违反您的限制,并且很难将机器人与实际用户区分开来,则可以为过去一小时的请求总数定义另一个监狱或limit_req_zone。

在某些情况下,Nginx缓存也可以提供帮助。查看这些DigitalOcean和Runcloud文章。

最新更新