Fail2ban WordPress: protege tu web de fuerza bruta

Fail2ban WordPress es una de las combinaciones más eficaces para blindar tu sitio contra ataques de fuerza bruta. Cada día, miles de bots rastrean la web buscando formularios de acceso desprotegidos, y wp-login.php es uno de sus objetivos favoritos. En esta guía aprenderás a instalar fail2ban en tu servidor, crear un filtro específico para WordPress y banear automáticamente las IP que intentan adivinar tus credenciales.
Qué es fail2ban y por qué tu WordPress lo necesita
Fail2ban analiza los logs de tu servidor en tiempo real. Nada más. Cuando detecta un patrón sospechoso (digamos, múltiples intentos fallidos de autenticación desde la misma dirección IP), ejecuta una acción automática: normalmente bloquear esa IP mediante reglas de firewall (iptables o nftables) durante un periodo determinado.
WordPress, por defecto, no limita el número de intentos de inicio de sesión. O sea que un atacante puede probar millones de combinaciones de usuario y contraseña sin restricción. Herramientas como WPScan o botnets distribuidas explotan esta carencia constantemente. Plugins como Limit Login Attempts Reloaded ayudan, sí. Pero actúan a nivel de aplicación PHP, lo que consume recursos del servidor. Fail2ban bloquea la conexión a nivel de red, antes incluso de que Apache o Nginx procesen la petición. Ahí está la diferencia.
Las ventajas clave de proteger tu WordPress con fail2ban son:
- Rendimiento: las peticiones baneadas nunca llegan a PHP, ahorrando CPU y memoria.
- Seguridad en profundidad: protege también XML-RPC, otro vector habitual de ataques de fuerza bruta.
- Automatización total: no depende de que detectes el ataque manualmente.
- Flexibilidad: puedes definir tiempos de baneo, umbrales y whitelist de IP según tus necesidades.
Requisitos previos: instalación de fail2ban en tu servidor
Necesitas acceso root o sudo a un servidor VPS o dedicado con Linux. El hosting compartido no permite instalar fail2ban; si trabajas con este tipo de plan, considera migrar a un VPS administrado. Funciona en Debian, Ubuntu, CentOS y derivados.
En Debian o Ubuntu, instala con:
sudo apt update && sudo apt install fail2ban -y
En CentOS, RHEL o AlmaLinux, primero habilita el repositorio EPEL:
sudo dnf install epel-release && sudo dnf install fail2ban -y
Tras la instalación, activa y arranca el servicio:
sudo systemctl enable –now fail2ban
Consejo práctico: nunca edites jail.conf directamente, porque las actualizaciones pueden sobrescribirlo. Crea un archivo jail.local con tus configuraciones personalizadas. Verifica que fail2ban funciona con sudo fail2ban-client status; debe listar al menos el jail sshd activo.
Asegúrate también de que los logs de tu servidor web sean accesibles. En Nginx suelen estar en /var/log/nginx/access.log; en Apache, en /var/log/apache2/access.log (Debian) o /var/log/httpd/access_log (CentOS). De ahí leerá fail2ban los intentos de acceso a wp-login.php.
Cómo crear el filtro de fail2ban para WordPress y wp-login.php
El filtro es la expresión regular que fail2ban usa para identificar los intentos fallidos de login en los logs. Crea el archivo /etc/fail2ban/filter.d/wordpress.conf con este contenido:
[Definition]failregex = ^<HOST> .* «(GET|POST) /wp-login.php.*(401|403)
^<HOST> .* «(GET|POST) /wp-login.php HTTP.*» 200
ignoreregex =
La segunda línea parece contradictoria (banea respuestas 200), pero es intencional: WordPress devuelve código 200 incluso cuando el login falla, mostrando la página con un mensaje de error. ¿Quieres ser más preciso? Combina fail2ban con un log personalizado generado por un plugin de seguridad que registre los fallos de autenticación reales.
Luego define el jail en /etc/fail2ban/jail.local:
[wordpress]enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 300
bantime = 3600
Traducción de los parámetros: una IP que acceda a wp-login.php cinco veces en cinco minutos queda bloqueada durante una hora. Recarga la configuración con sudo systemctl restart fail2ban y comprueba el jail con sudo fail2ban-client status wordpress. Verás la lista de IP baneadas en tiempo real, confirmando que la protección está activa.
Si necesitas ayuda afinando tus expresiones regulares o configurando reglas más avanzadas como el baneo de XML-RPC, en RedServicio (redservicio.net) encontrarás soporte profesional especializado en servidores y WordPress.
Configurar los jails para bloquear ataques de fuerza bruta en fail2ban WordPress
Ya tienes el filtro. Ahora toca crear los jails, que son donde se decide quién baneas y durante cuánto tiempo. Crea el archivo /etc/fail2ban/jail.local (o, si lo prefieres, un archivo específico dentro de jail.d) y añade la configuración:
- Definir el jail de wp-login: indica el filtro, la ruta del log y los parámetros de baneo.
- Establecer los umbrales: 5 intentos en 10 minutos es un punto de partida razonable. Ni estricto de más ni permisivo.
- Configurar el tiempo de baneo: empieza con 3600 segundos y ve subiendo para los reincidentes.
Un jail funcional, para que te hagas una idea:
[wordpress-login]
enabled = true
filter = wordpress
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 600
bantime = 3600
banaction = iptables-multiport
¿Quieres ir un paso más allá? Añade jails complementarios. Uno para xmlrpc.php que bloquee cualquier acceso con el patrón «POST /xmlrpc.php», y otro para xml.php o los endpoints de REST API, siempre que no los uses (muchos sitios no los necesitan y ni lo saben). Eso sí: cada vez que toques los jails, recarga el servicio con systemctl restart fail2ban. Sin excepciones.
Un detalle que se olvida a menudo: el parámetro ignoreip. Incluye ahí tu IP fija o el rango de tu oficina y te ahorrarás más de un baneo accidental mientras trabajas en la web. Me ha tocado ver equipos bloqueados a sí mismos en plena migración, y no es divertido. Si tienes varios sitios en el mismo servidor, define un jail por cada log de acceso; así los baneos quedan aislados por sitio.
Probar, monitorizar y ajustar tu configuración de fail2ban
Una configuración sin probar es una fuente de problemas silenciosos. Puede parecer que todo va bien… hasta que un día descubres que el jail nunca ha baneado a nadie. Verifica que funciona de verdad con estos pasos:
- Comprueba el estado del jail: ejecuta
fail2ban-client status wordpress-loginy revisa las IPs baneadas. - Simula un ataque: desde otra IP (tu móvil con datos, por ejemplo), mete contraseñas erróneas varias veces en wp-login.php y confirma que el sexto intento queda bloqueado.
- Revisa los logs de fail2ban: en /var/log/fail2ban.log verás cada detección y cada baneo con su marca de tiempo.
- Verifica las reglas del firewall:
iptables -L f2b-wordpress-login -ndebe mostrar las IPs bloqueadas.
A partir de ahí, ajusta según lo que veas en la práctica. Si baneas a usuarios legítimos, sube maxretry o amplía la lista de ignoreip. Si el atacante vuelve nada más cumplir el baneo, aumenta bantime o activa el baneo recursivo con bantime.increment = true, que duplica el tiempo de expulsión con cada reincidencia. Y si quieres saberlo en el momento, configura la acción mail-whois para recibir notificaciones por correo de cada incidente.
Conclusión: un servidor blindado contra fuerza bruta
Fail2ban es de esas piezas que aportan mucho y pesan poco. A diferencia de los plugins de seguridad, que operan a nivel de aplicación y se comen recursos de PHP, aquí el bloqueo ocurre en la capa de red: WordPress ni se entera de que existió esa petición. Menos carga en el servidor, menos ancho de banda consumido y muchos menos intentos de intrusión llegando a la puerta.
Lo que hemos recorrido —filtros personalizados para wp-login.php y xmlrpc.php, jails con umbrales realistas, baneo progresivo para los reincidentes y monitorización constante— forma una protección completa frente a la fuerza bruta. Sumada a contraseñas robustas, autenticación en dos pasos y actualizaciones al día, tu WordPress queda defendido en varias capas. Que es como deben ser las cosas: nunca una sola.
Eso sí, la seguridad no es algo que se configura y se abandona. Revisa los logs de vez en cuando, adapta los umbrales al tráfico real de tu sitio y mantén fail2ban actualizado. Y si todo esto de expresiones regulares, firewalls y jails no va contigo —o has tenido ya algún jail mal configurado bloqueando a clientes legítimos—, en RedServicio (redservicio.net) trabajan administradores de servidores y WordPress especializados que pueden implementar y mantener esta protección por ti.





