{"id":1147,"date":"2026-06-17T17:53:00","date_gmt":"2026-06-17T20:53:00","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/06\/17\/aula-14-fail2ban-monitoramento-whitelist-e-troubleshooting\/"},"modified":"2026-06-17T17:53:00","modified_gmt":"2026-06-17T20:53:00","slug":"aula-14-fail2ban-monitoramento-whitelist-e-troubleshooting","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/17\/aula-14-fail2ban-monitoramento-whitelist-e-troubleshooting\/","title":{"rendered":"Aula 14: fail2ban \u2014 Monitoramento, Whitelist e Troubleshooting"},"content":{"rendered":"<p>Dominar o <strong>fail2ban<\/strong> vai muito al\u00e9m de instalar o pacote e ativar algumas jails padr\u00e3o. Em ambientes de produ\u00e7\u00e3o reais \u2014 servidores web, gateways de e-mail, clusters de bancos de dados e infraestrutura cr\u00edtica \u2014 o profissional de seguran\u00e7a precisa ter controle total sobre <strong>quem est\u00e1 sendo bloqueado<\/strong>, <strong>por quanto tempo<\/strong> e, principalmente, <strong>quem jamais deve ser bloqueado<\/strong>. \u00c9 exatamente nesse ponto que entram tr\u00eas pilares fundamentais da opera\u00e7\u00e3o do <strong>fail2ban<\/strong>: o monitoramento cont\u00ednuo dos eventos de banimento, a configura\u00e7\u00e3o precisa de whitelists (listas de exclus\u00e3o) e a capacidade de diagnosticar e corrigir problemas quando o sistema n\u00e3o se comporta como esperado. Sem esses tr\u00eas elementos, o <strong>fail2ban<\/strong> pode se transformar em um risco: imagine bloquear acidentalmente o IP do seu pr\u00f3prio escrit\u00f3rio, de um servi\u00e7o de monitoramento externo ou de um balanceador de carga leg\u00edtimo. As consequ\u00eancias v\u00e3o desde indisponibilidade de servi\u00e7os at\u00e9 chamados urgentes no meio da madrugada.<\/p>\n<p>Em nossa experi\u00eancia di\u00e1ria na <strong>JRT Technology Solutions<\/strong>, implementando e gerenciando sistemas de prote\u00e7\u00e3o para empresas de m\u00e9dio e grande porte, j\u00e1 presenciamos cen\u00e1rios em que uma whitelist mal configurada derrubou o acesso administrativo de toda uma equipe de DevOps. Por outro lado, tamb\u00e9m j\u00e1 vimos ambientes onde a falta de monitoramento adequado permitiu que ataques de for\u00e7a bruta passassem despercebidos por dias \u2014 simplesmente porque ningu\u00e9m verificava se o <strong>fail2ban<\/strong> estava efetivamente bloqueando os IPs maliciosos. Esta aula foi projetada para que voc\u00ea n\u00e3o cometa esses erros. Vamos mergulhar fundo nos mecanismos de logging, nas op\u00e7\u00f5es avan\u00e7adas de whitelist (incluindo listas din\u00e2micas e arquivos externos), nas t\u00e9cnicas de verifica\u00e7\u00e3o de funcionamento e em um roteiro completo de troubleshooting que nossos especialistas utilizam diariamente para resolver os problemas mais comuns e os mais obscuros do <strong>fail2ban<\/strong>.<\/p>\n<p>Ao final desta aula, voc\u00ea ter\u00e1 autonomia para inspecionar cada a\u00e7\u00e3o que o <strong>fail2ban<\/strong> executa, excluir preventivamente IPs e faixas inteiras de endere\u00e7os confi\u00e1veis, detectar gargalos de desempenho, interpretar corretamente os arquivos de log e aplicar corre\u00e7\u00f5es r\u00e1pidas quando as jails pararem de funcionar. Todo o conte\u00fado \u00e9 baseado em cen\u00e1rios reais, com comandos testados e validados nas distribui\u00e7\u00f5es Linux mais utilizadas no mercado corporativo. Se voc\u00ea j\u00e1 concluiu as aulas anteriores do curso, onde instalamos e configuramos as jails b\u00e1sicas do <strong>fail2ban<\/strong>, est\u00e1 pronto para elevar seu conhecimento ao n\u00edvel intermedi\u00e1rio e come\u00e7ar a operar o sistema com a confian\u00e7a de um administrador experiente.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>Compreender a arquitetura de logging do <strong>fail2ban<\/strong> e como extrair informa\u00e7\u00f5es relevantes dos arquivos de log<\/li>\n<li>Configurar whitelists est\u00e1ticas e din\u00e2micas utilizando o par\u00e2metro <strong>ignoreip<\/strong> e arquivos externos<\/li>\n<li>Monitorar em tempo real os banimentos e desbanimentos com comandos nativos do <strong>fail2ban-client<\/strong><\/li>\n<li>Interpretar o log principal (<strong>\/var\/log\/fail2ban.log<\/strong>) para auditoria e diagn\u00f3stico<\/li>\n<li>Executar procedimentos completos de troubleshooting para as falhas mais comuns do <strong>fail2ban<\/strong><\/li>\n<li>Aplicar verifica\u00e7\u00f5es sistem\u00e1ticas para garantir que todas as jails est\u00e3o operacionais<\/li>\n<li>Utilizar express\u00f5es regulares de teste (failregex) para validar regras de detec\u00e7\u00e3o sem depender de ataques reais<\/li>\n<li>Diferenciar erros de configura\u00e7\u00e3o, permiss\u00e3o e sintaxe nos arquivos <strong>jail.local<\/strong> e <strong>filter.d<\/strong><\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para acompanhar esta aula com aproveitamento m\u00e1ximo, voc\u00ea precisa ter o <strong>fail2ban<\/strong> instalado e funcionando em um servidor Linux \u2014 recomendamos Ubuntu Server 22.04\/24.04 LTS, Debian 12, CentOS Stream 9 ou Rocky Linux 9. \u00c9 imprescind\u00edvel que voc\u00ea j\u00e1 tenha conclu\u00eddo as aulas anteriores do curso, especialmente aquelas que cobrem a instala\u00e7\u00e3o do <strong>fail2ban<\/strong>, a estrutura de diret\u00f3rios (<strong>\/etc\/fail2ban\/<\/strong>), a diferen\u00e7a entre <strong>jail.conf<\/strong> e <strong>jail.local<\/strong> e a ativa\u00e7\u00e3o de jails como <strong>sshd<\/strong>, <strong>nginx-http-auth<\/strong> ou <strong>postfix<\/strong>. Voc\u00ea precisar\u00e1 de acesso root ou privil\u00e9gios de sudo em todos os servidores utilizados. Al\u00e9m disso, tenha um editor de texto de sua prefer\u00eancia (nano, vim ou micro) e certifique-se de que o servi\u00e7o <strong>fail2ban<\/strong> est\u00e1 em execu\u00e7\u00e3o \u2014 utilizaremos o <strong>systemctl<\/strong> para controlar o daemon. Se voc\u00ea utiliza firewalld (CentOS\/RHEL\/Rocky), verifique se ele est\u00e1 ativo, pois o <strong>fail2ban<\/strong> interage diretamente com o firewall do sistema para criar e remover regras de bloqueio.<\/p>\n<p>Recomendamos tamb\u00e9m que voc\u00ea tenha uma segunda sess\u00e3o de terminal aberta ou utilize ferramentas como <strong>tmux<\/strong> ou <strong>screen<\/strong>. Durante os exerc\u00edcios de monitoramento em tempo real, precisaremos visualizar logs enquanto realizamos a\u00e7\u00f5es simult\u00e2neas. Por fim, se poss\u00edvel, tenha um segundo IP dispon\u00edvel (por exemplo, via VPN ou outro servidor na mesma rede) para simular tentativas de acesso que gerem eventos de banimento \u2014 isso tornar\u00e1 o aprendizado muito mais concreto e facilitar\u00e1 a compreens\u00e3o dos mecanismos de whitelist e troubleshooting que exploraremos a fundo.<\/p>\n<h3>A Import\u00e2ncia do Monitoramento Cont\u00ednuo no fail2ban<\/h3>\n<p>O <strong>fail2ban<\/strong> \u00e9, por natureza, um sistema reativo. Ele n\u00e3o previne ataques \u2014 ele responde a eles com base em padr\u00f5es detectados nos arquivos de log dos servi\u00e7os protegidos. Essa caracter\u00edstica torna o monitoramento uma atividade cr\u00edtica: sem visibilidade sobre o que est\u00e1 acontecendo, voc\u00ea est\u00e1 essencialmente operando no escuro. Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, implementamos rotinas de verifica\u00e7\u00e3o que incluem confer\u00eancias peri\u00f3dicas do status das jails, an\u00e1lise automatizada dos logs de banimento e alertas proativos quando o n\u00famero de IPs bloqueados ultrapassa determinados thresholds. Um pico repentino de banimentos pode indicar um ataque em andamento \u2014 ou, pior, um falso positivo que est\u00e1 bloqueando tr\u00e1fego leg\u00edtimo em massa.<\/p>\n<p>O monitoramento do <strong>fail2ban<\/strong> se divide em tr\u00eas camadas principais. A primeira \u00e9 o acompanhamento em tempo real via <strong>fail2ban-client<\/strong>, que permite consultar o status de cada jail individualmente, listar IPs banidos e verificar estat\u00edsticas como total de falhas detectadas e banimentos ativos. A segunda camada envolve a an\u00e1lise dos arquivos de log \u2014 principalmente o <strong>\/var\/log\/fail2ban.log<\/strong> \u2014 onde cada a\u00e7\u00e3o do daemon \u00e9 registrada com timestamp, n\u00edvel de severidade e detalhes sobre o IP, a jail afetada e o servi\u00e7o de origem. A terceira camada, mais avan\u00e7ada, integra o <strong>fail2ban<\/strong> a sistemas de monitoramento externos como Zabbix, Nagios, Prometheus ou Grafana, exportando m\u00e9tricas que podem disparar alertas e gerar dashboards operacionais. Nesta aula, focaremos nas duas primeiras camadas, que formam a base indispens\u00e1vel antes de qualquer integra\u00e7\u00e3o mais sofisticada.<\/p>\n<h3>Entendendo a Whitelist (ignoreip) a Fundo<\/h3>\n<p>O par\u00e2metro <strong>ignoreip<\/strong> \u00e9, provavelmente, uma das configura\u00e7\u00f5es mais subestimadas \u2014 e perigosas \u2014 do ecossistema <strong>fail2ban<\/strong>. Ele define uma lista de endere\u00e7os IP, faixas de rede ou hosts DNS que ser\u00e3o completamente ignorados por todas as jails (quando definido globalmente na se\u00e7\u00e3o <strong>[DEFAULT]<\/strong>) ou por jails espec\u00edficas. Na pr\u00e1tica, qualquer IP que corresponda a uma entrada em <strong>ignoreip<\/strong> pode realizar quantas tentativas de falha quiser sem jamais ser bloqueado. Isso torna o par\u00e2metro extremamente poderoso para proteger IPs confi\u00e1veis, mas tamb\u00e9m o transforma em uma potencial vulnerabilidade se configurado de forma descuidada \u2014 um range excessivamente amplo (como <strong>10.0.0.0\/8<\/strong> aplicado globalmente, por exemplo) pode criar uma porta dos fundos imensa para atacantes internos ou dispositivos comprometidos.<\/p>\n<p>A l\u00f3gica de processamento do <strong>ignoreip<\/strong> segue a ordem: primeiro s\u00e3o avaliadas as whitelists globais (definidas em <strong>[DEFAULT]<\/strong>), depois as whitelists espec\u00edficas da jail. Se um IP estiver em qualquer uma dessas listas, ele \u00e9 imediatamente ignorado, mesmo que j\u00e1 tenha excedido os limites de <strong>maxretry<\/strong>. O <strong>fail2ban<\/strong> tamb\u00e9m aceita m\u00e1scaras de rede no formato CIDR (como <strong>192.168.1.0\/24<\/strong>), o que permite proteger faixas inteiras de endere\u00e7os com uma \u00fanica linha. Al\u00e9m disso, \u00e9 poss\u00edvel referenciar arquivos externos contendo listas de IPs, uma pr\u00e1tica recomendada para ambientes que gerenciam whitelists din\u00e2micas \u2014 por exemplo, listas atualizadas automaticamente com os IPs dos escrit\u00f3rios corporativos, data centers parceiros ou servi\u00e7os de CDN. O suporte a resolu\u00e7\u00e3o DNS tamb\u00e9m existe, mas deve ser usado com cautela: se o nome de host n\u00e3o for resolv\u00edvel no momento da inicializa\u00e7\u00e3o do <strong>fail2ban<\/strong>, a entrada ser\u00e1 ignorada silenciosamente, sem qualquer aviso de erro.<\/p>\n<h3>Configurando Whitelist no fail2ban \u2014 Passo a Passo Completo<\/h3>\n<p>Agora vamos colocar em pr\u00e1tica a configura\u00e7\u00e3o de whitelists no <strong>fail2ban<\/strong>. Trabalharemos com tr\u00eas cen\u00e1rios progressivos: whitelist global no arquivo <strong>jail.local<\/strong>, whitelist por jail espec\u00edfica e whitelist baseada em arquivo externo. Todos os passos s\u00e3o executados em sistemas Ubuntu\/Debian e CentOS\/RHEL\/Rocky Linux, e o procedimento \u00e9 id\u00eantico em ambas as fam\u00edlias, pois o <strong>fail2ban<\/strong> utiliza a mesma estrutura de arquivos e sintaxe.<\/p>\n<ol>\n<li><strong>Abra o arquivo de configura\u00e7\u00e3o local:<\/strong> Execute <strong>sudo nano \/etc\/fail2ban\/jail.local<\/strong> (ou use vim, conforme sua prefer\u00eancia). Se o arquivo ainda n\u00e3o existir, o editor o criar\u00e1 ao salvar.<\/li>\n<li><strong>Localize ou crie a se\u00e7\u00e3o [DEFAULT]:<\/strong> Esta se\u00e7\u00e3o aplica configura\u00e7\u00f5es a todas as jails, a menos que sejam sobrescritas em uma jail espec\u00edfica.<\/li>\n<li><strong>Adicione o par\u00e2metro ignoreip:<\/strong> Defina os IPs ou faixas que devem ser ignorados globalmente.<\/li>\n<li><strong>Adicione ignoreip em uma jail espec\u00edfica:<\/strong> Se desejar whitelist apenas para SSH, por exemplo, adicione o par\u00e2metro na se\u00e7\u00e3o <strong>[sshd]<\/strong>.<\/li>\n<li><strong>Salve o arquivo e reinicie o fail2ban:<\/strong> As altera\u00e7\u00f5es s\u00f3 entram em vigor ap\u00f3s a reinicializa\u00e7\u00e3o do servi\u00e7o.<\/li>\n<\/ol>\n<p>Abaixo, o conte\u00fado completo do arquivo <strong>\/etc\/fail2ban\/jail.local<\/strong> com whitelist global, whitelist espec\u00edfica para a jail SSH e refer\u00eancia a um arquivo externo de IPs confi\u00e1veis. Este \u00e9 um exemplo funcional que voc\u00ea pode adaptar ao seu ambiente:<\/p>\n<pre><code># \/etc\/fail2ban\/jail.local \u2014 Configura\u00e7\u00e3o completa com whitelist\n# JRT Technology Solutions \u2014 Curso Firewall, fail2ban e CrowdSec\n\n[DEFAULT]\n# Whitelist global: IPs que jamais ser\u00e3o banidos em nenhuma jail\n# 127.0.0.1\/8 \u2014 loopback local (essencial para servi\u00e7os internos)\n# 10.50.0.0\/16 \u2014 rede interna da empresa (exemplo)\n# 203.0.113.5 \u2014 IP p\u00fablico do escrit\u00f3rio central (exemplo)\n# \/etc\/fail2ban\/whitelist.conf \u2014 arquivo externo com IPs din\u00e2micos\nignoreip = 127.0.0.1\/8 10.50.0.0\/16 203.0.113.5 \/etc\/fail2ban\/whitelist.conf\n\n# Tempo de banimento padr\u00e3o (em segundos): 1 hora\nbantime = 3600\n\n# N\u00famero m\u00e1ximo de falhas antes do bloqueio\nmaxretry = 5\n\n# Janela de tempo para contagem de falhas (em segundos)\nfindtime = 600\n\n[sshd]\n# Ativa a jail SSH\nenabled = true\n# Porta monitorada (padr\u00e3o 22; altere se seu SSH usa porta customizada)\nport = ssh\n# Whitelist espec\u00edfica para SSH: IP do administrador remoto\n# Este IP pode errar a senha quantas vezes quiser sem ser banido\nignoreip = 198.51.100.25 192.0.2.10\n\n[nginx-http-auth]\nenabled = true\nport = http,https\n# Esta jail herda a whitelist global do [DEFAULT]\n# Nenhuma whitelist adicional espec\u00edfica foi definida aqui\n<\/code><\/pre>\n<p>O arquivo externo <strong>\/etc\/fail2ban\/whitelist.conf<\/strong> referenciado no par\u00e2metro <strong>ignoreip<\/strong> global deve conter um IP ou faixa por linha. Coment\u00e1rios s\u00e3o permitidos utilizando o caractere <strong>#<\/strong>. Veja o conte\u00fado de exemplo que utilizamos em implanta\u00e7\u00f5es reais na <strong>JRT Technology Solutions<\/strong>:<\/p>\n<pre><code># \/etc\/fail2ban\/whitelist.conf \u2014 Lista externa de IPs confi\u00e1veis\n# Atualizado automaticamente via script de sincroniza\u00e7\u00e3o\n\n# IPs dos escrit\u00f3rios regionais\n198.51.100.1\n198.51.100.2\n198.51.100.3\n\n# Faixa do data center parceiro (AWS VPC)\n172.31.0.0\/16\n\n# Servi\u00e7o de monitoramento externo (exemplo: StatusCake)\n203.0.113.100\n203.0.113.101\n\n# CDN e proxies reversos confi\u00e1veis\n# Cloudflare (apenas faixas de exemplo \u2014 use as listas oficiais)\n# 103.21.244.0\/22\n# 103.22.200.0\/22\n<\/code><\/pre>\n<p><strong>Explica\u00e7\u00e3o linha por linha dos par\u00e2metros utilizados:<\/strong> O <strong>ignoreip<\/strong> na se\u00e7\u00e3o <strong>[DEFAULT]<\/strong> estabelece a pol\u00edtica global \u2014 qualquer IP listado aqui est\u00e1 imune a bloqueios em todas as jails do sistema. O endere\u00e7o <strong>127.0.0.1\/8<\/strong> cobre todo o range de loopback, essencial para que servi\u00e7os rodando localmente (como scripts de monitoramento que fazem conex\u00f5es SMTP ou HTTP de teste) n\u00e3o sejam bloqueados acidentalmente. A faixa <strong>10.50.0.0\/16<\/strong> \u00e9 um exemplo de rede interna corporativa; ajuste-a conforme seu ambiente real. O IP \u00fanico <strong>203.0.113.5<\/strong> representa o endere\u00e7o p\u00fablico fixo do seu escrit\u00f3rio. O caminho <strong>\/etc\/fail2ban\/whitelist.conf<\/strong> instrui o <strong>fail2ban<\/strong> a ler um arquivo externo e incluir todos os IPs e faixas ali listados como parte da whitelist global \u2014 esse arquivo pode ser atualizado sem necessidade de reiniciar o <strong>fail2ban<\/strong> se voc\u00ea utilizar o comando <strong>sudo fail2ban-client reload<\/strong>. Na se\u00e7\u00e3o <strong>[sshd]<\/strong>, o par\u00e2metro <strong>ignoreip<\/strong> \u00e9 redefinido com IPs adicionais, espec\u00edficos para a jail SSH. Quando um par\u00e2metro \u00e9 redefinido em uma jail, ele <strong>substitui<\/strong> completamente o valor herdado do <strong>[DEFAULT]<\/strong> \u2014 ou seja, o SSH da nossa configura\u00e7\u00e3o N\u00c3O herdar\u00e1 os IPs <strong>127.0.0.1\/8<\/strong> ou <strong>10.50.0.0\/16<\/strong>, a menos que sejam repetidos explicitamente. Este \u00e9 um comportamento crucial e uma fonte comum de erros que abordaremos na se\u00e7\u00e3o de troubleshooting.<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\">\n<caption><strong>Tabela 1: Comportamento do par\u00e2metro ignoreip em diferentes contextos<\/strong><\/caption>\n<thead>\n<tr>\n<th>Contexto de Defini\u00e7\u00e3o<\/th>\n<th>Escopo<\/th>\n<th>Herdado por Jails?<\/th>\n<th>Pode ser Sobrescrito?<\/th>\n<th>Reinicializa\u00e7\u00e3o Necess\u00e1ria?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>[DEFAULT]<\/strong><\/td>\n<td>Global \u2014 todas as jails<\/td>\n<td>Sim, a menos que a jail redefina o par\u00e2metro<\/td>\n<td>Sim, por jail espec\u00edfica<\/td>\n<td><strong>fail2ban-client reload<\/strong> ou <strong>systemctl restart fail2ban<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Se\u00e7\u00e3o da jail (ex: <strong>[sshd]<\/strong>)<\/td>\n<td>Apenas a jail espec\u00edfica<\/td>\n<td>N\u00e3o \u2014 substitui completamente o valor herdado<\/td>\n<td>N\u00e3o se aplica a outras jails<\/td>\n<td><strong>fail2ban-client reload<\/strong> ou reinicializa\u00e7\u00e3o da jail espec\u00edfica<\/td>\n<\/tr>\n<tr>\n<td>Arquivo externo referenciado<\/td>\n<td>Depende de onde o arquivo \u00e9 referenciado<\/td>\n<td>Sim, se referenciado no [DEFAULT]<\/td>\n<td>Sim, o conte\u00fado do arquivo pode ser alterado e recarregado<\/td>\n<td><strong>fail2ban-client reload<\/strong> (recarrega o arquivo)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Monitorando o fail2ban em Tempo Real com fail2ban-client<\/h3>\n<p>O utilit\u00e1rio <strong>fail2ban-client<\/strong> \u00e9 a principal interface de comunica\u00e7\u00e3o com o daemon do <strong>fail2ban<\/strong>. Ele se conecta a um socket Unix localizado em <strong>\/var\/run\/fail2ban\/fail2ban.sock<\/strong> (ou similar, dependendo da distribui\u00e7\u00e3o) e permite executar comandos administrativos sem manipular manualmente os arquivos de configura\u00e7\u00e3o ou sinais de processo. Nesta se\u00e7\u00e3o, vamos explorar os comandos mais poderosos para monitoramento em tempo real, come\u00e7ando pelos b\u00e1sicos e avan\u00e7ando para t\u00e9cnicas mais sofisticadas de verifica\u00e7\u00e3o.<\/p>\n<p>O primeiro comando que voc\u00ea deve conhecer \u00e9 o <strong>status<\/strong>, que exibe informa\u00e7\u00f5es gerais sobre o daemon e todas as jails ativas. A sintaxe completa para ver o status geral \u00e9 <strong>sudo fail2ban-client status<\/strong>. Para obter detalhes de uma jail espec\u00edfica, utilize <strong>sudo fail2ban-client status &lt;nome_da_jail&gt;<\/strong> \u2014 por exemplo, <strong>sudo fail2ban-client status sshd<\/strong>. Este segundo formato \u00e9 extremamente \u00fatil porque retorna o n\u00famero atual de IPs banidos naquela jail, a lista completa de filtros aplicados e as a\u00e7\u00f5es configuradas. Abaixo demonstramos a execu\u00e7\u00e3o completa com a sa\u00edda esperada em um servidor com as jails <strong>sshd<\/strong> e <strong>nginx-http-auth<\/strong> ativas e alguns IPs j\u00e1 banidos:<\/p>\n<pre><code># Verificando o status geral do fail2ban\nsudo fail2ban-client status<\/code><\/pre>\n<pre><code class=\"output\">Status\n|- Number of jail:      2\n`- Jail list:   nginx-http-auth, sshd<\/code><\/pre>\n<pre><code># Verificando o status detalhado da jail sshd\nsudo fail2ban-client status sshd<\/code><\/pre>\n<pre><code class=\"output\">Status for the jail: sshd\n|- Filter\n|  |- Currently failed: 3\n|  |- Total failed:     27\n|  `- File list:        \/var\/log\/auth.log\n`- Actions\n   |- Currently banned: 2\n   |- Total banned:     9\n   `- Banned IP list:   203.0.113.99 198.51.100.44<\/code><\/pre>\n<p><strong>Interpreta\u00e7\u00e3o da sa\u00edda:<\/strong> A jail <strong>sshd<\/strong> est\u00e1 ativa e monitorando o arquivo <strong>\/var\/log\/auth.log<\/strong>. O campo <strong>Currently failed<\/strong> (3) indica que h\u00e1 3 tentativas de falha registradas no momento que ainda n\u00e3o atingiram o limite de <strong>maxretry<\/strong>. O campo <strong>Total failed<\/strong> (27) \u00e9 o acumulado hist\u00f3rico desde a \u00faltima reinicializa\u00e7\u00e3o do <strong>fail2ban<\/strong>. Na se\u00e7\u00e3o Actions, vemos que existem atualmente 2 IPs banidos (<strong>Currently banned: 2<\/strong>), e o hist\u00f3rico total registra 9 banimentos \u2014 isso significa que 7 IPs j\u00e1 foram desbanidos (por expira\u00e7\u00e3o do <strong>bantime<\/strong> ou remo\u00e7\u00e3o manual). A lista <strong>Banned IP list<\/strong> exibe exatamente quais IPs est\u00e3o bloqueados neste momento. Com essas informa\u00e7\u00f5es, voc\u00ea pode cruzar os IPs banidos com logs de acesso para investigar a origem de ataques, ou verificar se algum IP leg\u00edtimo foi bloqueado indevidamente.<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\">\n<caption><strong>Tabela 2: Principais comandos do fail2ban-client para monitoramento<\/strong><\/caption>\n<thead>\n<tr>\n<th>Comando<\/th>\n<th>Fun\u00e7\u00e3o<\/th>\n<th>Exemplo de Uso<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>status<\/strong><\/td>\n<td>Exibe status geral ou de uma jail espec\u00edfica<\/td>\n<td><strong>sudo fail2ban-client status sshd<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>get &lt;jail&gt; banned<\/strong><\/td>\n<td>Retorna apenas a lista de IPs banidos na jail<\/td>\n<td><strong>sudo fail2ban-client get sshd banned<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>get &lt;jail&gt; banip &lt;IP&gt;<\/strong><\/td>\n<td>Testa se um IP espec\u00edfico est\u00e1 banido na jail<\/td>\n<td><strong>sudo fail2ban-client get sshd banip 203.0.113.99<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>get &lt;jail&gt; findtime<\/strong><\/td>\n<td>Retorna a janela de tempo configurada para a jail<\/td>\n<td><strong>sudo fail2ban-client get sshd findtime<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>get &lt;jail&gt; maxretry<\/strong><\/td>\n<td>Retorna o n\u00famero m\u00e1ximo de tentativas configurado<\/td>\n<td><strong>sudo fail2ban-client get sshd maxretry<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>get &lt;jail&gt; ignoreip<\/strong><\/td>\n<td>Exibe a lista de IPs na whitelist da jail<\/td>\n<td><strong>sudo fail2ban-client get sshd ignoreip<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>ping<\/strong><\/td>\n<td>Verifica se o daemon est\u00e1 respondendo<\/td>\n<td><strong>sudo fail2ban-client ping<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para um monitoramento realmente em tempo real, voc\u00ea pode combinar o <strong>fail2ban-client<\/strong> com o comando <strong>watch<\/strong> do Linux. Por exemplo, <strong>watch -n 5 &#8216;sudo fail2ban-client status sshd&#8217;<\/strong> atualizar\u00e1 o status da jail SSH a cada 5 segundos, permitindo que voc\u00ea observe em tempo real as mudan\u00e7as nos contadores de falhas e banimentos enquanto um ataque est\u00e1 em andamento ou durante seus testes de valida\u00e7\u00e3o. Outra t\u00e9cnica poderosa, que utilizamos frequentemente em nossos projetos na <strong>JRT Technology Solutions<\/strong>, \u00e9 o monitoramento cont\u00ednuo via tail combinado com grep para criar alertas visuais no terminal:<\/p>\n<pre><code># Monitoramento em tempo real do log do fail2ban\n# Exibe apenas linhas contendo \"Ban\" ou \"Unban\" com cores distintas\nsudo tail -f \/var\/log\/fail2ban.log | grep --color=auto -E \"Ban|Unban|WARNING|ERROR\"<\/code><\/pre>\n<p>A sa\u00edda desse comando mostrar\u00e1, em tempo real, cada vez que um IP for banido ou desbanido em qualquer jail do sistema. O par\u00e2metro <strong>&#8211;color=auto<\/strong> destaca as palavras-chave com cores diferentes, facilitando a identifica\u00e7\u00e3o visual imediata de eventos importantes. Em ambientes de produ\u00e7\u00e3o, recomendamos redirecionar essa sa\u00edda para um arquivo de log separado ou integr\u00e1-la a ferramentas como <strong>Logstash<\/strong> ou <strong>rsyslog<\/strong> para armazenamento de longo prazo e an\u00e1lise hist\u00f3rica. No monitoramento de incidentes reais, a capacidade de correlacionar eventos de banimento do <strong>fail2ban<\/strong> com logs de firewall, IDS e aplica\u00e7\u00f5es web \u00e9 um diferencial competitivo enorme \u2014 e \u00e9 exatamente esse tipo de visibilidade que buscamos construir.<\/p>\n<h3>Analisando os Arquivos de Log do fail2ban<\/h3>\n<p>O arquivo <strong>\/var\/log\/fail2ban.log<\/strong> \u00e9 a fonte prim\u00e1ria de verdade sobre tudo o que acontece no ecossistema do <strong>fail2ban<\/strong>. Cada linha segue um formato consistente que inclui timestamp, n\u00edvel de severidade, nome do m\u00f3dulo ou jail e a mensagem descritiva. Compreender essa estrutura \u00e9 fundamental para auditoria, troubleshooting e integra\u00e7\u00e3o com sistemas externos. A rota\u00e7\u00e3o de logs \u00e9 gerenciada pelo <strong>logrotate<\/strong> atrav\u00e9s do arquivo <strong>\/etc\/logrotate.d\/fail2ban<\/strong>, que por padr\u00e3o mant\u00e9m at\u00e9 12 arquivos rotacionados em distribui\u00e7\u00f5es Debian\/Ubuntu, comprimindo os mais antigos com gzip. Em CentOS\/RHEL\/Rocky Linux, a pol\u00edtica de rota\u00e7\u00e3o pode variar, e recomendamos verificar a configura\u00e7\u00e3o com <strong>cat \/etc\/logrotate.d\/fail2ban<\/strong>.<\/p>\n<p>Os n\u00edveis de severidade utilizados pelo <strong>fail2ban<\/strong> seguem a conven\u00e7\u00e3o padr\u00e3o do syslog: <strong>INFO<\/strong> para opera\u00e7\u00f5es normais (inicializa\u00e7\u00e3o de jails, banimentos, desbanimentos), <strong>WARNING<\/strong> para situa\u00e7\u00f5es que merecem aten\u00e7\u00e3o mas n\u00e3o s\u00e3o cr\u00edticas (IP j\u00e1 banido tentando ser banido novamente, arquivo de log de servi\u00e7o inacess\u00edvel momentaneamente) e <strong>ERROR<\/strong> para falhas que impedem o funcionamento correto (erro de sintaxe em filtro, socket de comunica\u00e7\u00e3o inacess\u00edvel, permiss\u00e3o negada em arquivos essenciais). Em nossas auditorias na <strong>JRT Technology Solutions<\/strong>, treinamos as equipes a nunca ignorarem mensagens de WARNING repetidas \u2014 elas frequentemente s\u00e3o sintomas precoces de problemas que evoluir\u00e3o para ERROR se n\u00e3o forem tratados.<\/p>\n<pre><code># Visualizando as \u00faltimas 50 linhas do log do fail2ban\nsudo tail -n 50 \/var\/log\/fail2ban.log<\/code><\/pre>\n<pre><code class=\"output\">2026-06-17 08:15:23,456 fail2ban.jail           [12345]: INFO    Jail 'sshd' started\n2026-06-17 08:15:23,789 fail2ban.actions        [12345]: NOTICE  [sshd] Ban 203.0.113.99\n2026-06-17 08:15:24,123 fail2ban.filter         [12345]: INFO    [sshd] Found 203.0.113.99 - 2026-06-17 08:15:23\n2026-06-17 08:20:01,234 fail2ban.actions        [12345]: NOTICE  [sshd] Ban 198.51.100.44\n2026-06-17 08:22:18,567 fail2ban.filter         [12345]: INFO    [nginx-http-auth] Found 192.0.2.88 - 2026-06-17 08:22:17\n2026-06-17 08:22:19,012 fail2ban.actions        [12345]: NOTICE  [nginx-http-auth] Ban 192.0.2.88\n2026-06-17 08:22:19,345 fail2ban.actions        [12345]: WARNING [sshd] 203.0.113.99 already banned\n2026-06-17 09:15:25,678 fail2ban.actions        [12345]: NOTICE  [sshd] Unban 203.0.113.99<\/code><\/pre>\n<p><strong>Interpreta\u00e7\u00e3o detalhada de cada linha do log:<\/strong> A primeira linha registra o start da jail <strong>sshd<\/strong>, que ocorreu \u00e0s 08:15:23. O n\u00famero entre colchetes (<strong>[12345]<\/strong>) \u00e9 o PID do processo <strong>fail2ban-server<\/strong>. A segunda linha \u00e9 um evento de banimento (<strong>Ban<\/strong>) do IP <strong>203.0.113.99<\/strong> pela jail SSH. A terceira linha (<strong>Found<\/strong>) indica que o filtro da jail detectou uma nova tentativa de falha \u2014 neste caso, ela coincide com o momento do banimento, mas poderia ser uma falha anterior que estava dentro da janela de <strong>findtime<\/strong>. A quarta linha mostra o banimento do IP <strong>198.51.100.44<\/strong> \u00e0s 08:20:01. A quinta e sexta linhas registram a detec\u00e7\u00e3o e banimento de <strong>192.0.2.88<\/strong> pela jail <strong>nginx-http-auth<\/strong>. A s\u00e9tima linha \u00e9 particularmente importante: o WARNING <strong>already banned<\/strong> indica que o IP <strong>203.0.113.99<\/strong> tentou ser banido novamente enquanto j\u00e1 estava na lista de bloqueio \u2014 isso \u00e9 esperado em ataques persistentes e n\u00e3o representa um problema, mas serve como indicador de que o atacante continua tentando. A oitava linha mostra o desbanimento (<strong>Unban<\/strong>) do mesmo IP exatamente uma hora depois (\u00e0s 09:15:25), consistente com o <strong>bantime = 3600<\/strong> configurado.<\/p>\n<h3>Troubleshooting Avan\u00e7ado \u2014 Diagnosticando e Resolvendo Problemas no fail2ban<\/h3>\n<p>Quando o <strong>fail2ban<\/strong> n\u00e3o est\u00e1 bloqueando IPs como esperado \u2014 ou est\u00e1 bloqueando IPs que n\u00e3o deveria \u2014 \u00e9 hora de iniciar um processo sistem\u00e1tico de troubleshooting. Em nossos atendimentos de suporte na <strong>JRT Technology Solutions<\/strong>, seguimos um roteiro de cinco etapas que nos permite isolar a causa raiz em mais de 90% dos casos em menos de 15 minutos. A primeira etapa \u00e9 sempre verificar se o servi\u00e7o est\u00e1 efetivamente rodando e se as jails est\u00e3o carregadas. A segunda \u00e9 validar a configura\u00e7\u00e3o sint\u00e1tica dos arquivos. A terceira \u00e9 testar os filtros (failregex) com logs de exemplo. A quarta \u00e9 examinar permiss\u00f5es de arquivos e diret\u00f3rios. A quinta \u00e9 ativar o modo debug para obter informa\u00e7\u00f5es detalhadas sobre o processamento interno.<\/p>\n<p><strong>Etapa 1 \u2014 Verifica\u00e7\u00e3o de servi\u00e7o e jails:<\/strong> Execute <strong>sudo systemctl status fail2ban<\/strong> para confirmar que o daemon est\u00e1 ativo. Em seguida, use <strong>sudo fail2ban-client status<\/strong> para listar as jails carregadas. Se uma jail que voc\u00ea configurou n\u00e3o aparecer na lista, h\u00e1 um erro de sintaxe ou de nomenclatura no arquivo <strong>jail.local<\/strong>. Para verificar a sintaxe do arquivo sem iniciar o servi\u00e7o, utilize <strong>sudo fail2ban-server -t<\/strong> \u2014 este comando executa uma valida\u00e7\u00e3o de configura\u00e7\u00e3o e reporta erros de sintaxe com indica\u00e7\u00e3o de linha.<\/p>\n<pre><code># Testando a sintaxe da configura\u00e7\u00e3o do fail2ban\nsudo fail2ban-server -t<\/code><\/pre>\n<pre><code class=\"output\">Configuration test is successful<\/code><\/pre>\n<p><strong>Etapa 2 \u2014 Valida\u00e7\u00e3o dos filtros (failregex):<\/strong> Um dos problemas mais comuns \u00e9 o filtro de uma jail n\u00e3o estar detectando as linhas de log do servi\u00e7o. Para testar se uma express\u00e3o regular (failregex) est\u00e1 funcionando, utilize o comando <strong>fail2ban-regex<\/strong>, que recebe como argumentos uma linha de log (ou arquivo de log) e o arquivo de filtro (ou a express\u00e3o regular diretamente). Abaixo demonstramos o teste com uma linha de falha de autentica\u00e7\u00e3o SSH e o filtro padr\u00e3o <strong>sshd.conf<\/strong>:<\/p>\n<pre><code># Testando o filtro sshd contra uma linha de log de falha de autentica\u00e7\u00e3o\nfail2ban-regex \"Jun 17 08:15:23 server sshd[54321]: Failed password for root from 203.0.113.99 port 22 ssh2\" \/etc\/fail2ban\/filter.d\/sshd.conf<\/code><\/pre>\n<pre><code class=\"output\">Running tests\n=============\n\nUse   failregex filter file : sshd, basedir: \/etc\/fail2ban\nUse         log line : Jun 17 08:15:23 server sshd[54321]: Failed password for invalid user root from 203.0.113.99 port 22 ssh2\n\n\nResults\n=======\n\nFailregex: 1 total\n|-  #) [# of hits] regular expression\n|   1) [1] ^[aA]uthentication failure; .* rhost=&lt;HOST&gt;(?:\\s+.*)?$\n|   2) [1] ^Failed \\S+ for .*? from &lt;HOST&gt;(?: port \\d*)?(?: ssh\\d*)?(: (?!.*preauth).*)?$\n|      ...\n`- \n\nIgnoreregex: 0 total\n\nDate template hits:\n|- [# of hits] date format\n|  [1] {^LN-BEG}TAI64N\n|  [0] ^(?:\\S+ )?(?:@(... )?)?(?:\\[?[0-9]+\\]?[:.])?[0-9]+[.:][0-9]+[.:]?[0-9]*\n`-\n\nLines: 1 lines, 0 ignored, 1 matched, 0 missed\n[processed in 0.01 sec]<\/code><\/pre>\n<p>A sa\u00edda mostra que a linha de log foi processada com sucesso: <strong>1 matched<\/strong> indica que a express\u00e3o regular capturou o IP. Se o resultado fosse <strong>0 matched<\/strong>, significaria que o filtro n\u00e3o reconheceu o formato da linha de log \u2014 situa\u00e7\u00e3o comum quando o servi\u00e7o gera logs em formato diferente do esperado (por exemplo, logs em JSON, timestamps customizados ou mensagens traduzidas para outros idiomas). Nesse caso, voc\u00ea precisaria criar um filtro personalizado ou ajustar o existente, t\u00f3pico que abordaremos em aulas futuras sobre personaliza\u00e7\u00e3o avan\u00e7ada de filtros.<\/p>\n<p><strong>Etapa 3 \u2014 Verifica\u00e7\u00e3o de permiss\u00f5es:<\/strong> O <strong>fail2ban<\/strong> precisa ler os arquivos de log dos servi\u00e7os monitorados. Se o usu\u00e1rio sob o qual o <strong>fail2ban<\/strong> roda (geralmente <strong>root<\/strong> ou, em instala\u00e7\u00f5es mais seguras, um usu\u00e1rio dedicado como <strong>fail2ban<\/strong>) n\u00e3o tiver permiss\u00e3o de leitura nesses arquivos, a jail ser\u00e1 carregada, mas nunca detectar\u00e1 eventos. Execute <strong>sudo -u fail2ban cat \/var\/log\/auth.log<\/strong> (ajuste o arquivo conforme necess\u00e1rio) para testar a permiss\u00e3o. Se receber &#8220;Permission denied&#8221;, ajuste as permiss\u00f5es ou adicione o usu\u00e1rio <strong>fail2ban<\/strong> ao grupo propriet\u00e1rio do arquivo (geralmente <strong>adm<\/strong> ou <strong>systemd-journal<\/strong>).<\/p>\n<p><strong>Etapa 4 \u2014 Modo debug:<\/strong> Quando todos os passos anteriores n\u00e3o revelam o problema, \u00e9 hora de iniciar o <strong>fail2ban<\/strong> em primeiro plano com n\u00edvel m\u00e1ximo de verbosidade. Pare o servi\u00e7o com <strong>sudo systemctl stop fail2ban<\/strong> e execute <strong>sudo fail2ban-server -f -v -v &#8211;logtarget=STDOUT<\/strong>. Os flags <strong>-f<\/strong> (foreground) e <strong>-v -v<\/strong> (verbosidade dupla) far\u00e3o com que cada a\u00e7\u00e3o do daemon seja impressa no terminal em tempo real, incluindo a leitura de cada linha de log, a avalia\u00e7\u00e3o de cada express\u00e3o regular e a decis\u00e3o de banir ou n\u00e3o um IP. Este n\u00edvel de detalhe \u00e9 indispens\u00e1vel para diagnosticar problemas complexos, como conflitos de whitelist, timeouts de a\u00e7\u00f5es ou falhas na comunica\u00e7\u00e3o com o backend do firewall.<\/p>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Nesta se\u00e7\u00e3o obrigat\u00f3ria, executaremos uma bateria de comandos de verifica\u00e7\u00e3o que devem ser aplicados sempre que voc\u00ea modificar a configura\u00e7\u00e3o do <strong>fail2ban<\/strong>, seja adicionando uma nova jail, alterando whitelists ou ajustando par\u00e2metros de banimento. O roteiro abaixo \u00e9 exatamente o procedimento que aplicamos em cada implanta\u00e7\u00e3o conclu\u00edda na <strong>JRT Technology Solutions<\/strong> antes de considerar o ambiente como &#8220;pronto para produ\u00e7\u00e3o&#8221;.<\/p>\n<p><strong>Passo 1 \u2014 Verificar se o servi\u00e7o est\u00e1 rodando:<\/strong><\/p>\n<pre><code>sudo systemctl is-active fail2ban<\/code><\/pre>\n<pre><code class=\"output\">active<\/code><\/pre>\n<p><strong>Passo 2 \u2014 Testar a comunica\u00e7\u00e3o com o daemon via socket:<\/strong><\/p>\n<pre><code>sudo fail2ban-client ping<\/code><\/pre>\n<pre><code class=\"output\">Server replied: pong<\/code><\/pre>\n<p><strong>Passo 3 \u2014 Listar todas as jails ativas e verificar se a jail desejada est\u00e1 presente:<\/strong><\/p>\n<pre><code>sudo fail2ban-client status<\/code><\/pre>\n<pre><code class=\"output\">Status\n|- Number of jail:      2\n`- Jail list:   nginx-http-auth, sshd<\/code><\/pre>\n<p><strong>Passo 4 \u2014 Verificar os par\u00e2metros efetivos de uma jail espec\u00edfica, incluindo a whitelist:<\/strong><\/p>\n<pre><code># Verificando a whitelist da jail sshd\nsudo fail2ban-client get sshd ignoreip<\/code><\/pre>\n<pre><code class=\"output\">198.51.100.25 192.0.2.10<\/code><\/pre>\n<pre><code># Verificando maxretry, findtime, bantime\nsudo fail2ban-client get sshd maxretry\nsudo fail2ban-client get sshd findtime\nsudo fail2ban-client get sshd bantime<\/code><\/pre>\n<pre><code class=\"output\">5\n600\n3600<\/code><\/pre>\n<p><strong>Passo 5 \u2014 Simular um cen\u00e1rio real de whitelist:<\/strong> Para confirmar que a whitelist est\u00e1 funcionando, voc\u00ea pode gerar tentativas de falha a partir de um IP que esteja na lista de exclus\u00e3o e verificar nos logs do <strong>fail2ban<\/strong> que ele foi ignorado. Por exemplo, se <strong>198.51.100.25<\/strong> est\u00e1 na whitelist do SSH, tente logins com senha errada a partir desse IP propositalmente. Em seguida, verifique o log:<\/p>\n<pre><code>sudo grep \"198.51.100.25\" \/var\/log\/fail2ban.log<\/code><\/pre>\n<pre><code class=\"output\">2026-06-17 10:30:15,123 fail2ban.filter         [12345]: INFO    [sshd] Ignore 198.51.100.25 by ip<\/code><\/pre>\n<p>A mensagem <strong>Ignore &#8230; by ip<\/strong> confirma que o mecanismo de whitelist est\u00e1 funcionando corretamente. Se o IP n\u00e3o estivesse na whitelist, voc\u00ea veria mensagens de <strong>Found<\/strong> e, ap\u00f3s atingir <strong>maxretry<\/strong>, um <strong>Ban<\/strong>. Esta valida\u00e7\u00e3o \u00e9 particularmente importante ap\u00f3s altera\u00e7\u00f5es em whitelists \u2014 nunca presuma que a configura\u00e7\u00e3o est\u00e1 correta sem test\u00e1-la ativamente.<\/p>\n<h3>Erros Comuns e Como Resolver<\/h3>\n<p>Ao longo de centenas de implanta\u00e7\u00f5es e suportes prestados pela <strong>JRT Technology Solutions<\/strong>, catalogamos os erros mais frequentes que profissionais de TI encontram ao trabalhar com monitoramento, whitelist e troubleshooting do <strong>fail2ban<\/strong>. Abaixo, apresentamos quatro erros cl\u00e1ssicos com a descri\u00e7\u00e3o completa do sintoma, a causa raiz e o procedimento detalhado de solu\u00e7\u00e3o.<\/p>\n<ul>\n<li>\n        <strong>Erro 1: Jail aparece como ativa, mas n\u00e3o bloqueia IPs (zero banimentos mesmo com ataques em andamento).<\/strong><br \/>\n        <strong>Sintoma:<\/strong> Voc\u00ea executa <strong>sudo fail2ban-client status sshd<\/strong> e a jail est\u00e1 listada, o contador <strong>Total failed<\/strong> pode at\u00e9 incrementar, mas <strong>Total banned<\/strong> permanece em zero indefinidamente. O log <strong>\/var\/log\/fail2ban.log<\/strong> mostra mensagens <strong>Found<\/strong> mas nunca <strong>Ban<\/strong>.<br \/>\n        <strong>Causa:<\/strong> O par\u00e2metro <strong>maxretry<\/strong> est\u00e1 configurado com um valor muito alto em rela\u00e7\u00e3o \u00e0 taxa real de tentativas, ou o <strong>findtime<\/strong> \u00e9 muito curto, fazendo com que as falhas expirem antes de atingir o limite. Alternativamente, o IP atacante pode estar na whitelist (verifique com <strong>sudo fail2ban-client get &lt;jail&gt; ignoreip<\/strong>).<br \/>\n        <strong>Solu\u00e7\u00e3o:<\/strong> Reduza <strong>maxretry<\/strong> para 3 e aumente <strong>findtime<\/strong> para 600 no arquivo <strong>\/etc\/fail2ban\/jail.local<\/strong>. Execute <strong>sudo fail2ban-client reload<\/strong>. Se o IP estiver na whitelist, remova-o ou ajuste a whitelist conforme a pol\u00edtica de seguran\u00e7a da organiza\u00e7\u00e3o. Teste com logs simulados usando <strong>fail2ban-regex<\/strong> para garantir que o filtro est\u00e1 capturando corretamente.\n    <\/li>\n<li>\n        <strong>Erro 2: Whitelist definida no [DEFAULT] n\u00e3o est\u00e1 sendo aplicada a uma jail espec\u00edfica.<\/strong><br \/>\n        <strong>Sintoma:<\/strong> Voc\u00ea adicionou <strong>ignoreip = 10.0.0.0\/8<\/strong> na se\u00e7\u00e3o <strong>[DEFAULT]<\/strong>, mas IPs da rede 10.x.x.x continuam sendo banidos na jail <strong>sshd<\/strong>. O comando <strong>sudo fail2ban-client get sshd ignoreip<\/strong> retorna uma lista diferente da esperada.<br \/>\n        <strong>Causa:<\/strong> A se\u00e7\u00e3o <strong>[sshd]<\/strong> no arquivo <strong>jail.local<\/strong> cont\u00e9m sua pr\u00f3pria defini\u00e7\u00e3o de <strong>ignoreip<\/strong>, que <strong>substitui completamente<\/strong> o valor herdado do <strong>[DEFAULT]<\/strong>. Este \u00e9 o comportamento esperado do <strong>fail2ban<\/strong> \u2014 par\u00e2metros definidos em uma jail sobrescrevem os defaults.<br \/>\n        <strong>Solu\u00e7\u00e3o:<\/strong> Se voc\u00ea deseja que a jail herde <strong>e acrescente<\/strong> IPs \u00e0 whitelist global, voc\u00ea deve repetir os valores do <strong>[DEFAULT]<\/strong> na se\u00e7\u00e3o da jail. Exemplo: <strong>ignoreip = 10.0.0.0\/8 127.0.0.1\/8 198.51.100.25<\/strong>. N\u00e3o h\u00e1 um mecanismo nativo de &#8220;append&#8221; \u2014 a sobrescrita \u00e9 total. Ap\u00f3s corrigir, execute <strong>sudo fail2ban-client reload<\/strong> e verifique novamente com <strong>get ignoreip<\/strong>.\n    <\/li>\n<li>\n        <strong>Erro 3: &#8220;WARNING Unable to find a corresponding IP address for &lt;hostname&gt;&#8221; nos logs.<\/strong><br \/>\n        <strong>Sintoma:<\/strong> O arquivo <strong>\/var\/log\/fail2ban.log<\/strong> exibe repetidamente a mensagem de WARNING sobre incapacidade de resolver um nome de host. O IP correspondente n\u00e3o est\u00e1 sendo adicionado \u00e0 whitelist, e o <strong>fail2ban<\/strong> pode estar bloqueando o tr\u00e1fego que deveria ser ignorado.<br \/>\n        <strong>Causa:<\/strong> O par\u00e2metro <strong>ignoreip<\/strong> cont\u00e9m um nome de host (FQDN) que o servidor n\u00e3o consegue resolver via DNS. Isso pode ocorrer por falha no servidor DNS configurado em <strong>\/etc\/resolv.conf<\/strong>, por um nome digitado incorretamente ou por um dom\u00ednio que expirou.<br \/>\n        <strong>Solu\u00e7\u00e3o:<\/strong> Substitua nomes de host por endere\u00e7os IP fixos sempre que poss\u00edvel. Se o uso de FQDN for inevit\u00e1vel, teste a resolu\u00e7\u00e3o com <strong>nslookup &lt;hostname&gt;<\/strong> ou <strong>dig &lt;hostname&gt;<\/strong>. Certifique-se de que o servidor DNS est\u00e1 acess\u00edvel no momento da inicializa\u00e7\u00e3o do <strong>fail2ban<\/strong>. Uma alternativa robusta \u00e9 criar um script que resolva os FQDNs periodicamente e atualize um arquivo de whitelist externo com os IPs correspondentes, eliminando a depend\u00eancia do <strong>fail2ban<\/strong> fazer a resolu\u00e7\u00e3o em tempo real.\n    <\/li>\n<li>\n        <strong>Erro 4: &#8220;fail2ban-server -t&#8221; retorna sucesso, mas o servi\u00e7o n\u00e3o inicia.<\/strong><br \/>\n        <strong>Sintoma:<\/strong> O teste de sintaxe <strong><\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de Firewall, fail2ban e CrowdSec para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20Firewall%2C%20fail2ban%20e%20CrowdSec.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda a usar o fail2ban para monitoramento, whitelist e troubleshooting. Domine Firewall e CrowdSec do zero ao avan\u00e7ado! Clique e descubra!<\/p>\n","protected":false},"author":1,"featured_media":1146,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[50],"tags":[13,5,405,558,1968,1967],"class_list":["post-1147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-firewall","tag-fail2ban","tag-firewall-linux","tag-monitoramento-de-seguranca","tag-seguranca-de-servidores","tag-troubleshooting-fail2ban","tag-whitelist-fail2ban"],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1147"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1147\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1146"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}