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:
- Arquivos de log — a fonte da verdade. Os serviços registram falhas de autenticação e erros em arquivos de log
- Filtros — expressões regulares que correspondem a padrões específicos em arquivos de log (por exemplo, “Failed password for” no auth.log)
- Jails — unidades de configuração que combinam um filtro com um caminho de arquivo de log, limites (maxretry, findtime) e uma ação
- 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:
| Arquivo | Propósito | Editável? |
|---|---|---|
/etc/fail2ban/fail2ban.conf | Configurações do daemon (nível de log, socket) | Não — usar fail2ban.local |
/etc/fail2ban/jail.conf | Definições padrão de jails | Não — usar jail.local |
/etc/fail2ban/jail.local | Suas sobrescritas personalizadas de jails | Sim — esta é sua config principal |
/etc/fail2ban/jail.d/*.conf | Configurações adicionais de jails | Sim |
/etc/fail2ban/filter.d/*.conf | Definições de filtros (padrões regex) | Sim — para filtros personalizados |
/etc/fail2ban/action.d/*.conf | Definições de ações (comandos ban/unban) | Sim — para ações personalizadas |
Importante: Nunca edite
jail.confoufail2ban.confdiretamente. Esses arquivos são sobrescritos durante atualizações do pacote. Sempre crie arquivos.localque 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ção | Comportamento |
|---|---|
%(action_)s | Apenas bloqueio (sem notificação) |
%(action_mw)s | Bloqueio + e-mail com informações WHOIS |
%(action_mwl)s | Bloqueio + 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
| Comando | Descrição |
|---|---|
sudo systemctl start fail2ban | Iniciar o serviço Fail2Ban |
sudo systemctl stop fail2ban | Parar o serviço Fail2Ban |
sudo systemctl restart fail2ban | Reiniciar o serviço Fail2Ban |
sudo systemctl status fail2ban | Verificar o status do serviço |
sudo fail2ban-client status | Listar todos os jails ativos |
sudo fail2ban-client status sshd | Mostrar status e IPs bloqueados do jail sshd |
sudo fail2ban-client set sshd banip 203.0.113.100 | Bloquear manualmente um IP no jail sshd |
sudo fail2ban-client set sshd unbanip 203.0.113.100 | Desbloquear um IP específico do jail sshd |
sudo fail2ban-client unban --all | Desbloquear todos os IPs em todos os jails |
sudo fail2ban-client get sshd bantime | Mostrar a duração atual do bloqueio para um jail |
sudo fail2ban-client get sshd maxretry | Mostrar o limite atual de tentativas para um jail |
sudo fail2ban-client get sshd ignoreip | Mostrar IPs na lista branca para um jail |
sudo fail2ban-client reload | Recarregar configuração sem reiniciar |
sudo fail2ban-client reload sshd | Recarregar um jail específico |
sudo tail -100 /var/log/fail2ban.log | Ver 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.logquando 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:
- Desbloqueie-os imediatamente:
sudo fail2ban-client set sshd unbanip IP_DO_USUARIO
- Adicione o IP ou rede deles à lista branca:
sudo fail2ban-client set sshd addignoreip IP_DO_USUARIO
- Para uma correção permanente, adicione o IP ao
ignoreipnojail.locale 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
dbpurgeagepara 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.localem vez de editarjail.confdiretamente - 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-regexantes 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.