我一直尝试使用 Nginx 中的 limit_req 模块来限制来自单个 IP 地址的请求,但成功了。但现在我想重定向到另一个网页来显示一些消息。我该怎么做?似乎 Nginx 只支持 limit_req_status 来更改响应状态代码
答案1
这很简单。如果您真正想要做的是完全屏蔽此人,而不是向他们显示消息,我可以提供一个“替代”答案。(因为机器人从什么时候开始阅读消息的)
对我来说,我有fail2ban在观察/var/log/nginx/blocked.log因此,我们不应该仅仅显示错误代码,而应该在日志中提到这些错误时立即将其消除。
首先,定义一个错误页面,并使任何人/任何访问该错误页面的内容都记录到我们的“blocked.log”日志文件中(因此将被阻止)
将以下内容放入您的服务器 {...} 块中
error_page 577 /577.html;
location = /577.html {
access_log /var/log/nginx/blocked.log blocked;
}
现在确保您也定义了这种“阻止”格式。
将这一行放入你的 http { ... } 块中,通常位于 /etc/nginx/nginx.conf
log_format blocked '$time_local Blocked request from $remote_addr $request';
在编辑此文件时,您也可以添加以下行。请注意区域。
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=1r/s;
举个例子,我想阻止对 WordPress wp-login.php 文件的不必要的重复访问。因此,我在 server { ... } 块中加入了以下内容。
location ~ [^/]\.php(/|$) {
try_files $uri* @fastcgi;
location ~* wp\-login\.php {
limit_req zone=wplogin burst=1 nodelay;
limit_req_status 577;
try_files $uri* @fastcgi;
}
}
location @fastcgi {
... stuff for making PHP happen ...
}
奖金
如果你已经安装了 fail2ban,请将以下块添加到 /etc/fail2ban/jail.d/ 中的 conf 文件中
[nginx-blocked]
enabled = true
bantime = 600
maxretry = 3
backend = auto
findtime = 30
banaction = iptables-multiport
protocol = tcp
chain = INPUT
port = 80,443
filter = nginx-blocked
logpath = /var/log/nginx/blocked.log
然后创建 /etc/fail2ban/filter.d/nginx-blocked.conf 并插入以下内容
[Definition]
failregex = ^.* Blocked request from <HOST>.*$
ignoreregex =
希望对你有帮助!