Quan tens un servidor web que no fa servir WordPress, pot semblar que els atacs no van amb tu. La realitat és una altra: cada dia milers de bots escanegen Internet buscant vulnerabilitats. Si tens un Apache o un Nginx exposat, Fail2Ban pot ser el teu millor aliat. En aquesta guia t’explico com configurar-lo pas a pas, pensant especialment en webs que no tenen WordPress però reben intents constants d’accés a wp-login.php o xmlrpc.php.
Introducció a Fail2Ban
Què és i per a què serveix
Fail2Ban és una eina que vigila els registres (logs) del servidor (com auth.log o access.log) i bloqueja automàticament les IP amb comportaments sospitosos: intents d’accés repetits, peticions a fitxers inexistents o patrons típics d’atacs automatitzats.
En poques paraules: és un guardià digital que observa qui truca a la teva porta i tanca el pany als qui volen fer mal.
Per què és útil encara que no tinguis WordPress
Encara que no facis servir WordPress, molts bots el buscaran igualment. Aquestes peticions a /wp-login.php o /xmlrpc.php no només embruten els logs: també gasten CPU i amplada de banda. Amb Fail2Ban les pots bloquejar automàticament abans que facin més nosa.
Com funciona
Fail2Ban es basa en tres conceptes que convé tenir clars:
- Filtre: defineix què és sospitós, amb expressions regulars (
failregex) que busquen patrons als logs. - Jail (presó): aplica un filtre a un log concret i, quan una IP compleix les condicions (per exemple, 3 intents fallits), hi actua.
- Acció: què es fa amb la IP enxampada, normalment bloquejar-la al tallafoc.
Pots tenir diverses jails, cadascuna amb la seva missió: una per a SSH, una altra per a Apache, una per a FTP…
Instal·lació i preparació
Instal·lar Fail2Ban a Debian/Ubuntu
sudo apt update && sudo apt install fail2ban
A Fedora, Rocky o Alma seria sudo dnf install fail2ban.
Comprovar el servei i els fitxers principals
sudo systemctl status fail2ban
Els fitxers que has de conèixer:
/etc/fail2ban/jail.conf→ configuració base. No la modifiquis (una actualització la pot sobreescriure)./etc/fail2ban/jail.local→ la teva configuració (té prioritat sobrejail.conf)./etc/fail2ban/jail.d/→ fitxers.localper jail, una bona manera d’organitzar-ho./etc/fail2ban/filter.d/→ els filtres (patrons de detecció)./var/log/fail2ban.log→ el registre d’activitat del propi Fail2Ban.
Configuració bàsica: jail.local
Paràmetres generals
Crea el fitxer:
sudo nano /etc/fail2ban/jail.local
I afegeix-hi la secció [DEFAULT]:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 8h
findtime = 5m
maxretry = 3
Això vol dir:
ignoreip: adreces que mai es bloquegen. Posa-hi la teva IP fixa separada per espais; és la millor manera d’evitar deixar-te tu mateix fora. Si no en tens de fixa, evita baixar massa elmaxretryde la jail de SSH.bantime: durada del bloqueig (aquí, 8 hores). Pots posar-1per a un bloqueig permanent.findtime: finestra de temps en què es compten els intents.maxretry: intents permesos dins defindtimeabans de bloquejar.
> Sobre el backend i els logs: a les distribucions actuals (Debian 12/13, Ubuntu recents) el sistema sovint no escriu /var/log/auth.log i ho envia tot al journal de systemd. Si és el teu cas, afegeix backend = systemd a [DEFAULT] i no cal que indiquis logpath a la jail de SSH. Si tens rsyslog instal·lat i el fitxer auth.log existeix, pots deixar el backend automàtic.
Jail per a SSH
Afegeix dins de jail.local:
[sshd]
enabled = true
port = ssh
maxretry = 3
Això protegeix l’accés remot al servidor contra atacs de força bruta. Si vols enfortir més l’SSH (canviar el port, claus en lloc de contrasenya…), mira la guia d’instal·lació i configuració d’SSH i la del fitxer sshd_config.
> Un apunt sobre el bloqueig (banaction): per defecte, Fail2Ban bloqueja amb iptables-multiport (o nftables-multiport segons el sistema), i això funciona sense configurar res més. Als exemples d’aquesta guia faig servir banaction = ufw perquè el servidor on la vaig escriure fa servir UFW com a tallafoc. Si tu no fas servir UFW, treu aquesta línia i deixa el bloqueig per defecte.
Protegir Apache de bots i escàners
Crear la jail «fake-wordpress»
Aquesta jail detecta bots que busquen WordPress encara que no el facis servir.
1. El filtre, a /etc/fail2ban/filter.d/fake-wordpress.conf:
[Definition]
failregex = ^<HOST> -.*"(GET|POST)\s+/(wp-login\.php|xmlrpc\.php|wp-admin|wp-includes|wp-json|wp-cron\.php|wlwmanifest\.xml)
ignoreregex =
Aquest patró casa amb les peticions a les rutes típiques de WordPress. L’he comprovat amb fail2ban-regex: enxampa les peticions a wp-login.php, xmlrpc.php o wp-json, i deixa passar el trànsit legítim (per exemple, un GET /index.html). Pots provar tu mateix un filtre contra un log abans de posar-lo en marxa:
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/fake-wordpress.conf
2. La jail, a /etc/fail2ban/jail.d/fake-wordpress.local:
[fake-wordpress]
enabled = true
filter = fake-wordpress
logpath = /var/log/apache2/*access.log
port = http,https
banaction = ufw
maxretry = 1
findtime = 1d
bantime = 1w
Amb maxretry = 1, qualsevol IP que demani una d’aquestes rutes queda bloquejada al primer intent, durant 7 dies. Ajusta logpath al nom real dels teus logs (a Nginx solen ser /var/log/nginx/*access.log).
> Compte a no bloquejar-te tu mateix: si fas proves demanant aquestes rutes des de la teva pròpia IP, també et bloquejaràs. Afegeix la teva IP a ignoreip o desbloqueja-te-la després (ho veurem al final). Ho dic per experiència pròpia.
Càstig als reincidents amb la jail «recidive»
Què fa
La jail recidive analitza el log del propi Fail2Ban (/var/log/fail2ban.log) i busca IP que ja han estat bloquejades diverses vegades per qualsevol altra jail. Si una IP insisteix, s’aplica un bloqueig llarg (un mes o més). Fail2Ban ja porta aquesta jail definida de sèrie; només cal activar-la i ajustar-la.
A /etc/fail2ban/jail.d/recidive.local:
[recidive]
enabled = true
banaction = ufw
maxretry = 5
findtime = 1d
bantime = 30d
És a dir: si una IP ha estat bloquejada 5 cops en 24 hores, queda fora durant 30 dies.
Reiniciar i comprovar l’estat
Cada vegada que canvies la configuració, recarrega el servei:
sudo systemctl restart fail2ban
sudo fail2ban-client status
Per veure les IP bloquejades de cada jail:
sudo fail2ban-client status sshd
sudo fail2ban-client status fake-wordpress
sudo fail2ban-client status recidive
Comprovar que funciona
Des d’una IP externa (no la teva!), pots simular una petició maliciosa:
curl -I http://elteuservidor/wp-login.php
En pocs segons, aquella IP hauria de quedar bloquejada. Comprova-ho amb fail2ban-client status fake-wordpress.
Bones pràctiques i manteniment
- Revisa els logs de tant en tant:
sudo tail -n 100 /var/log/fail2ban.log. - Mantén el sistema al dia:
sudo apt update && sudo apt upgrade. - Valida la configuració abans de reiniciar amb
sudo fail2ban-client -d(mostra la configuració interpretada i avisa d’errors). - Si vols rebre avisos per correu, canvia l’acció per defecte a
action = %(action_mwl)s(requereix un MTA configurat al servidor).
Errors habituals
| Problema | Causa probable | Solució |
|---|---|---|
| La jail no es carrega | Error al nom o al format del fitxer | Revisa-ho amb sudo fail2ban-client -d |
| No bloqueja cap IP | Ruta del log incorrecta | Confirma el logpath i prova el filtre amb fail2ban-regex |
| El servei no arrenca | Error de sintaxi al fitxer .conf/.local | Comprova espais i seccions [...] |
| Et quedes bloquejat tu | La teva IP no és a ignoreip | Afegeix-la o desbloqueja-te-la (vegeu avall) |
Conclusions
Si el teu servidor no fa servir WordPress, Fail2Ban és una manera senzilla i potent de mantenir-lo segur davant bots i escàners. Amb la combinació de les tres peces —la jail de sshd, la fake-wordpress i la recidive— tens una protecció en diverses capes:
- Primera línia: bloqueig immediat (SSH i Apache/Nginx).
- Segona línia: càstig als reincidents.
- Tercera línia: tranquil·litat per a tu.
I tot automàtic, sense haver de vigilar els logs tot el dia.
Preguntes freqüents
Fail2Ban alenteix el servidor? No, és molt lleuger. Només llegeix els logs i executa comandes del tallafoc quan detecta activitat sospitosa.
Puc afegir més rutes al filtre? Sí. Edita fake-wordpress.conf i afegeix camins al failregex (per exemple admin\.php o config\.php). Prova sempre els canvis amb fail2ban-regex abans d’aplicar-los.
Què faig si bloquejo un client legítim (o a mi mateix)? El desbloqueges indicant la jail i la IP:
sudo fail2ban-client set fake-wordpress unbanip 203.0.113.5
Fail2Ban bloqueja per país? No directament. Per bloquejar països sencers cal combinar-lo amb el tallafoc (ufw/nftables) i llistes GeoIP.
Cal reiniciar després de cada canvi? Sí. Després de modificar la configuració, fes sudo systemctl restart fail2ban (o sudo fail2ban-client reload).