nGinX Forbidden 仍然触发请求限制

nGinX Forbidden 仍然触发请求限制

我在请求限制配置之前有一些“拒绝”规则。如果被阻止的用户(根据拒绝规则)正在访问网站,他仍然会触发请求限制,因此会创建数千个日志条目。为什么?我预计它不会超出拒绝规则。

    include        /etc/nginx/blacklist.conf;
    limit_req zone=limit burst=3 nodelay;

日志显示一个禁止错误,之后是数百个请求限制错误。这种情况一遍又一遍地重复。

答案1

当 nginx 处理请求时,它会经过几个阶段。 他们之中 :预访问使用权階段。 预访问通常是 wherelimit_req工作,而 access 是allow/deny指令工作的地方。这意味着速率限制已完成如果两个指令都在同一上下文中声明,则进行 IP 过滤。

因此,如果您想尝试使用本机指令直接在 nginx 中运行一些类似 fail2ban 的进程(考虑到您的其他问题返回代码 444),这本质上是不可能的。

答案2

这个问题有点老了,但对于任何有这个问题的人来说,我发现最好的解决方案是使用带有mapif不是deny规则(虽然我尽量避免使用ifs在 nginx 中使用),因为像泽维尔·卢卡斯说:

在 IP 过滤之前进行速率限制

您可以blacklist.conf从以下位置更改文件:

deny 1.2.3.4;

到:

1.2.3.4 0;

创建文件whitelist.conf

if ( $whitelist = 0 ) {
    return 403;
}

然后,在 中nginx.conf包含一个映射,将 中的所有 IP 列入白名单,但 中的 IP 除外blacklist.conf

http {
    geo $whitelist {
        /etc/nginx/blacklist.conf;
        default 1;
    }

    ...
}

最后,同样在nginx.conf每个服务器指令之前添加文件whitelist.conf

server {
    server_name ...;
    listen 443 ssl;

    include /etc/nginx/whitelist.conf;

    ssl_certificate       /etc/ssl/bundle.crt;
    ssl_certificate_key   /etc/ssl/server.key;

    ...
}

...

来自黑名单 IP 的请求将被立即返回并且不会记录在错误日志文件中。

您还可以使用以下命令阻止来自这些 IP 的请求记录在访问日志文件中:

access_log /path/to/file if=$whitelist; 

相关内容