Situación actual: PHP2Shell. Dos vulnerabilidades críticas de PHP (CVSS 9.2) permiten ejecutar código malicioso sin autenticación. Parches desde el 21/10/2026.Qué hacer ahora →

Configurar Fail2ban para servidores web

Fail2ban bloquea las direcciones que llaman la atención de forma repetida en los logs. Para servidores web trae filtros ya hechos, y con pocas líneas se añaden otros propios. Cómo configurarlo sin bloquearse a sí mismo ni a sus clientes.

Actualizado 6 min de lecturaRefuerzo y configuración

En resumen: Fail2ban lee archivos de log y bloquea en el cortafuegos las direcciones que llaman demasiado la atención dentro de un intervalo de tiempo. Para Nginx y Apache trae jails ya hechos como nginx-botsearch o apache-noscript; los filtros propios se prueban con fail2ban-regex. Los ajustes pertenecen a jail.local, sus propias direcciones a ignoreip, y el jail recidive atrapa a los reincidentes. Contra ataques dirigidos aislados Fail2ban no ayuda; contra escaneos masivos, sí.

Cuando los logs están llenos de escáneres

Quien mira estos días los registros de acceso de sus servidores web los encuentra a menudo llenos de peticiones a rutas que ni siquiera existen: antiguas interfaces de administración, archivos de prueba, vulnerabilidades conocidas de otros productos. En una situación como PHP2Shell se añade la búsqueda dirigida de servidores vulnerables: Cloudflare y Patchstack informaron de intentos de ataque, y Unit 42 contó más de 22,6 millones de instancias expuestas y potencialmente vulnerables.

Fail2ban es una herramienta probada contra esta masa. Lee archivos de log, reconoce entradas llamativas con filtros y bloquea la dirección del remitente durante un tiempo determinado en el cortafuegos. Eso alivia al servidor, reduce el ruido en los logs y dificulta el sondeo sistemático desde una fuente.

Lo que Fail2ban no puede hacer es igual de importante: no impide una única petición que explote una vulnerabilidad. Contra PHP2Shell solo ayuda la actualización de PHP. Cómo transcurren los ataques automatizados lo describe Escaneos masivos tras PHP sin parchear.

Fail2ban para Nginx y Apache: los jails incluidos

Un jail vincula un filtro con un archivo de log y una acción de bloqueo. El jail.conf incluido contiene ya jails para servidores web. Están desactivados por defecto y se activan uno a uno.

Jail Servidor web Detecta
nginx-http-auth Nginx inicios de sesión HTTP Basic fallidos
nginx-limit-req Nginx peticiones que superan el límite de tasa de Nginx
nginx-botsearch Nginx búsqueda de rutas típicas inexistentes
nginx-bad-request Nginx peticiones defectuosas
apache-auth Apache inicios de sesión fallidos
apache-badbots Apache identificadores de bots maliciosos conocidos
apache-noscript Apache llamadas a scripts inexistentes
apache-overflows Apache peticiones excesivamente largas
apache-botsearch Apache búsqueda de rutas típicas inexistentes
php-url-fopen ambos determinados patrones de intentos de inclusión de URL
recidive ambos direcciones que Fail2ban ha bloqueado repetidamente

Los valores por defecto de la configuración incluida son más bien suaves: bloqueo de 10 minutos tras 5 coincidencias en 10 minutos. Para servidores web con mucho tráfico de escaneo merece la pena un bloqueo más largo y un factor creciente para las reincidencias.

La configuración básica en jail.local

El propio jail.conf dice que no debe modificarse, porque las actualizaciones lo sustituyen. Los valores propios pertenecen a /etc/fail2ban/jail.local. El ejemplo siguiente para Nginx fija valores por defecto razonables y activa los jails adecuados:

# /etc/fail2ban/jail.local
[DEFAULT]
# Registrar las propias direcciones fijas (sustituir la dirección de ejemplo)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

[recidive]
enabled  = true
bantime  = 1w
findtime = 1d

Para Apache, active en su lugar, por ejemplo, apache-auth, apache-noscript y apache-botsearch. Fail2ban trae las rutas de log según la distribución; si las suyas difieren, fije logpath en el jail correspondiente. Si su sistema lee los logs solo a través del journal, ayuda backend = systemd.

Un filtro propio para peticiones masivas a archivos PHP

Un patrón típico en la situación actual son muchas peticiones en poco tiempo a archivos PHP que no existen. Un filtro propio lo detecta por el código de estado 404. Solo describe lo que figura en su propio log:

# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Complemento en /etc/fail2ban/jail.local
[nginx-php-404]
enabled  = true
port     = http,https
filter   = nginx-php-404
logpath  = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime  = 1h

Antes de activar el filtro, pruébelo contra el log real. Así ve cuántas líneas detecta y si entre ellas hay accesos legítimos:

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Desbloquear una dirección bloqueada por error
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25

Elija el umbral con generosidad. Un rastreador que recorre enlaces obsoletos o un servicio de monitorización no debe acabar en el bloqueo.

Las trampas más frecuentes

Fail2ban se instala rápido, pero es fácil usarlo mal. Compruebe estos puntos antes del uso en producción:

  1. Autobloqueo: las direcciones de la oficina, de la VPN y de la monitorización pertenecen a ignoreip antes de que los jails estén activos.
  2. Servicios situados por delante: detrás de un CDN o balanceador de carga, Fail2ban sin adaptación solo ve sus direcciones. Más información en la guía Proteger los inicios de sesión de administración frente a la fuerza bruta.
  3. Rotación de logs: tras el cambio del archivo de log, Fail2ban debe leer el archivo nuevo. Compruebe tras la primera rotación si los jails siguen contando coincidencias.
  4. Interacción con el cortafuegos: Fail2ban registra los bloqueos en el cortafuegos. Quien gestiona su cortafuegos recargando por completo el conjunto de reglas puede borrar esas entradas. Cómo montar el propio cortafuegos figura en Cortafuegos para servidores web: abrir solo los puertos necesarios.
  5. IPv6: los ataques llegan también por IPv6. Compruebe si su acción de bloqueo cubre ambos protocolos.
Consejo

Analice las listas de bloqueo con regularidad. Si se acumulan bloqueos desde determinadas redes o hacia determinadas rutas, es una señal de búsqueda dirigida y un motivo para examinar con más detalle la aplicación afectada.

Conclusión: una herramienta contra la masa, no contra todo

Fail2ban se configura rápido y quita a los servidores web una parte del bombardeo constante. Los jails incluidos cubren patrones típicos, los filtros propios pueden probarse sin riesgo contra logs reales con fail2ban-regex, y el jail recidive hace que las fuentes tenaces queden fuera más tiempo.

No debe sobrestimarlo. Fail2ban reacciona a la repetición, no a la primera coincidencia, y solo ve lo que figura en los logs. Contra una vulnerabilidad como PHP2Shell ayuda únicamente la actualización, y contra ataques distribuidos desde muchas direcciones Fail2ban apenas sirve. Despliega su valor como una capa entre varias: junto a un cortafuegos ligero, una configuración reforzada del servidor web, autenticación en dos factores y una supervisión que no solo bloquea lo llamativo, sino que también lo notifica.

¿Cómo ayuda PHP SOS en concreto?

  • Analizar los logs: examinamos qué patrones aparecen en sus registros de acceso y elegimos los jails adecuados.
  • Configurar y probar: configuramos Fail2ban con filtros propios, probamos cada filtro contra logs reales y registramos como excepción sus direcciones fijas.
  • Aclarar la interacción: coordinamos CDN, balanceador de carga, cortafuegos y rotación de logs de modo que los bloqueos alcancen las direcciones correctas.
  • Vigilar: en el marco de la monitorización de seguridad analizamos de forma continua bloqueos y anomalías.

Preguntas frecuentes

¿Protege Fail2ban frente a PHP2Shell?

No. Fail2ban solo reacciona después de que una dirección haya llamado la atención varias veces en los logs. No impide un único ataque con éxito. Pero Fail2ban reduce la carga causada por los escáneres y encarece los intentos repetidos desde la misma fuente.

¿Por qué no debo modificar jail.conf directamente?

El archivo se sustituye en las actualizaciones de paquetes, y lo dice él mismo. Los ajustes propios pertenecen a un jail.local o a archivos bajo jail.d. Allí sobrescriben de forma específica los valores por defecto.

¿Qué es el jail recidive?

Un jail que analiza el propio registro de Fail2ban. Quien es bloqueado una y otra vez recibe un bloqueo mucho más largo. En la configuración incluida es de una semana.

¿Funciona Fail2ban detrás de Cloudflare o de un balanceador de carga?

Solo con configuración adicional. Sin ella, en los logs figura la dirección del servicio situado por delante, y un bloqueo afectaría a todos los visitantes. El servidor web debe entonces adoptar la dirección real del visitante, y es mejor aplicar los bloqueos en el servicio situado por delante.

Fuentes

Contacto inmediato

Cada hora cuenta. Escríbanos ahora.

Describa brevemente el sistema, la versión de PHP y lo que ha observado. Nos pondremos en contacto, aclararemos la situación y trabajaremos en remoto hasta que el incidente quede cerrado y documentado.

Ayuda inmediata