Segurança · 12 min read · Oct 23, 2025

Instalando e Usando Fail2ban no Debian 12

Fail2ban monitora arquivos de log em busca de falhas de login e bane temporariamente o endereço IP da fonte propensa a falhas de acessar o host. Esta é uma defesa contra ataques de força bruta de adivinhação de senhas. É muito útil ter o fail2ban em hosts expostos à Internet.

A versão do fail2ban no Debian 12 é 1.0.2.

root@posti:~# fail2ban-client version  
1.0.2

Para ver se o fail2ban está atualmente em execução, envie ao servidor o comando ping com fail2ban-client. O servidor fail2ban responde “pong” se estiver em execução.

root@posti:/etc/fail2ban# fail2ban-client ping  
Server replied: pong  
root@posti:/etc/fail2ban#

Como funciona

O Fail2ban coleta filtros, ações e arquivos monitorados para uma prisão. Várias prisões vêm com a distribuição. Elas precisam ser habilitadas para começar a funcionar. O filtro especifica como detectar falhas de autenticação. A ação define como o banimento e o desbloqueio acontecem.

Tentativas de intrusão acionam o banimento se durante o tempo de busca pelo menos maxretry falhas de login forem detectadas do mesmo número de IP. Então o IP é banido por bantime segundos. Após o banimento ter estado em vigor por bantime segundos, o banimento é levantado e o IP pode novamente acessar o host. O Fail2ban pode lidar tanto com IPv4 quanto com IPv6.

Mais informações podem ser lidas nos arquivos no diretório /usr/share/doc/fail2ban/.

Configurando o Fail2ban

Nos sistemas Debian GNU/Linux, o fail2ban é instalado por padrão com a prisão sshd habilitada com configurações razoáveis. Isso é feito no arquivo /etc/fail2ban/jail.d/defaults-debian.conf. Essa é a única prisão funcionando por padrão. Outras prisões devem ser habilitadas pelo administrador do sistema.

Portanto, se você só deseja monitorar logins ssh e banir intrusos mal comportados, nenhuma configuração adicional é necessária.

Infelizmente, no Debian 12, o fail2ban pode não funcionar com as configurações padrão. O Debian 12 marcou o pacote rsyslog como opcional, o que significa que ele pode não estar instalado, então os logs são coletados apenas no journald [wiki.debian.org/Rsyslog].

Nos sistemas ISPConfig, o fail2ban funciona, uma vez que o instalador automático do ISPConfig instala o rsyslog e o tutorial do servidor perfeito do ISPConfig instrui a instalar o rsyslog.

Com o rsyslog, os arquivos de log aparecem no diretório /var/log/ - assim, a configuração padrão do fail2ban encontra os arquivos de log. Se o rsyslog não estiver instalado, a configuração do fail2ban deve ser modificada para que ele leia os logs do journal do systemd. Adicione à seção padrão do jail.local backend = systemd, assim:

[DEFAULT]
backend = systemd

Habilitando uma prisão

A documentação recomenda colocar todas as suas próprias modificações em arquivos .local. Isso evita problemas quando os arquivos fornecidos pela distribuição são atualizados ou modificados pelo mantenedor [Leia o arquivo /usr/share/doc/fail2ban/README.Debian.gz].

Como exemplo, habilitar a prisão pure-ftpd é feito adicionando ao arquivo /etc/fail2ban/jail.local (crie o arquivo se ele não existir) as linhas:

[pure-ftpd]
enabled = true

O nome da prisão entre colchetes inicia a seção para as configurações daquela prisão.

Quando terminar as modificações, force a leitura dos arquivos de configuração com o comando:

systemctl reload fail2ban

A prisão deve agora estar em execução, o que pode ser verificado com fail2ban-client:

root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
|  |- Currently failed:  0
|  |- Total failed:  106
|  `- File list:  /var/log/syslog
`- Actions
   |- Currently banned:  0
   |- Total banned:  4
   `- Banned IP list:  
root@posti:/etc/fail2ban# 

Como o jail.local tem apenas a configuração “enabled” para essa prisão, todas as outras configurações são as configurações padrão da distribuição. Normalmente, elas têm bons valores, então mais configurações são desnecessárias. Se necessário, a seção jail.local para essa prisão pode conter configurações que substituem o que foi definido nos arquivos .conf.

Este exemplo altera findtime, maxretry e bantime para a prisão pure-ftpd:

[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1d

O fail2ban-client mostra os tempos em segundos, mas os tempos podem ser inseridos nos arquivos de configuração em um formato mais fácil, por exemplo, 10h em vez de 36000 segundos. O man jail.conf no capítulo “FORMATO DE ABREVIATURA DE TEMPO” explica os formatos de entrada de tempo amigáveis ao usuário.

O fail2ban-client tem a opção de converter do formato de tempo amigável ao usuário para segundos.

# fail2ban-client --str2sec 1d3h7m  
97620

Acompanhe os logs

Para determinar quais prisões devem ser ativadas, siga os logs criados pelos serviços em execução no host. Uma ferramenta que cria resumos de logs, como logwatch ou pflogsumm, é útil. Ler logs brutos é demorado e tedioso.

Verifique se há uma prisão disponível para um serviço em execução no host, talvez lendo jail.conf.

Uma vez que os logs mostrem algo interessante ou preocupante, é hora de examinar. Por exemplo, o pflogsumm enviou um resumo por e-mail com linhas como esta:

136   unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136   hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123   unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123   hostname mail.whatami.co does not resolve to address 193.32.162.23

Isso mostra que o IP 91.224.92.40 falhou 136 vezes ao tentar logar no e-mail, e outro caso semelhante. O fail2ban deveria ter impedido tantas tentativas. Para ver por que isso não aconteceu, examine o log do fail2ban.

root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter         [996]: INFO    [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#

Esse IP tenta se conectar em intervalos de cerca de 10 minutos, e a prisão fail2ban postfix-sasl o detecta.

É uma boa ideia descobrir se esse IP pode pertencer a um usuário legítimo do host, que apenas tem uma senha antiga em um smartphone ou em algum outro dispositivo tentando se conectar em intervalos regulares. Eu uso geoiplookup, que mostra de qual país o IP é. Meus usuários são do meu país, então usuários estrangeiros tendem a ser maus atores. O geoiplookup vem dos pacotes Debian geoip-database e geoip-bin.

$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lituânia

Para descobrir por que o IP não foi banido, examine o findtime daquela prisão:

root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#

Recentemente, vi esses ataques lentos, o perpetrador sabe que o findtime é de 10 minutos, então tenta evitar ser banido tentando logins em intervalos mais longos. Isso funcionou neste caso. Para que logins falhados causem banimentos, aumente o findtime para a prisão, por exemplo, para 10 horas. Adicione ao arquivo jail.local na seção [postfix-sasl]:

findtime = 10h

Então, após systemctl reload fail2ban, a prisão tem um findtime maior:

root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#

Outra maneira que os intrusos tentam invadir é sendo persistentes. Mesmo que o intruso seja banido, basta esperar até que o banimento termine e continuar adivinhando a senha. O bantime poderia ser prolongado, mas isso causa problemas para usuários legítimos, que podem digitar a senha incorretamente e então não conseguem acessar sua conta até que o bantime termine. Há uma prisão para reincidentes chamada recidive. Ela funciona procurando por banimentos repetidos para um IP no log do fail2ban e, em seguida, banindo por um longo tempo, por exemplo, uma semana.

A seguinte listagem é de um relatório do logwatch:

--------------------- pam_unix Begin ------------------------   

 sshd:  

    Falhas de Autenticação:  

       unknown (212.70.149.150): 59 Vez(es)

Pesquisar por esse IP no arquivo de log mostra:

2024-02-21 03:42:39,121 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions        [895]: NOTICE  [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions        [895]: NOTICE  [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter         [895]: INFO    [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04

O fail2ban funciona como pretendido, encontrando os logins incorretos e emitindo um banimento por 10 minutos. Durante esse banimento, o infrator é impedido de acessar este host, mas continua após o banimento ser levantado. Este parece ser o caso de uma tentativa séria de invasão. A solução é habilitar a prisão recidive com um maxretry baixo e um bantime longo.

Gosto de usar um banimento inicial curto, digamos 10 minutos. Se um usuário real foi banido, é só esperar esse tempo, esperando que use o tempo para descobrir qual é a senha correta e então tentar novamente. Aqueles que são banidos novamente no mesmo dia, são banidos por uma semana. Os valores padrão da prisão recidive podem ser encontrados no arquivo jail.conf, há um bantime de 1 semana e um findtime de 1 dia, que me parecem OK. Mas eu defino maxretry para 2, os infratores são banidos mais rápido. Adicionei ao arquivo jail.local:

[recidive]
enabled = true
maxretry = 2

Banimentos mais longos que 1 semana não valem a pena, na minha opinião. Eventualmente, o antigo endereço IP é banido ou colocado em lista negra em todo lugar, então o infrator obtém um novo IP. O antigo IP é dado a algum novo usuário inocente da Internet, que não deveria ser punido pelas coisas ruins que o antigo proprietário daquele IP é culpado.

Solução de Problemas

Após a inicialização do sistema operacional ou reinício do fail2ban, o estado é restaurado, então os banimentos continuam até que o bantime expire. Assim, testar e solucionar problemas pode envolver reinicializações.

Para testar a configuração, há uma opção de teste:

fail2ban-server --test

Para descobrir se um IP está banido, versões recentes do fail2ban podem fazer:

# fail2ban-client banned 43.131.9.186  
[['recidive']]

O comando mostra a lista de prisões onde o IP dado está atualmente banido.

Versões mais antigas do fail2ban não têm esse comando. Testar cada prisão uma por uma pode ser feito assim:

# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232  
43.163.219.232

Se a saída mostrar o IP, então ele estava na lista de números IP banidos. O comando tr está lá para quebrar a lista de números IP banidos (é uma linha longa) em um IP por linha.

Para ver o que tem acontecido com um dado IP, procure-o no fail2ban.log:

root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80  

2024-03-06 09:00:40,295 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE  [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE  [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter  [3574846]: INFO    [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE  [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter  [3574846]: INFO    [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE  [sshd] Unban

A saída detalhada da configuração do fail2ban mostra as configurações para exame:

# fail2ban-client -vvv -d

Colocando IPs próprios na lista branca

Talvez seus próprios hosts sejam banidos ou você queira ter certeza de que alguns hosts estrangeiros nunca sejam banidos, mesmo que se comportem mal. Esses números IP podem ser colocados na lista branca. Por padrão, nada é colocado na lista branca, você pode verificar isso com:

root@posti:~# fail2ban-client get sshd ignoreip  
No IP address/network is ignored  
root@posti:~

A configuração ignoreip pode ser definida em cada seção de prisões, mas essa configuração deve afetar todas as prisões, então é melhor defini-la na seção DEFAULT. Pode ser melhor definir o ignore para a sub-rede interna, para que todos os seus próprios hosts evitem banimentos. Isso é do início do jail.local:

[DEFAULT]
ignoreip = 92.237.123.96/27

A seção padrão pode ter outras configurações que afetam todas as prisões. Por exemplo, findtime = 10h poderia ser adicionado lá.

Banindo manualmente

Para testar o que acontece ao banir, defina o banimento manualmente. Teste primeiro com uma prisão com bantime curto, para que você consiga voltar eventualmente se banir você mesmo por engano. Por exemplo:

# fail2ban-client set sshd banip 8.8.4.4

Se algum IP se comportar mal, mas você não conseguir fazer o fail2ban detectá-lo e emitir banimentos, definir um banimento manual na prisão recidive se livra desse IP por uma semana.

# fail2ban-client set recidive banip 8.8.4.4

Banir uma sub-rede funciona usando a notação CIDR:

fail2ban-client set recidive banip 5.188.87.0/24

Desbanindo manualmente

Remover um banimento é possível, mas considere que se o comportamento ruim continuar, o IP será banido novamente. Portanto, você deve descobrir o que está acontecendo (lendo os logs, por exemplo) e corrigir o comportamento ruim.

# fail2ban-client set recidive unbanip 8.8.4.4

O IP pode estar banido em várias prisões. Para desbanir um IP em todas as prisões, use:

# fail2ban-client unban 8.8.4.4

No entanto, raramente preciso fazer isso. Tenho um bantime de 10 minutos, exceto a prisão recidive que tem 1 semana, então só desbano o IP da prisão recidive, as outras prisões já expiraram. Se você não usar a prisão recidive, o IP pode estar banido em várias prisões ao mesmo tempo, então isso é útil.

Para desbanir todos os endereços IP de todas as prisões, faça:

fail2ban-client unban --all

Conclusão

O Fail2ban torna mais difícil adivinhar senhas, mas não impede completamente que crackers tentem acessar o host. Para SSH, forçar o uso de chaves SSH oferece mais proteção, impedindo o login com uma senha. Para outros serviços, a autenticação multifatorial impede o login se apenas a senha for conhecida.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.