Ogni server Linux esposto su internet viene continuamente bersagliato: tentativi di brute-force su SSH, flood sulle pagine di login di WordPress, bot che scansionano le porte. Se guardate adesso i vostri log di autenticazione, troverete quasi certamente centinaia di tentativi falliti di cui non sapevate nulla.
Fail2ban è la soluzione pratica a questo problema. Monitora i file di log in tempo reale, rileva le anomalie nei pattern di accesso e bannna automaticamente gli IP che superano la soglia configurata, agendo direttamente sul firewall. È leggero, flessibile e presente in produzione su migliaia di server Linux da oltre un decennio. Questa guida copre installazione, configurazione corretta e tuning reale per ottenere vera protezione.
Come funziona Fail2ban
Fail2ban legge i file di log (o il journal di systemd, a seconda del backend configurato) in tempo reale. Quando rileva un numero configurabile di fallimenti dallo stesso IP all’interno di una finestra temporale definita, esegue un’azione di ban. Per default, questa azione aggiunge una regola a iptables (o nftables, o firewalld) che scarta il traffico da quell’IP per un periodo stabilito.
I tre concetti fondamentali da comprendere sono:
- Filter: insieme di espressioni regolari che identificano le righe di failure nei log.
- Jail: combina un filter con il percorso del file di log, le soglie e l’azione di ban.
- Action: ciò che avviene al superamento della soglia — solitamente un ban sul firewall, ma può includere anche notifiche email.
Fail2ban include filtri e jail predefiniti per decine di servizi: SSH, Apache, Nginx, Postfix, Dovecot e molti altri. Nella maggior parte dei casi è sufficiente abilitare le jail di interesse e regolare alcuni parametri numerici.
Installazione
Fail2ban è disponibile nei repository ufficiali di tutte le distribuzioni principali.
Debian/Ubuntu:
sudo apt update
sudo apt install fail2ban
Fedora / RHEL 9+ / Rocky / AlmaLinux:
sudo dnf install fail2ban
Arch Linux:
sudo pacman -S fail2ban
Abilitare e avviare il servizio:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
Il metodo corretto per configurare Fail2ban
Non modificate mai direttamente /etc/fail2ban/jail.conf: questo file viene sovrascritto ad ogni aggiornamento del pacchetto e le vostre modifiche andranno perdute. L’approccio corretto è creare un file nella directory jail.d/:
sudo nano /etc/fail2ban/jail.d/custom.conf
In alternativa, copiate il file di configurazione predefinito e modificate la copia:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Le impostazioni in jail.d/ e in jail.local sovrascrivono i valori di default in jail.conf. Usate sempre uno di questi due metodi.
La sezione [DEFAULT]: parametri globali
Nella configurazione troverete il blocco [DEFAULT] che si applica a tutte le jail salvo override specifici. I parametri chiave da capire e regolare:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
- bantime: durata del ban. Il default di 10 minuti è troppo breve. Usate almeno
1h; per server ad alta esposizione, considerate24ho addirittura1w. Il valore-1imposta un ban permanente. - findtime: finestra temporale in cui vengono contati i fallimenti. Con
10memaxretry = 5, cinque fallimenti in dieci minuti scatenano il ban. - maxretry: numero di tentativi falliti prima del ban. 5 è ragionevole per SSH; potete abbassarlo a 3 per maggiore aggressività.
- ignoreip: IP che non verranno mai bannati. Aggiungete sempre il vostro IP qui prima di attivare qualsiasi jail. Essere esclusi dal proprio server è un’esperienza da evitare.
Se il server ha un indirizzo IPv6 pubblico, includetelo nell’elenco ignoreip:
ignoreip = 127.0.0.1/8 ::1 IL_VOSTRO_IP_QUI
Configurazione della jail SSH
La jail SSH è la più importante per la maggior parte dei server. In jail.local oppure in /etc/fail2ban/jail.d/sshd.conf:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 1h
Se avete spostato SSH su una porta non standard (pratica consigliata), aggiornate la riga port:
port = 2222
Su sistemi basati su systemd, la variabile %(sshd_log)s punta automaticamente al journal. Ricaricate dopo ogni modifica alla configurazione:
sudo fail2ban-client reload
Jail per Apache e Nginx
I web server attirano il loro tipico tipo di abuso: scanner di URL inesistenti, bot che tempestano la pagina di login, client con comportamenti anomali.
Apache:
[apache-auth]
enabled = true
logpath = %(apache_error_log)s
maxretry = 5
[apache-badbots]
enabled = true
logpath = %(apache_access_log)s
maxretry = 2
Nginx:
[nginx-http-auth]
enabled = true
logpath = %(nginx_error_log)s
maxretry = 3
[nginx-limit-req]
enabled = true
logpath = %(nginx_error_log)s
maxretry = 10
La jail nginx-limit-req intercetta i client che colpiscono i limiti di rate impostati con limit_req nella configurazione di Nginx, ottima per chi gestisce proxy o API.
Verifica dello stato e dei ban attivi
Il comando fail2ban-client è il vostro strumento principale per il monitoraggio operativo.
Lista di tutte le jail attive:
sudo fail2ban-client status
Dettagli di una jail specifica, compresi gli IP bannati:
sudo fail2ban-client status sshd
Output tipico su un server esposto:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 143
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 5
|- Total banned: 38
`- Banned IP list: 203.0.113.7 198.51.100.22 ...
143 tentativi falliti totali non è insolito: su un server esposto su internet, questo accade nel giro di poche ore. È esattamente per questo che Fail2ban è indispensabile.
Ban e unban manuale
Per bannare un IP noto come malevolo:
sudo fail2ban-client set sshd banip 203.0.113.99
Per rimuovere un ban (utile se vi siete accidentalmente auto-bannati):
sudo fail2ban-client set sshd unbanip 203.0.113.99
La jail recidive: ban incrementali per attaccanti persistenti
La jail recidive è una delle funzionalità più utili e meno utilizzate di Fail2ban. Monitora il log di Fail2ban stesso e banna gli IP che continuano a presentarsi dopo la scadenza del ban precedente.
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
action = %(action_mwl)s
bantime = 1w
findtime = 1d
maxretry = 5
Con questa configurazione, un IP che viene bannato 5 volte nell’arco di un giorno guadagna un ban di una settimana. È il meccanismo più vicino a una blacklist persistente di attaccanti che si possa ottenere senza integrare feed di threat intelligence esterni.
Nota: Su sistemi che non scrivono su /var/log/fail2ban.log (setup journal-only), verificate che Fail2ban sia configurato per scrivere un log tradizionale, oppure adattate il backend.
Test dei filtri prima di attivare una jail
Prima di mettere in produzione una jail personalizzata, verificate che il filtro intercetti correttamente le righe di log con fail2ban-regex:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
L’output mostra quante righe vengono matchate, quante ignorate e le statistiche di performance. Se il numero di match è zero con log pieni di tentativi, il filtro non funziona correttamente e non proteggerà il server.
Conclusione
Fail2ban è uno di quegli strumenti che, una volta configurato correttamente, gira silenziosamente in background proteggendo il vostro server 24/7 senza richiedere attenzione continua. La chiave è andare oltre i default: aumentare i bantime, aggiungere il proprio IP alla whitelist, abilitare la jail recidive per gli attaccanti persistenti e testare i filtri prima del deploy in produzione.
Per server ad alta visibilità, Fail2ban può essere integrato con feed di IP reputation esterni (come AbuseIPDB) tramite action personalizzate, aggiungendo un ulteriore layer di difesa proattiva.
Fonte originale: LinuxBlog.io — Fail2ban on Linux: Protect Your Server from Brute-Force Attacks
@blog quella sensazione di chiudersi fuori e dover rientrare dal kvm dell’host
Eeeeeeehm…