Nel panorama della sicurezza informatica quotidiana esistono strumenti poco appariscenti ma estremamente efficaci. Fail2ban è uno di questi. Non è un firewall completo, non è un antivirus, non è una piattaforma SIEM. Eppure, su migliaia di server Linux, svolge un compito essenziale: bloccare automaticamente gli indirizzi IP che mostrano comportamenti sospetti o ostili, soprattutto nei tentativi di accesso ripetuti e falliti.

In termini semplici, Fail2ban legge i file di log del sistema e dei servizi esposti in rete — come SSH, Apache, Nginx, Postfix o FTP — e rileva schemi di attacco ricorrenti. Quando trova, ad esempio, troppi login errati in pochi minuti, applica una contromisura automatica: banna temporaneamente o definitivamente l’IP sorgente.

A cosa serve davvero

Il caso più noto è la protezione da attacchi brute force su SSH. Un server con porta 22 esposta su Internet riceve spesso, anche poche ore dopo l’installazione, tentativi automatici di autenticazione con username comuni come root, admin, test o ubuntu. Fail2ban interviene prima che quei tentativi diventino un problema operativo o di sicurezza.

La sua utilità, però, va oltre SSH. Può essere usato anche per:

Come funziona

Il principio è lineare:

  1. un servizio scrive eventi nei log

  2. Fail2ban monitora quei log

  3. confronta le righe con filtri basati su espressioni regolari

  4. se il numero di errori supera una soglia, esegue un’azione

  5. l’azione in genere consiste nel blocco IP tramite iptables, nftables o altri backend

È un approccio reattivo ma rapido. Non “prevede” l’attacco: lo intercetta appena emerge un comportamento ostile ripetuto.

Un esempio pratico su SSH

Scenario tipico: su un VPS pubblico arrivano 8 tentativi di login SSH errati in 10 minuti dallo stesso IP. Con una configurazione adeguata, Fail2ban può fare questo:

Risultato: al sesto tentativo errato, l’IP viene escluso automaticamente.

Esempio di configurazione essenziale:

 
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime = 3600
 

Significato

Perché è ancora così usato

Fail2ban continua a essere diffuso perché unisce tre qualità rare:

Su molti server piccoli e medi, rappresenta una difesa immediata contro attacchi automatici banali ma continui. Non sostituisce una strategia di sicurezza completa, ma riduce in modo concreto l’esposizione ai tentativi più comuni.

I suoi punti forti

Il primo vantaggio è l’automazione. Un amministratore non deve controllare i log a mano ogni ora. Il secondo è la flessibilità: si possono creare jail personalizzate per diversi servizi. Il terzo è la compatibilità con l’ecosistema Linux.

Esempio di verifica rapida dello stato:

 
sudo fail2ban-client status
 

Per vedere il dettaglio della jail SSH:

 
sudo fail2ban-client status sshd
 

Questi comandi mostrano IP bannati, numero di jail attive e stato del motore.

I limiti da conoscere

Fail2ban non è una barriera assoluta. Ha limiti chiari:

Se un servizio registra male gli eventi, oppure li salva in percorsi errati, Fail2ban vede poco o nulla. Inoltre, un attaccante distribuito può provare pochi tentativi da molti IP differenti, aggirando di fatto la logica di soglia.

L’errore più comune

Molti lo installano e pensano di aver “messo in sicurezza il server”. Non è così. Fail2ban è utile, ma va inserito in una difesa più ampia:

In altre parole, Fail2ban è un buon guardiano, ma non può essere l’unico.

Un caso concreto in produzione

Su un server web con pannello amministrativo esposto, si possono vedere centinaia di tentativi di login automatici al giorno. Senza protezione, quei tentativi generano carico, log inutili e rischio operativo. Con Fail2ban si può analizzare il log applicativo e bloccare IP che falliscono troppe autenticazioni.

Esempio concettuale:

Questo riduce attacchi ripetitivi e rumore, soprattutto su infrastrutture piccole.

 
 
# /etc/fail2ban/jail.local

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = iptables-multiport
destemail = [email protected]
sender = [email protected]
mta = sendmail
action = %(action_mwl)s

[sshd]
enabled = true
port = 22
logpath = %(sshd_log)s

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log

[nginx-badbots]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
 
 
# installazione
sudo apt update
sudo apt install fail2ban -y

# copia config base
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# modifica config
sudo nano /etc/fail2ban/jail.local

# avvio e avvio automatico
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban

# stato servizio
sudo systemctl status fail2ban

# stato generale fail2ban
sudo fail2ban-client status

# stato jail ssh
sudo fail2ban-client status sshd

# elenco IP bannati in una jail
sudo fail2ban-client status sshd

# bannare manualmente un IP
sudo fail2ban-client set sshd banip 192.168.1.100

# sbloccare manualmente un IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

# test configurazione regex/filtro
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

# vedere log fail2ban
sudo journalctl -u fail2ban
# oppure
sudo tail -f /var/log/fail2ban.log
 

Configurazione minima solo SSH:

 
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd