203 29/03/2026 07/04/2026 4 min

Se il tuo server riceve continuamente richieste a percorsi come /wp-admin, /phpmyadmin, /.env o /xmlrpc.php
— anche se non usi WordPress — significa che bot e scanner automatici scandagliano il tuo sito alla ricerca
di vulnerabilità. Con fail2ban puoi identificare questi IP e bannarli automaticamente.

 


PREREQUISITI
------------
- Server Linux con nginx
- fail2ban installato (apt install fail2ban)
- Accesso root o sudo
- Log di accesso nginx attivi


PASSO 1 — Creare il file filtro
--------------------------------
Il filtro definisce il pattern delle richieste sospette che fail2ban deve riconoscere nei log.

Apri l'editor:

    nano /etc/fail2ban/filter.d/nginx-sensitive-files.conf

Incolla questo contenuto:

[Definition]
    failregex = ^<HOST> .+ "(GET|POST|HEAD) /(wp-admin|wp-content|wp-includes|wp-login\.php|xmlrpc\.php|phpmyadmin|\.env|\.git)[^"]*" \d+ \d+

    ignoreregex =

    datepattern = \[%%d/%%b/%%Y:%%H:%%M:%%S %%z\]

Spiegazione:
- ^<HOST>         → placeholder fail2ban per l'indirizzo IP del client
- .+              → copre la parte centrale del log (utente, data, ecc.)
- (GET|POST|HEAD) → metodi HTTP da intercettare
- /(wp-admin|...)  → elenco dei percorsi sensibili da bloccare
- [^"]*           → qualsiasi carattere dopo il percorso fino alla fine della stringa URL
- \d+ \d+         → codice di risposta HTTP e dimensione in byte
- datepattern     → formato data usato da nginx nei log (es: [28/Mar/2026:10:00:00 +0000])

Salva con CTRL+O → Invio → CTRL+X.


PASSO 2 — Testare il filtro sui log esistenti
----------------------------------------------
Prima di attivare la jail, verifica che il filtro riconosca correttamente le richieste nei tuoi log:

    fail2ban-regex /var/www/tuosito/data/logs/access.log /etc/fail2ban/filter.d/nginx-sensitive-files.conf

Output atteso (esempio):

    Failregex: 1466 total
    |   1) [1466] ^<HOST> .+ "(GET|POST|HEAD) /(wp-admin|...)...

    Lines: 9165 lines, 0 ignored, 1466 matched, 7699 missed

Se il numero di match è > 0, il filtro funziona. Se è 0, controlla che il percorso del log sia corretto
e che il formato della data corrisponda a quello usato da nginx.


PASSO 3 — Configurare la jail
------------------------------
Apri o crea il file jail.local:

    nano /etc/fail2ban/jail.local

Aggiungi in fondo:

 

  [nginx-sensitive-files]
    enabled  = true
    port     = http,https
    filter   = nginx-sensitive-files
    logpath  = /var/www/tuosito/data/logs/access.log
    maxretry = 3
    findtime = 60
    bantime  = 86400

Spiegazione:
- enabled     → attiva la jail
- port        → porte monitorate (80 e 443)
- filter      → nome del file filtro creato nel passo 1 (senza .conf)
- logpath     → percorso del log nginx da monitorare
- maxretry    → numero di tentativi prima del ban (qui: 3)
- findtime    → finestra di tempo in secondi entro cui contare i tentativi (qui: 60 secondi)
- bantime     → durata del ban in secondi (qui: 86400 = 24 ore)

Salva con CTRL+O → Invio → CTRL+X.


PASSO 4 — Ricaricare fail2ban
------------------------------
Applica la nuova configurazione:

    fail2ban-client reload


PASSO 5 — Verificare che la jail sia attiva
--------------------------------------------
Controlla l'elenco delle jail attive:

    fail2ban-client status

Output atteso:

    Jail list: nginx-404, nginx-sensitive-files, sshd, ...

Poi controlla lo stato specifico della jail:

    fail2ban-client status nginx-sensitive-files

Output atteso (a jail appena avviata):

    Status for the jail: nginx-sensitive-files
    |- Filter
    |  |- Currently failed: 0
    |  |- Total failed:     0
    |  `- File list: /var/www/tuosito/data/logs/access.log
    `- Actions
       |- Currently banned: 0
       |- Total banned:     0
       `- Banned IP list:

I contatori partiranno da 0 perché fail2ban monitora i log in tempo reale da quando è stato avviato,
non processa lo storico. Man mano che arrivano nuove richieste sospette, gli IP verranno bannati
automaticamente.


COMANDI UTILI
-------------
Vedere gli IP attualmente bannati:

    fail2ban-client status nginx-sensitive-files

Sbannare manualmente un IP:

    fail2ban-client set nginx-sensitive-files unbanip 1.2.3.4

Testare il filtro con output completo dei miss:

    fail2ban-regex access.log /etc/fail2ban/filter.d/nginx-sensitive-files.conf --print-all-missed

Vedere il log di fail2ban in tempo reale:

    tail -f /var/log/fail2ban.log


Con questa configurazione, il tuo server blocca automaticamente per 24 ore qualsiasi IP che in 60 secondi
invia 3 o più richieste a percorsi sensibili. È una misura semplice ma efficace contro scanner automatici,
bot WordPress e tentativi di ricognizione.

Puoi estendere il filtro aggiungendo altri percorsi nell'elenco del failregex, oppure abbassare bantime
a valori più alti per chi ti prende di mira ripetutamente.