Fail2ban na VPS: bloquear ataques de força bruta
Fail2ban monitora logs do sistema e bane automaticamente IPs que excedem um número de tentativas falhas num intervalo de tempo. É a proteção mais eficaz contra ataques de força bruta ao SSH — bots que tentam milhares de senhas são bloqueados após 5 tentativas e ficam banidos por horas ou dias.
Instalar e habilitar o Fail2ban
Fail2ban está nos repositórios padrão do Ubuntu/Debian. Após instalar, o jail SSH já vem habilitado por padrão:
# Instalar
sudo apt update && sudo apt install -y fail2ban
# Habilitar e iniciar
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Ver status (deve mostrar jail sshd ativo)
sudo fail2ban-client status
sudo fail2ban-client status sshd
# Ver IPs atualmente banidos
sudo fail2ban-client status sshd | grep "Banned IP"Configuração personalizada (jail.local)
Nunca edite jail.conf — crie jail.local que sobrescreve as configurações padrão e sobrevive a atualizações do pacote:
# Criar arquivo de configuração local
sudo nano /etc/fail2ban/jail.local
# Conteúdo recomendado para VPS de produção:
[DEFAULT]
# Ignorar seu IP fixo (nunca seja banido acidentalmente)
ignoreip = 127.0.0.1/8 ::1 SEU_IP_FIXO
# Tempo de ban: 1 hora (3600s) ou 24h (86400)
bantime = 3600
# Janela de observação: 10 minutos
findtime = 600
# Máximo de tentativas antes do ban
maxretry = 5
# Backend de detecção (systemd para Ubuntu 22.04+)
backend = systemd
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3 # SSH: threshold mais baixo
bantime = 86400 # ban de 24h para SSHProteger o Nginx (WordPress, apps web)
Além do SSH, configure jails para o Nginx para bloquear ataques ao painel de login do WordPress, tentativas de exploração de URL e scanners:
# Adicionar ao /etc/fail2ban/jail.local:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 600
# Para WordPress — criar filtro customizado:
# /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
ignoreregex =
# Jail para WordPress:
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 86400Gerenciar bans: verificar, desbanir e testar
Comandos do dia a dia para gerenciar o Fail2ban:
# Ver todos os jails ativos e IPs banidos
sudo fail2ban-client status
sudo fail2ban-client status sshd
# Desbanir um IP específico (ex: se você mesmo foi banido)
sudo fail2ban-client set sshd unbanip SEU_IP
# Banir manualmente um IP suspeito
sudo fail2ban-client set sshd banip 203.0.113.0
# Ver log do Fail2ban em tempo real
sudo tail -f /var/log/fail2ban.log
# Testar se um filtro detecta corretamente (sem banir)
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# Recarregar configuração após editar jail.local
sudo fail2ban-client reloadBan persistente e recidivismo
Configure ban crescente para IPs que continuam atacando após desban:
# Adicionar ao /etc/fail2ban/jail.local:
[DEFAULT]
# Ban progressivo: 1h → 1 dia → 1 semana
# Requer Fail2ban 0.11+ (Ubuntu 22.04 inclui)
bantime.increment = true
bantime.rndtime = 600 # variação aleatória para evitar timing attacks
bantime.maxtime = 604800 # máximo 1 semana (604800 segundos)
bantime.factor = 24 # multiplica o bantime a cada reincidência
# Recalcular ban:
# 1ª infração: 1h × 1 = 1h
# 2ª infração: 1h × 24 = 24h
# 3ª infração: 1h × 24² = 576h (~24 dias, limitado a 1 semana)$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.