Todo servidor conectado à internet é um alvo. Bots automatizados escaneiam faixas de IP 24 horas por dia, tentando milhares de combinações de usuário e senha contra SSH, páginas de login web e servidores de e-mail. Um único serviço desprotegido pode ser comprometido em questão de horas. O Fail2Ban é um framework de prevenção de intrusões que monitora arquivos de log em busca de sinais de atividade maliciosa e bloqueia automaticamente os endereços IP ofensores usando regras de firewall. Este guia orienta você pela instalação, configuração e ajuste do Fail2Ban no Ubuntu, abrangendo proteção SSH, jails personalizados para Nginx, integração com UFW, notificações por e-mail e comandos essenciais de gerenciamento.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Ubuntu Server 20.04, 22.04 ou 24.04
  • Acesso ao terminal com privilégios sudo
  • Acesso SSH ao servidor
  • Um firewall configurado e ativo (UFW recomendado — consulte nosso guia do UFW)
  • Familiaridade básica com arquivos de log e serviços systemd

O Que É o Fail2Ban?

O Fail2Ban é uma ferramenta de prevenção de intrusões de código aberto escrita em Python. Ele é executado como um daemon em segundo plano que monitora continuamente arquivos de log (como /var/log/auth.log ou /var/log/nginx/error.log) em busca de padrões que indiquem comportamento malicioso. Quando um padrão coincide um número configurável de vezes dentro de uma janela de tempo definida, o Fail2Ban cria uma regra de firewall para bloquear o endereço IP ofensor por um período especificado.

Características principais:

  • Baseado em logs — reage a tentativas falhadas reais registradas em arquivos de log, não apenas a taxas de conexão
  • Jails configuráveis — cada serviço (SSH, Nginx, Postfix) tem seu próprio conjunto de regras chamado “jail”
  • Múltiplas ações de bloqueio — pode usar iptables, UFW, firewalld ou até enviar notificações
  • Desbloqueio automático — IPs bloqueados são automaticamente liberados ao expirar o período de bloqueio
  • Leve — uso mínimo de recursos mesmo em servidores ocupados

Como o Fail2Ban Funciona

O Fail2Ban opera através de quatro componentes interconectados:

  1. Arquivos de log — a fonte da verdade. Os serviços registram falhas de autenticação e erros em arquivos de log
  2. Filtros — expressões regulares que correspondem a padrões específicos em arquivos de log (por exemplo, “Failed password for” no auth.log)
  3. Jails — unidades de configuração que combinam um filtro com um caminho de arquivo de log, limites (maxretry, findtime) e uma ação
  4. Ações — o que acontece quando o limite é excedido (criar uma regra de firewall, enviar um e-mail, executar um script)

O fluxo de trabalho é direto:

Entrada no log → Filtro corresponde ao padrão → Contador do jail incrementa
→ Contador excede maxretry dentro do findtime → Ação executa (bloquear IP)
→ Bantime expira → Ação é revertida (desbloquear IP)

Esta arquitetura torna o Fail2Ban altamente extensível. Você pode escrever filtros personalizados para qualquer aplicação que produza saída de log.

Instalação do Fail2Ban

Instale o Fail2Ban a partir dos repositórios do Ubuntu:

sudo apt update
sudo apt install fail2ban -y

Verifique a instalação:

fail2ban-client --version

Verifique o status do serviço:

sudo systemctl status fail2ban

O Fail2Ban inicia automaticamente após a instalação, mas vem com uma configuração padrão mínima. O próximo passo é criar uma configuração adequada.

Entendendo os Arquivos de Configuração

O Fail2Ban utiliza um sistema de configuração em camadas:

ArquivoPropósitoEditável?
/etc/fail2ban/fail2ban.confConfigurações do daemon (nível de log, socket)Não — usar fail2ban.local
/etc/fail2ban/jail.confDefinições padrão de jailsNão — usar jail.local
/etc/fail2ban/jail.localSuas sobrescritas personalizadas de jailsSim — esta é sua config principal
/etc/fail2ban/jail.d/*.confConfigurações adicionais de jailsSim
/etc/fail2ban/filter.d/*.confDefinições de filtros (padrões regex)Sim — para filtros personalizados
/etc/fail2ban/action.d/*.confDefinições de ações (comandos ban/unban)Sim — para ações personalizadas

Importante: Nunca edite jail.conf ou fail2ban.conf diretamente. Esses arquivos são sobrescritos durante atualizações do pacote. Sempre crie arquivos .local que sobrescrevam configurações específicas.

Crie sua configuração local:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Alternativamente, crie um jail.local mínimo do zero com apenas as configurações que deseja sobrescrever:

sudo nano /etc/fail2ban/jail.local

Configuração de Proteção SSH

A proteção SSH é o caso de uso mais comum e crítico para o Fail2Ban. Adicione o seguinte ao seu jail.local:

[DEFAULT]
# Duração do bloqueio: 1 hora
bantime = 3600

# Janela de tempo para contar falhas: 10 minutos
findtime = 600

# Número de falhas antes do bloqueio
maxretry = 3

# Usar UFW para ações de bloqueio (recomendado no Ubuntu)
banaction = ufw

# Seus endereços IP (separados por espaço) que nunca são bloqueados
ignoreip = 127.0.0.1/8 ::1 SEU_IP_DE_CASA

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600

Esta configuração:

  • Define um padrão global de 3 tentativas dentro de 10 minutos, resultando em um bloqueio de 1 hora
  • Sobrescreve o jail SSH para bloquear por 24 horas (86400 segundos)
  • Usa UFW como mecanismo de bloqueio
  • Adiciona localhost e seu IP de casa à lista branca

Se você executa SSH em uma porta não padrão (recomendado — consulte nosso guia de hardening SSH), atualize a configuração da porta:

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

Reinicie o Fail2Ban para aplicar:

sudo systemctl restart fail2ban

Verifique se o jail SSH está ativo:

sudo fail2ban-client status sshd

Saí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:

Configuração de Jails Personalizados

Além do SSH, você pode criar jails para praticamente qualquer serviço. Aqui estão exemplos práticos:

Proteção SSH Agressiva

Para servidores sob ataques intensos, use bloqueios progressivos com bantime.increment:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800

Com esta configuração, o primeiro bloqueio dura 1 hora, o segundo 2 horas, o terceiro 4 horas, e assim por diante, até um máximo de 7 dias (604800 segundos). Reincidentes são penalizados mais severamente a cada vez.

Jail Recidive (Bloquear Reincidentes em Todos os Jails)

O jail recidive monitora o próprio log do Fail2Ban e bloqueia IPs que são bloqueados repetidamente em qualquer jail:

[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
bantime = 604800
findtime = 86400
maxretry = 3
banaction = ufw

Isso bloqueia um IP por 7 dias se for bloqueado 3 vezes dentro de 24 horas em qualquer jail.

Integração com UFW

Para servidores Ubuntu usando UFW como firewall, configure o Fail2Ban para usar UFW nos bloqueios:

[DEFAULT]
banaction = ufw

Verifique a integração checando as regras do UFW após um bloqueio:

sudo ufw status numbered

IPs bloqueados aparecem como regras de negação:

[ 1] Anywhere                   DENY IN     203.0.113.100
[ 2] 22/tcp                     ALLOW IN    Anywhere

Se preferir iptables (por exemplo, em sistemas sem UFW), use o padrão:

[DEFAULT]
banaction = iptables-multiport

Para verificar bloqueios do iptables:

sudo iptables -L f2b-sshd -n

Proteção do Nginx

O Fail2Ban pode proteger servidores web de vários padrões de ataque. Aqui estão dois jails comuns para Nginx:

Autenticação HTTP do Nginx

Proteja páginas com autenticação básica HTTP contra ataques de força bruta:

[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
findtime = 600

O filtro integrado nginx-http-auth corresponde a linhas como:

no user/password was provided for basic authentication

Proteção Contra Inundação de 404 no Nginx

Bloqueie IPs que geram erros 404 excessivos (um padrão comum de scanners de vulnerabilidades):

Crie um filtro personalizado:

sudo nano /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 404
ignoreregex =

Adicione o jail:

[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 30
findtime = 600
bantime = 3600

Isso bloqueia um IP após 30 erros 404 dentro de 10 minutos. Defina o limite alto o suficiente para evitar bloquear usuários legítimos que encontram links quebrados.

Proteção Contra Bots e Scanners no Nginx

Crie um filtro para agentes de usuário maliciosos conhecidos e varredura de caminhos:

sudo nano /etc/fail2ban/filter.d/nginx-badbots.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST).*HTTP.*" .* ".*(?:sqlmap|nikto|nmap|masscan|ZmEu|w3af).*"
ignoreregex =
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 1
findtime = 86400
bantime = 604800

Notificações por E-mail

Configure o Fail2Ban para enviar alertas por e-mail quando IPs são bloqueados ou quando jails iniciam/param. Primeiro, instale um agente de transferência de e-mail:

sudo apt install sendmail -y

Adicione as configurações de notificação ao jail.local:

[DEFAULT]
destemail = admin@seudominio.com
sender = fail2ban@seudominio.com
mta = sendmail
action = %(action_mwl)s

Os atalhos de ação disponíveis são:

AçãoComportamento
%(action_)sApenas bloqueio (sem notificação)
%(action_mw)sBloqueio + e-mail com informações WHOIS
%(action_mwl)sBloqueio + e-mail com informações WHOIS + linhas de log relevantes

Para um jail específico, sobrescreva a ação:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
action = %(action_mwl)s

Nota: Em servidores de alto tráfego sob ataque constante, as notificações por e-mail podem gerar um grande volume de mensagens. Considere usar %(action_)s (apenas bloqueio) para jails ocupados e reservar notificações por e-mail para jails críticos ou o jail recidive.

Lista Branca de IPs

Previna bloqueios acidentais em endereços IP confiáveis usando a diretiva ignoreip:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.1.0/24 SEU_IP_PUBLICO

Você pode listar IPs individuais, faixas CIDR ou nomes de host (resolvidos na inicialização):

ignoreip = 127.0.0.1/8 ::1 escritorio.seudominio.com 203.0.113.50

Para adicionar à lista branca um IP apenas para um jail específico:

[sshd]
enabled = true
ignoreip = 127.0.0.1/8 ::1 10.0.1.50

Você também pode adicionar à lista branca em tempo de execução sem reiniciar o Fail2Ban:

# Verificar a lista branca atual
sudo fail2ban-client get sshd ignoreip

# Adicionar um IP à lista branca temporariamente (até o reinício)
sudo fail2ban-client set sshd addignoreip 203.0.113.50

Referência de Comandos Essenciais

ComandoDescrição
sudo systemctl start fail2banIniciar o serviço Fail2Ban
sudo systemctl stop fail2banParar o serviço Fail2Ban
sudo systemctl restart fail2banReiniciar o serviço Fail2Ban
sudo systemctl status fail2banVerificar o status do serviço
sudo fail2ban-client statusListar todos os jails ativos
sudo fail2ban-client status sshdMostrar status e IPs bloqueados do jail sshd
sudo fail2ban-client set sshd banip 203.0.113.100Bloquear manualmente um IP no jail sshd
sudo fail2ban-client set sshd unbanip 203.0.113.100Desbloquear um IP específico do jail sshd
sudo fail2ban-client unban --allDesbloquear todos os IPs em todos os jails
sudo fail2ban-client get sshd bantimeMostrar a duração atual do bloqueio para um jail
sudo fail2ban-client get sshd maxretryMostrar o limite atual de tentativas para um jail
sudo fail2ban-client get sshd ignoreipMostrar IPs na lista branca para um jail
sudo fail2ban-client reloadRecarregar configuração sem reiniciar
sudo fail2ban-client reload sshdRecarregar um jail específico
sudo tail -100 /var/log/fail2ban.logVer entradas recentes do log do Fail2Ban
sudo zgrep "Ban" /var/log/fail2ban.log*Buscar eventos de bloqueio em todos os arquivos de log

Solução de Problemas

Fail2Ban Não Inicia

Verifique os logs em busca de erros de configuração:

sudo fail2ban-client -t
sudo journalctl -u fail2ban --since "10 minutes ago"

Causas comuns:

  • Erros de sintaxe no jail.local (colchetes faltando, indentação incorreta)
  • Arquivos de log referenciados que não existem (por exemplo, /var/log/nginx/error.log quando o Nginx não está instalado)
  • Erros de regex em filtros personalizados

IPs Não Estão Sendo Bloqueados

Verifique se o jail está habilitado e monitorando o arquivo de log correto:

sudo fail2ban-client status sshd

Verifique se o filtro corresponde às entradas no log:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Este comando testa o filtro contra o arquivo de log real e relata quantas correspondências encontra. Se a contagem for zero, o filtro não está detectando os padrões esperados.

Usuários Legítimos Estão Sendo Bloqueados

Se os usuários reportam estar bloqueados:

  1. Desbloqueie-os imediatamente:
sudo fail2ban-client set sshd unbanip IP_DO_USUARIO
  1. Adicione o IP ou rede deles à lista branca:
sudo fail2ban-client set sshd addignoreip IP_DO_USUARIO
  1. Para uma correção permanente, adicione o IP ao ignoreip no jail.local e recarregue.

Os Bloqueios do Fail2Ban Não Persistem Após Reinício

Por padrão, o Fail2Ban não persiste os bloqueios entre reinícios do serviço. Para habilitar a persistência, configure um banco de dados de bloqueios:

[DEFAULT]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400

A configuração dbpurgeage controla por quanto tempo (em segundos) as entradas antigas são mantidas no banco de dados.

Alto Uso de Memória com Muitos Jails

Se o Fail2Ban usa memória excessiva:

  • Reduza o número de jails ativos apenas para o que você precisa
  • Defina dbpurgeage para um valor mais baixo para reduzir o tamanho do banco de dados
  • Certifique-se de que os arquivos de log estão sendo rotacionados corretamente com logrotate

Resumo

O Fail2Ban é uma ferramenta de segurança essencial para qualquer servidor Linux exposto à internet. Ao monitorar arquivos de log e bloquear automaticamente IPs que exibem comportamento malicioso, ele fornece uma camada de defesa proativa que trabalha junto ao seu firewall. As configurações-chave abordadas neste guia — proteção SSH, jails do Nginx, integração com UFW e notificações por e-mail — cobrem os vetores de ataque mais comuns para servidores em produção.

Pontos-chave:

  • Sempre crie um arquivo jail.local em vez de editar jail.conf diretamente
  • Adicione seus próprios endereços IP à lista branca para prevenir bloqueios acidentais
  • Use tempos de bloqueio progressivos para penalizar reincidentes
  • Combine o Fail2Ban com UFW para gerenciamento consistente de firewall
  • Teste filtros personalizados com fail2ban-regex antes de implantá-los
  • Monitore o log do Fail2Ban regularmente para entender o panorama de ameaças do seu servidor

Para uma configuração de segurança completa, combine o Fail2Ban com as técnicas descritas em nossos guias sobre Hardening de SSH, Configuração do Firewall UFW e a Lista de Verificação de Segurança para Servidores Linux.