16 min de leitura · Guia técnico
Configurar Fail2Ban no Debian 12 significa instalar e ajustar um sistema de detecção e bloqueio automático de IPs que realizam tentativas repetidas de acesso não autorizado ao seu servidor. Para proteger SSH, Nginx, Apache e outros serviços com logs, regras e alertas, siga estes passos:
- Instalar o Fail2Ban via apt no Debian 12
- Criar o arquivo
jail.localcom as regras personalizadas - Configurar filtros e parâmetros de banimento (bantime, findtime, maxretry)
- Ativar jails para SSH, Nginx e outros serviços
- Configurar alertas por e-mail para notificações de bloqueio
- Verificar logs e testar o funcionamento das regras
Pré-requisitos para configurar o Fail2Ban no Debian 12
- Servidor com Debian 12 (Bookworm) instalado e atualizado
- Acesso root ou usuário com privilégios sudo
- Conexão SSH ativa — recomenda-se ter acesso alternativo (console VNC/KVM) antes de alterar regras de firewall
- Serviço iptables ou nftables disponível (o Fail2Ban usa ambos como backend)
- Serviço de e-mail configurado (Postfix ou similar) para alertas opcionais
- Python 3 instalado (dependência do Fail2Ban no Debian 12)
Se você ainda não configurou seu servidor Linux, consulte o artigo Configurando um Servidor Linux para Hospedagem de Sites antes de prosseguir.
Instalação do Fail2Ban no Debian 12
O processo de instalação do Fail2Ban em ambientes Debian 12 começa pela atualização dos repositórios e instalação do pacote oficial. O Debian 12 disponibiliza o Fail2Ban diretamente nos repositórios padrão, sem necessidade de adicionar fontes externas.
- Atualize a lista de pacotes:
sudo apt update && sudo apt upgrade -y
- Instale o Fail2Ban e o pacote de envio de e-mail:
sudo apt install fail2ban mailutils -y
Output esperado:
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
fail2ban mailutils python3-pyinotify
...
Setting up fail2ban (1.0.2-2) ...
- Habilite e inicie o serviço:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
- Verifique o status do serviço:
sudo systemctl status fail2ban
Output esperado:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled)
Active: active (running) since ...
Com o serviço ativo, o Fail2Ban já monitora o SSH por padrão usando as configurações globais. O próximo passo é personalizar essas configurações sem modificar os arquivos originais.
Configurar o arquivo jail.local com regras personalizadas
A configuração de regras de bloqueio no Fail2Ban deve ser feita exclusivamente no arquivo jail.local, nunca no jail.conf original — que pode ser sobrescrito em atualizações do sistema. Essa separação garante que suas personalizações sobrevivam a upgrades de pacote.
- Copie o arquivo de configuração padrão como base:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- Abra o arquivo para edição:
sudo nano /etc/fail2ban/jail.local
- Localize a seção
[DEFAULT]e ajuste os parâmetros globais:
[DEFAULT]
# IP do seu acesso — nunca será bloqueado
ignoreip = 127.0.0.1/8 ::1 SEU_IP_AQUI
# Tempo de bloqueio: 1 hora (em segundos)
bantime = 3600
# Janela de tempo para contar tentativas: 10 minutos
findtime = 600
# Máximo de tentativas antes do bloqueio
maxretry = 5
# Backend de detecção de log
backend = auto
# Suporte a IPv6
allowipv6 = auto
# Ação padrão: banir e enviar e-mail
action = %(action_mwl)s
# E-mail para alertas
destemail = [email protected]
sendername = Fail2Ban-Servidor
mta = sendmail
Atenção: substitua SEU_IP_AQUI pelo endereço IP real da sua máquina de administração antes de salvar. Ignorar esse passo pode resultar no bloqueio do seu próprio acesso SSH.
- Salve o arquivo com
Ctrl+O,Entere saia comCtrl+X.
Ativar jails para SSH, Nginx e Apache no Debian 12
As jails do Fail2Ban definem quais serviços serão monitorados e com quais parâmetros específicos. Cada jail monitora um arquivo de log diferente e aplica um filtro de expressão regular para identificar tentativas de acesso inválidas.
Adicione as seguintes seções ao final do arquivo /etc/fail2ban/jail.local:
# Proteção SSH
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
findtime = 300
# Proteção Nginx — requisições inválidas
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
# Proteção Nginx — limite de requisições (rate limiting)
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
# Proteção Apache — autenticação básica
[apache-auth]
enabled = true
filter = apache-auth
port = http,https
logpath = /var/log/apache2/error.log
maxretry = 5
# Proteção contra varredura de portas com Nginx
[nginx-botsearch]
enabled = true
filter = nginx-botsearch
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
Após salvar as alterações, reinicie o Fail2Ban para aplicar as novas jails:
sudo systemctl restart fail2ban
Verifique quais jails estão ativas:
sudo fail2ban-client status
Output esperado:
Status
|- Number of jail: 5
`- Jail list: apache-auth, nginx-botsearch, nginx-http-auth, nginx-limit-req, sshd
Configurar alertas por e-mail no Fail2Ban
O sistema de notificações do Fail2Ban permite receber alertas automáticos sempre que um IP for bloqueado, incluindo o log completo das tentativas que motivaram o banimento. Essa funcionalidade é essencial para monitoramento proativo de segurança em servidores de produção.
Para que os alertas funcionem, o Postfix deve estar instalado e configurado no servidor. Instale-o se necessário:
sudo apt install postfix -y
Durante a instalação, selecione Internet Site e informe o hostname do servidor quando solicitado.
No arquivo jail.local, confirme que as seguintes linhas estão presentes na seção [DEFAULT]:
destemail = [email protected]
sendername = Fail2Ban
mta = sendmail
action = %(action_mwl)s
O parâmetro action_mwl (mail with log) envia o e-mail de alerta com as linhas de log que causaram o bloqueio. As opções disponíveis são:
- action_: apenas bane o IP, sem notificação
- action_mw: bane e envia e-mail simples
- action_mwl: bane e envia e-mail com log completo (recomendado)
Teste o envio de e-mail manualmente para confirmar que o Postfix está funcionando:
echo "Teste Fail2Ban" | mail -s "Teste de alerta" [email protected]
Analisar logs do Fail2Ban e monitorar bloqueios
O monitoramento de logs é a principal forma de auditar a eficácia das regras de bloqueio e identificar padrões de ataque ao servidor. O Fail2Ban registra todas as ações em /var/log/fail2ban.log.
Visualize os eventos em tempo real:
sudo tail -f /var/log/fail2ban.log
Output esperado:
2024-01-15 14:23:01,234 fail2ban.filter [INFO] [sshd] Found 203.0.113.45 - 2024-01-15 14:23:01
2024-01-15 14:23:05,891 fail2ban.filter [INFO] [sshd] Found 203.0.113.45 - 2024-01-15 14:23:05
2024-01-15 14:23:09,102 fail2ban.actions [NOTICE] [sshd] Ban 203.0.113.45
Verifique o status detalhado de uma jail específica:
sudo fail2ban-client status sshd
Output esperado:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 47
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 3
|- Total banned: 12
`- Banned IP list: 203.0.113.45 198.51.100.22 192.0.2.88
Para verificar as regras de firewall criadas pelo Fail2Ban via iptables:
sudo iptables -L f2b-sshd -n --line-numbers
Output esperado:
Chain f2b-sshd (1 references)
num target prot opt source destination
1 REJECT all -- 203.0.113.45 0.0.0.0/0
2 REJECT all -- 198.51.100.22 0.0.0.0/0
3 RETURN all -- 0.0.0.0/0 0.0.0.0/0
Para filtrar apenas os banimentos do log:
sudo grep "Ban " /var/log/fail2ban.log | tail -20
Para ver estatísticas por jail em um único comando:
sudo fail2ban-client status | grep "Jail list" | sed "s/ //g" | awk -F: '{print $2}' | sed "s/,/\n/g" | xargs -I{} sudo fail2ban-client status {}
Você também pode consultar o artigo Dicas de Otimização de Servidores Linux para complementar a segurança do seu servidor com outras boas práticas.
Criar filtros personalizados no Fail2Ban
Os filtros personalizados permitem que o Fail2Ban detecte padrões específicos de ataque que não estão cobertos pelos filtros padrão. Cada filtro é um arquivo de expressão regular que analisa as entradas de log de um serviço.
Crie um filtro personalizado para bloquear tentativas de acesso a arquivos PHP maliciosos via Nginx:
sudo nano /etc/fail2ban/filter.d/nginx-php-exploit.conf
[Definition]
failregex = ^ .* "(GET|POST) .*\.(php|asp|aspx|jsp)\?.*=(http|https|ftp):\/\/.* HTTP.*" (400|403|404|500) .*$
^ .* "(GET|POST) .*(eval|base64_decode|system|passthru|exec|shell_exec).* HTTP.*" (400|403|404|500) .*$
ignoreregex =
Adicione a jail correspondente no jail.local:
[nginx-php-exploit]
enabled = true
filter = nginx-php-exploit
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 1
bantime = 86400
findtime = 3600
Teste o filtro antes de ativá-lo para garantir que as expressões regulares funcionam corretamente:
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-exploit.conf
Output esperado:
Running tests
=============
Use failregex filter file : nginx-php-exploit
Use log file : /var/log/nginx/access.log
Results
=======
Failregex: 7 total
Ignoreregex: 0 total
Date template hits:
Lines: 1523 lines, 0 ignored, 7 matched, 1516 missed
Reinicie o Fail2Ban após criar novos filtros:
sudo systemctl restart fail2ban
Problemas comuns e como resolver
Sintoma: Fail2Ban não está bloqueando IPs mesmo após múltiplas tentativas
Causa: O arquivo de log configurado na jail não existe ou o caminho está incorreto. O Fail2Ban não consegue monitorar um arquivo que não existe, e não gera erro visível por padrão.
Solução: Verifique se o arquivo de log existe com ls -la /var/log/auth.log. Se o serviço usar journald em vez de arquivos de log tradicionais, altere o backend da jail para backend = systemd e remova o parâmetro logpath. Reinicie o Fail2Ban após a correção.
Sintoma: O serviço Fail2Ban falha ao iniciar com erro "ERROR Failed to start"
Causa: Erro de sintaxe no arquivo jail.local ou em um filtro personalizado. Uma vírgula extra, indentação incorreta ou parâmetro inválido pode impedir a inicialização.
Solução: Execute sudo fail2ban-client -t para testar a configuração antes de reiniciar. O comando exibirá a linha exata com o erro. Corrija o problema identificado e tente iniciar o serviço novamente com sudo systemctl start fail2ban.
Sintoma: IP legítimo foi bloqueado acidentalmente
Causa: O IP não estava na lista ignoreip e atingiu o limite de tentativas — comum após erros de digitação de senha ou scripts de monitoramento mal configurados.
Solução: Desbloqueie o IP imediatamente com sudo fail2ban-client set sshd unbanip IP_BLOQUEADO. Em seguida, adicione o IP à diretiva ignoreip no jail.local e reinicie o serviço. Para evitar recorrência, considere aumentar o valor de maxretry para IPs de redes internas.
Sintoma: Alertas de e-mail não estão sendo enviados
Causa: O Postfix não está instalado, não está em execução ou o parâmetro mta está configurado incorretamente no jail.local.
Solução: Verifique o status do Postfix com sudo systemctl status postfix. Confirme que o parâmetro mta = sendmail está definido na seção [DEFAULT]. Teste o envio manual com echo "teste" | mail -s "teste" [email protected] e verifique os logs do Postfix em /var/log/mail.log.
Sintoma: Regras do Fail2Ban somem após reinicialização do servidor
Causa: O Fail2Ban não está configurado para iniciar automaticamente com o sistema, ou o iptables não está persistindo as regras entre reinicializações.
Solução: Execute sudo systemctl enable fail2ban para habilitar o início automático. O Fail2Ban recria as regras de firewall automaticamente ao iniciar, portanto não é necessário persistir as regras do iptables manualmente — desde que o serviço esteja habilitado.
Perguntas frequentes sobre Fail2Ban
O Fail2Ban bloqueia ataques DDoS?
O Fail2Ban não foi projetado para mitigar DDoS volumétrico, mas é eficaz contra ataques de força bruta distribuídos em baixa intensidade. Para DDoS real, combine o Fail2Ban com soluções de firewall de borda como nftables ou um serviço de CDN com proteção dedicada.
Como verificar se o Fail2Ban está bloqueando um IP?
Execute o comando fail2ban-client status sshd para listar os IPs banidos na jail do SSH. O campo Banned IP list exibirá todos os endereços atualmente bloqueados. Para verificar o histórico completo, consulte o arquivo /var/log/fail2ban.log.
Qual a diferença entre bantime, findtime e maxretry no Fail2Ban?
O bantime define por quantos segundos o IP ficará bloqueado após atingir o limite. O findtime é a janela de tempo em que as tentativas são contadas. O maxretry é o número máximo de falhas permitidas dentro do findtime antes do bloqueio ser aplicado. Por exemplo, com maxretry = 5, findtime = 600 e bantime = 3600, um IP que falhar 5 vezes em 10 minutos ficará bloqueado por 1 hora.
O Fail2Ban funciona com IPv6?
Sim, o Fail2Ban suporta IPv6 nativamente a partir da versão 0.10. No Debian 12, a versão disponível nos repositórios já inclui suporte completo a IPv6. Certifique-se de que o parâmetro allowipv6 = auto esteja definido no arquivo jail.conf ou jail.local.
Como desbanir um IP bloqueado pelo Fail2Ban?
Execute fail2ban-client set sshd unbanip 192.168.1.100 substituindo o IP pelo endereço que deseja liberar. O desbloqueio é imediato e não requer reinicialização do serviço. Para evitar bloqueios acidentais do seu próprio IP, adicione-o à diretiva ignoreip no arquivo jail.local.
Conclusão
Configurar o Fail2Ban corretamente no Debian 12 reduz significativamente a superfície de ataque do seu servidor ao bloquear automaticamente IPs com comportamento suspeito. Os pontos mais importantes desta configuração são:
- Sempre use o arquivo
jail.localpara personalizações — nunca edite ojail.confdiretamente, pois ele pode ser sobrescrito em atualizações do pacote. - Configure a diretiva
ignoreipcom o IP da sua máquina de administração antes de ativar qualquer jail, para evitar bloquear seu próprio acesso SSH. - Monitore regularmente o arquivo
/var/log/fail2ban.loge usefail2ban-client statuspara auditar os bloqueios ativos e ajustar os parâmetros conforme o perfil de tráfego do seu servidor.
Leia também
- Entenda o que é Fail2Ban: como funciona e exemplos práticos
- Solucionar problemas de bloqueio de IP por fail2ban em VPS Linux e servidor dedicado
- Passo a passo para configurar autenticação de dois fatores (2FA) no SSH do VPS Linux e servidor dedicado
Precisa de ajuda com segurança no seu servidor Linux?
Configurar ferramentas de segurança como o Fail2Ban é mais eficaz quando o servidor já está em uma infraestrutura confiável e bem dimensionada. A AviraHost oferece servidores VPS com Debian 12 pré-instalado, suporte técnico especializado e recursos que facilitam a implementação de boas práticas de segurança desde o primeiro acesso.