fail2ban: como bloquear força bruta no Linux passo a passo

Abra o /var/log/auth.log de qualquer servidor SSH exposto à internet e você vai ver centenas — às vezes milhares — de tentativas de login por dia. Bots rastreiam o IPv4 inteiro em horas, testando combinações de usuário e senha em cada porta 22 que encontram. O fail2ban é a resposta padrão para isso: monitora os logs em tempo real e bane automaticamente qualquer IP que ultrapasse o limite de tentativas que você define. Simples, leve e eficiente.
O que o fail2ban faz (e o que ele não faz)
O fail2ban age em três etapas: lê os logs de um serviço, aplica um filtro (expressão regular) para detectar tentativas de autenticação malsucedidas e, quando o IP ultrapassa o maxretry no período findtime, aciona uma action — por padrão, uma regra de bloqueio via iptables ou nftables com duração configurável.
O que ele não faz: não substitui hardening adequado do SSH (desabilitar login de root, usar chaves em vez de senha). Os dois trabalham em camadas complementares — o fail2ban reduz o ruído de brute force, mas um servidor que ainda aceita senha fraca continua vulnerável se o ataque vier de IPs diferentes (distribuído, mais difícil de banir).
Instalação no Ubuntu e Debian
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2banNo Ubuntu 22.04+ e Debian 12, o pacote já vem com suporte a nftables/iptables e o serviço sobe automaticamente após a instalação.
Criando o jail.local (nunca edite o jail.conf)
O /etc/fail2ban/jail.conf é o arquivo de referência — ele é sobrescrito em atualizações do pacote. Toda configuração personalizada fica em jail.local, que tem precedência:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localEdite /etc/fail2ban/jail.local e ajuste a seção [DEFAULT]:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemdSignificado de cada parâmetro:
- bantime: quanto tempo o IP fica banido. Aceita sufixos:
10m,1h,1d,1w. - findtime: janela de observação. Se o IP errar
maxretryvezes dentro desse período, leva o ban. - maxretry: número de falhas toleradas antes do ban.
- backend: como o fail2ban lê os logs.
systemdusa o journald (padrão nas distros modernas); useautose precisar cobrir ambos.
Ativando a jail do SSH
Ainda no jail.local, procure a seção [sshd] e configure:
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 2h
findtime = 5mCom esses valores, três tentativas erradas em cinco minutos resultam em dois horas de ban. Para um servidor de produção, valores mais agressivos fazem sentido: maxretry = 2 e bantime = 24h.
Após editar, recarregue:
sudo systemctl reload fail2banComandos essenciais de gerenciamento
Como verificar se o fail2ban está funcionando?
Execute sudo fail2ban-client status — ele lista as jails ativas. Se aparecer sshd, está monitorando. Para detalhar quantos IPs foram banidos:
sudo fail2ban-client status sshdSaída típica:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 317
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 4
|- Total banned: 51
`- Banned IP list: 203.0.113.42 198.51.100.7 ...Para ver os logs em tempo real:
sudo journalctl -u fail2ban -fPara desbanir um IP manualmente (útil quando você mesmo erra a senha e se tranca):
sudo fail2ban-client set sshd unbanip 203.0.113.42Bans crescentes para reincidentes
Por padrão, o IP é banido pelo bantime e, quando expira, volta à estaca zero. Ativar bans incrementais faz o tempo dobrar a cada reincidência — IPs persistentes acabam banidos por semanas:
[DEFAULT]
bantime.increment = true
bantime.multiplier = 2
bantime.maxtime = 1wCom isso, o primeiro ban dura o bantime configurado; o segundo, o dobro; o terceiro, quatro vezes — até o teto de uma semana. Esse recurso está disponível no fail2ban 0.11 em diante, que é o padrão no Ubuntu 22.04+ e Debian 12.
Protegendo outros serviços
O fail2ban tem jails prontas para Nginx, Apache, Postfix, Dovecot e outros. Basta habilitar na seção correspondente do jail.local. Exemplo para Nginx (tentativas de autenticação básica):
[nginx-http-auth]
enabled = true
port = http,https
maxretry = 4
bantime = 1hA mesma lógica de proteção contra força bruta que se aplica ao RDP no Windows se aplica aqui: limitar tentativas com bloqueio automático é a primeira camada de defesa para qualquer serviço exposto à rede.
Lista de permissões — não se bana
Adicione seu IP (ou faixa) à lista de permissões para que o fail2ban nunca o bloqueie, mesmo que você erre a senha várias vezes:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 SEU.IP.AQUIPara múltiplos IPs, separe por espaço. Se você acessa o servidor sempre do mesmo IP estático, essa linha evita o headache de se trancar fora.
Conclusão
Instalar o fail2ban leva menos de dois minutos e cobre a camada mais básica de brute force automaticamente. Combinado com autenticação por chave SSH e desabilitação de login root, você fecha a maioria dos vetores de ataque que bots exploram em servidores expostos. Para quem gerencia VPSs ou servidores domésticos, esse par de medidas é o equivalente a trancar a porta e trocar a fechadura — não é invulnerabilidade, mas elimina o oportunismo. Se quiser ir além no hardening de infraestrutura, o guia sobre OPSEC e privacidade digital cobre a camada de comportamento e exposição de informação, que é onde muitos ataques reais começam.




Comentários