Eu configurei com sucesso o módulo limit_req do Nginx para que quando alguém tentar acessar um arquivo PHP em nosso servidor (que não hospedamos), receba um 503. Veja esta pergunta sobre minha configuração, incluindo configuração.
Agora quero desenvolver isso adicionando uma prisão fail2ban para isso, para que as pessoas que tentarem acessar arquivos PHP sejam simplesmente banidas por um tempo. Aparentemente consegui funcionar: quando acesso um endereço PHP várias vezes seguidas, vejo entradas de log do fail2ban sobre como adicionar meu endereço à prisão. No entanto, ainda consigo acessar o site sem problemas, não estou realmente banido.
/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
Quando acesso repetidamente um endereço .php em nosso servidor, eis o que acontece. Eu vejo a proibição chegando muito bem:
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
E sim, o endereço é adicionado ao firewall:
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
Que peça do quebra-cabeça estou faltando aqui? Por que ainda posso acessar o site? Estamos usando o fail2ban v0.11.2 no Debian 11, com o UFW nos bastidores.