Proteger VPS Linux com Fail2Ban: bloqueando bruteforce no SSH
Aprenda a proteger sua VPS Linux com Fail2Ban: instalação, jail customizada para SSH, integração com firewall e monitoramento de tentativas de invasão.
Qualquer VPS Linux com SSH exposto na internet recebe centenas de tentativas de bruteforce por dia. Bots automatizados varrem o IPv4 inteiro testando combinações comuns como root/admin, ubuntu/123456 e listas de senhas vazadas. Mesmo que sua senha seja forte, o ruído nos logs, o consumo de CPU e o risco de uma credencial fraca em algum usuário secundário tornam essas tentativas um problema real.
O Fail2Ban resolve isso lendo logs de autenticação em tempo real, identificando falhas repetidas vindas do mesmo IP e adicionando regras temporárias no firewall pra bloquear esse IP. É leve (sub-50 MB de RAM em uso típico), está nos repositórios oficiais do Debian e Ubuntu e funciona com qualquer firewall padrão.
Este tutorial cobre instalação no Ubuntu/Debian, configuração de uma jail customizada pro SSH, integração com UFW e ajuste fino de banimento progressivo. Tempo estimado: 15-20 minutos.
Pré-requisitos
VPS rodando Ubuntu 22.04/24.04 LTS ou Debian 12 com acesso sudo, SSH conectado e UFW (ou outro firewall) já configurado. Você também precisa do seu IP fixo de administração — sem ele, há risco real de se trancar fora.
Ubuntu 24.04 LTS fail2ban ufw / nftables / iptables 22 Se você não sabe seu IP público de onde administra a VPS, rode curl -4 ifconfig.me na sua máquina local antes de começar. Anote — você vai precisar dele.
Instalando o Fail2Ban
A instalação é direta pelo gerenciador de pacotes. Não é necessário compilar nada nem adicionar repositórios externos.
Atualize o índice de pacotes:
sudo apt updateIsso garante que você baixe a versão mais recente do Fail2Ban disponível nos repositórios oficiais.
Instale o pacote:
sudo apt install -y fail2banO instalador já habilita e inicia o serviço automaticamente via systemd. A configuração default protege SSH com parâmetros conservadores que você vai sobrescrever no próximo passo.
Verifique que o serviço está rodando:
sudo systemctl status fail2banA saída deve mostrar active (running) em verde. Se aparecer failed, rode sudo journalctl -u fail2ban -n 50 pra ver o erro — quase sempre é problema de permissão em /var/log/auth.log (resolva com sudo chmod 640 /var/log/auth.log).
Criando jail.local para SSH
O Fail2Ban tem dois arquivos de configuração: jail.conf (default do pacote, pode ser sobrescrito em updates) e jail.local (suas customizações, preservado em updates). Nunca edite jail.conf — sempre crie jail.local.
Crie o arquivo de configuração local:
sudo nano /etc/fail2ban/jail.localCole a configuração abaixo, substituindo SEU.IP.AQUI pelo seu IP de administração:
[DEFAULT]
# IPs que nunca são banidos (whitelist)
ignoreip = 127.0.0.1/8 ::1 SEU.IP.AQUI
# Tempo de banimento: 1 hora
bantime = 3600
# Janela de observação: 10 minutos
findtime = 600
# Tentativas antes de banir
maxretry = 5
# Banimento progressivo (multiplica em reincidências)
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800
# Backend: systemd em distribuições modernas
backend = systemd
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5Cada parâmetro tem efeito direto. bantime = 3600 mantém o IP banido por 1 hora na primeira ofensa. Com bantime.increment = true e bantime.factor = 2, a segunda ofensa banirá por 2 horas, a terceira por 4 horas, e assim sucessivamente — até o teto de 1 semana definido em bantime.maxtime.
Salve (Ctrl+O, Enter) e saia (Ctrl+X). Recarregue o Fail2Ban:
sudo systemctl restart fail2banSe você administra a VPS de um IP residencial dinâmico (a maioria das conexões domésticas), ignoreip pode falhar quando seu IP mudar. Considere usar uma faixa CIDR do seu ISP ou autenticar via chave SSH (mais robusto que depender de whitelist por IP).
Integrando com UFW
Por padrão, o Fail2Ban usa iptables pra aplicar banimentos. Se você usa UFW (interface mais amigável sobre iptables), os bloqueios funcionam mas aparecem em uma chain separada — o que pode confundir auditoria. A integração correta delega o bloqueio ao próprio UFW.
Edite /etc/fail2ban/jail.local e adicione no bloco [DEFAULT]:
banaction = ufw
banaction_allports = ufwReinicie o serviço:
sudo systemctl restart fail2banAgora os banimentos aparecem direto no sudo ufw status numbered como regras DENY no topo da lista — facilitando inspeção.
Verificação
Confirmar que o Fail2Ban está realmente ativo e monitorando SSH leva 30 segundos.
Verifique o status da jail SSH:
sudo fail2ban-client status sshdSaída esperada:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:Se a jail estiver listada e File list apontar pro auth.log correto, está funcionando. Após algumas horas em produção, Total failed e Total banned começam a subir naturalmente — bots da internet inteira já estão tentando.
Teste forçado (opcional, faça de um segundo IP, não do seu IP de admin): tente 6 logins SSH com senha errada. O 6º deve falhar com “Connection refused” e o IP estar listado em Banned IP list.
Resolução de problemas
Fail2Ban não bane mesmo após várias falhas
Causa mais comum: o backend não está lendo o log certo. Em Ubuntu 22.04+ o auth.log foi movido pro journald e pode não existir como arquivo. Confirme com ls -la /var/log/auth.log. Se não existir, mantenha backend = systemd no jail.local — o que já está no exemplo acima.
Outra causa: filtro regex desatualizado. Rode sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf e veja se “matched” tem número > 0.
”Unable to start jail” no log
Quase sempre permissão. O Fail2Ban roda como usuário fail2ban (ou root em distros antigas) e precisa ler /var/log/auth.log. Cheque com sudo -u fail2ban cat /var/log/auth.log | head — se der negado, ajuste o ACL.
Me tranquei fora e não tenho IP fixo
Se você perdeu acesso SSH e seu IP de administração não está em ignoreip, NÃO tente forçar mais logins — isso só estende o banimento. Acesse o console KVM da sua VPS pelo painel da Hostini, faça login pelo console e rode sudo fail2ban-client set sshd unbanip SEU.IP pra liberar.
Próximos passos
O Fail2Ban resolve uma camada do problema — bruteforce ruidoso. Pra uma postura de segurança completa, considere também:
- Desabilitar login com senha: edite
/etc/ssh/sshd_configsetandoPasswordAuthentication noapós confirmar que sua chave pública funciona. Bruteforce contra chaves é matematicamente inviável. - Mudar a porta SSH padrão: porta diferente de 22 elimina 95% do scan automatizado (atacantes sérios encontram, mas bots burros não). Lembre-se de atualizar o UFW antes.
- Habilitar 2FA no SSH com Google Authenticator: adiciona um TOTP de 6 dígitos na cadeia de autenticação.
- Monitorar banimentos: configure notificação por email no Fail2Ban (
action = %(action_mwl)s) pra receber detalhes de cada banimento. - Estender pra outros serviços: se você expõe Nginx ou Postfix, ative os jails correspondentes no mesmo
jail.local.
Se você está rodando aplicação crítica em produção, uma VPS Hostini já vem com proteção DDoS de borda integrada — o Fail2Ban continua útil pra bruteforce na camada de aplicação, mas ataques volumétricos são filtrados antes de chegarem no kernel da sua máquina. Conheça os planos em /vps.
Perguntas frequentes
Fail2Ban substitui um firewall como UFW ou nftables?
Não. Fail2Ban é uma camada reativa que adiciona regras dinâmicas ao firewall que já existe na sua VPS. Ele precisa de iptables, nftables ou UFW funcionando pra aplicar os banimentos. A combinação correta é firewall fechando portas + Fail2Ban respondendo a tentativas em portas que precisam ficar abertas (como SSH).
Quanto tempo o IP atacante fica banido por padrão?
Por padrão são 10 minutos (600 segundos). Pra produção isso é pouco — bots simplesmente esperam e tentam de novo. Em ambientes reais aumente bantime pra 1 hora (3600) ou ative bantime.increment=true pra banimento progressivo: cada reincidência multiplica o tempo automaticamente.
Fail2Ban pode me trancar fora da minha própria VPS?
Sim, se você errar a senha SSH 5 vezes do seu IP. Solução: adicione seu IP fixo (ou range corporativo) ao ignoreip no jail.local. Se ainda assim travar, acesse o console KVM no painel da Hostini — ele dá shell direto sem passar pelo SSH, mesmo com firewall ativo.
Como ver quais IPs estão banidos agora?
Use `sudo fail2ban-client status sshd`. A linha 'Banned IP list' mostra os IPs atualmente bloqueados na jail sshd. Pra desbanir manualmente: `sudo fail2ban-client set sshd unbanip 1.2.3.4`.
Fail2Ban funciona com SSH usando chaves públicas em vez de senha?
Funciona, mas o risco de bruteforce cai drasticamente quando você desabilita autenticação por senha (PasswordAuthentication no em /etc/ssh/sshd_config). Nesse cenário Fail2Ban ainda é útil pra bloquear scanners ruidosos que ocupam log e consomem CPU mesmo sem conseguir entrar.
Posso usar Fail2Ban pra proteger outros serviços além do SSH?
Sim. Fail2Ban já vem com filtros prontos pra Nginx, Apache, Postfix, Dovecot, vsftpd, entre outros. Você ativa cada um adicionando uma seção [nome-do-jail] com enabled = true no jail.local. O mesmo princípio se aplica: ele lê o log do serviço, casa um regex de falha e adiciona regra de firewall.