我已经成功设置了 Nginx 的 limit_req 模块,这样当任何人尝试访问我们的服务器(我们根本不托管)上的 PHP 文件时,他们都会得到 503。请参阅有关我的设置的问题,包括配置。
现在我想在此基础上添加一个fail2ban 监狱,这样尝试访问PHP 文件的人就会被禁止一段时间。我似乎已经成功了:当我连续多次访问 PHP 地址时,我确实看到了有关将我的地址添加到监狱的fail2ban 日志条目。但是,我仍然可以正常访问该网站,我根本没有被真正禁止。
/etc/fail2ban/filter.d/nginx-limit-req.conf:
[Definition]
ngx_limit_req_zones = deny_rules
failregex = ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>,
ignoreregex =
datepattern = {^LN-BEG}
/etc/fail2ban/jail.local:
[nginx-limit-req]
port = http,https
logpath = %(nginx_error_log)s
enabled = true
bantime = 2h
maxretry = 1
当我重复访问我们服务器上的 .php 地址时,会发生以下情况。我确实认为禁令的实施效果很好:
tail -f /var/log/fail2ban.log
2024-06-03 10:38:33,921 fail2ban.filter [3816728]: INFO [nginx-limit-req] Found 81.204.117.221 - 2024-06-03 10:38:33
2024-06-03 10:38:34,242 fail2ban.actions [3816728]: NOTICE [nginx-limit-req] 81.204.117.221 already banned
是的,该地址已添加到防火墙中:
iptables -S | grep f2b
:
iptables -S | grep f2b
-N f2b-nginx-limit-req
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-limit-req
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-nginx-limit-req -s 81.204.117.221/32 -j REJECT --reject-with icmp-port-unreachable
我在这里缺少哪一块拼图?为什么我仍然可以访问该网站?我们在 Debian 11 上使用fail2ban v0.11.2,UFW 在幕后支持。
好的,我发现了问题:该网站是由 CloudFlare 代理的。因此,虽然我们阻止了用户的真实 IP 地址(由于我们使用了 Nginx 的 realip 模块),但连接到网络服务器的并不是用户的真实 IP 地址,因此 iptables 并没有阻止用户。