Guide

Fail2ban su Linux: guida completa per proteggere il server dagli attacchi brute-force

Dario Fadda Maggio 29, 2026

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, considerate 24h o addirittura 1w. Il valore -1 imposta un ban permanente.
  • findtime: finestra temporale in cui vengono contati i fallimenti. Con 10m e maxretry = 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

Una risposta a “Fail2ban su Linux: guida completa per proteggere il server dagli attacchi brute-force”

  1. Luca Ruggeri ha detto:

    @blog quella sensazione di chiudersi fuori e dover rientrare dal kvm dell’host

    Eeeeeeehm…

💬 Unisciti alla discussione!


Questo è un blog del Fediverso: puoi trovare quindi questo articolo ovunque con @blog@spcnet.it e ogni commento/risposta apparirà qui sotto.

Se vuoi commentare su Fail2ban su Linux: guida completa per proteggere il server dagli attacchi brute-force, utilizza la discussione sul Forum.
Condividi la tua esperienza, confrontati con altri professionisti e approfondisci i dettagli tecnici nel nostro 👉 forum community