Veja como instalar e configurar o fail2ban para proteger o SSH contra ataques de força bruta no Debian 12, Ubuntu 24.04 e AlmaLinux 9.
Todo servidor com SSH aberto na internet recebe milhares de tentativas de senha por dia. O fail2ban lê os registros de login e, quando um IP erra a senha várias vezes seguidas, bloqueia esse IP no firewall por um tempo. Ele não substitui uma senha forte ou o login por chave, mas tira a maior parte do ruído e dificulta muito os ataques automáticos.
Antes de começar
- Acesso root ao servidor. Os comandos abaixo são executados como root.
- O seu IP, para colocar na lista de exceções e não bloquear a si mesmo. Descubra em pophosting.com.br/meu-ip.
- A porta do SSH, se você a mudou da 22.
- Um acesso de emergência (console do servidor), caso você se bloqueie.
Como instalar o fail2ban
Debian 12 e Ubuntu:
apt update
apt install fail2ban python3-systemd nftables
AlmaLinux e Rocky Linux 9 (o pacote vem do EPEL e já traz a integração com o firewalld):
dnf install epel-release
dnf install fail2ban
Como configurar o fail2ban para o SSH
Nunca edite o arquivo jail.conf: ele é substituído nas atualizações. Toda a sua configuração vai no /etc/fail2ban/jail.local. Crie o arquivo com este conteúdo, trocando 203.0.113.50 pelo seu IP:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.50
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = true
port = ssh
backend = systemd
Na prática: quem errar a senha 5 vezes em 10 minutos fica bloqueado por 1 hora. Com o bantime.increment, quem volta a atacar depois de liberado recebe bloqueios cada vez maiores, até o limite de 1 semana. O backend = systemd faz o fail2ban ler os logins direto do journal do sistema, que existe em todas as distribuições atuais.
Se o SSH usa outra porta, informe o número em vez de ssh, por exemplo port = 2222. Se a porta estiver errada, o fail2ban registra o bloqueio, mas o atacante continua entrando pela porta real.
Ajuste extra no Debian 12
No Debian 12, o pacote vem configurado para bloquear com o iptables, que nem sempre está instalado. Acrescente estas duas linhas na seção [DEFAULT] do jail.local para usar o nftables:
banaction = nftables-multiport
banaction_allports = nftables-allports
No Ubuntu 24.04 o nftables já é o padrão do pacote, e no AlmaLinux o bloqueio é feito pelo firewalld. Nesses dois, não acrescente essas linhas.
Como iniciar e conferir
systemctl enable --now fail2ban
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
O último comando mostra quantas falhas foram detectadas, quantos IPs estão bloqueados agora e a lista desses IPs. Em servidores expostos, é comum ver IPs bloqueados poucos minutos depois de ativar.
Para ver o que o fail2ban está fazendo em tempo real:
tail -f /var/log/fail2ban.log
Como desbloquear um IP no fail2ban
fail2ban-client set sshd unbanip 203.0.113.50
Para liberar um IP de todas as jails de uma vez, use fail2ban-client unban 203.0.113.50. Se o IP for seu ou de alguém da equipe, acrescente-o ao ignoreip e rode systemctl restart fail2ban para não acontecer de novo.
Problemas comuns
Have not found any log file for sshd jail
Aparece no Debian 12, que não grava mais o /var/log/auth.log por padrão. A solução é a linha backend = systemd na seção [sshd] e o pacote python3-systemd instalado, como mostrado acima.
O IP aparece como bloqueado, mas continua tentando
Duas causas comuns: a porta do SSH no jail.local não é a porta real, ou a ação de bloqueio não funciona no sistema (no Debian 12, use o ajuste do nftables). Confira se as regras foram criadas com nft list ruleset (Debian e Ubuntu) ou firewall-cmd --list-rich-rules (AlmaLinux).
ModuleNotFoundError: No module named 'asynchat'
Problema da versão do fail2ban que saiu no lançamento do Ubuntu 24.04 com o Python 3.12. Atualize o pacote com apt update && apt install --only-upgrade fail2ban.
Bloqueei meu próprio IP
Entre por outro IP (celular roteando internet, por exemplo) ou pelo console do servidor e rode o unbanip. Depois inclua o seu IP no ignoreip.
Como testar se o filtro reconhece as falhas
fail2ban-regex systemd-journal /etc/fail2ban/filter.d/sshd.conf
O resultado mostra quantas linhas do journal casaram com o filtro do SSH. Se der zero e houver tentativas de login no servidor, revise o backend.
Perguntas frequentes
O fail2ban substitui a chave SSH?
Não. Ele reduz o volume de ataques. A proteção de verdade é login por chave, senha forte e, se possível, SSH liberado só para IPs conhecidos.
Posso proteger outros serviços?
Sim. O fail2ban traz filtros prontos para Nginx, Apache, Postfix, Dovecot e outros. Basta criar uma seção para cada um no jail.local com enabled = true.