Fail2ban lee los registros de tu servidor, detecta quién falla al iniciar sesión demasiadas veces y le cierra la puerta automáticamente. Es la forma más sencilla y barata de proteger tu servidor contra los ataques de fuerza bruta que llaman a tu SSH cada noche. Si tienes un VPS expuesto a internet, ahora mismo hay bots probando contraseñas en tu puerto 22. No es paranoia, es martes. Configurar Fail2ban para bloquear IPs maliciosas te lleva quince minutos y te ahorra el disgusto de ver tu máquina convertida en minero de criptomonedas ajeno. Aquí te explicamos cómo funciona la protección contra fuerza bruta de verdad, sin humo y con comandos que puedes copiar.
Qué es Fail2ban y por qué lo necesitas
Fail2ban es un servicio que vigila ficheros de log (/var/log/auth.log, los del servidor web, los de tu correo) buscando patrones de fallo. Cuando una IP supera el número de intentos que tú decides, Fail2ban crea una regla de firewall y la veta durante un tiempo. Ban temporal, automático, sin que tú muevas un dedo.
La gracia está en su arquitectura de jails (cárceles). Cada jail es una combinación de tres cosas: un filtro que define qué buscar, un log donde buscarlo y una acción que ejecutar. Esa modularidad permite proteger SSH, Postfix, Dovecot, WordPress o Nginx con el mismo motor.
Los ataques de fuerza bruta no son sofisticados. Son insistentes. Un bot prueba miles de combinaciones usuario/contraseña hasta que acierta o se cansa. Si usas contraseñas y no bloqueas a los pesados, es cuestión estadística. Fail2ban rompe esa estadística cortando al atacante tras cinco o seis fallos.
Instalación en Debian, Ubuntu y CentOS
En sistemas basados en Debian la instalación es directa:
- Debian / Ubuntu:
sudo apt update && sudo apt install fail2ban - CentOS / Rocky / AlmaLinux:
sudo dnf install epel-release && sudo dnf install fail2ban
Una vez instalado, arráncalo y déjalo activo al inicio:
sudo systemctl enable fail2bansudo systemctl start fail2bansudo systemctl status fail2banpara confirmar que respira.
Aviso importante: nunca toques el fichero jail.conf. Una actualización del paquete lo sobrescribe y te lleva tu trabajo por delante. Crea siempre /etc/fail2ban/jail.local, que tiene prioridad y sobrevive a las actualizaciones. Esto es de manual, pero medio internet lo aprende por las malas.
Configurar Fail2ban: el fichero jail.local
Aquí es donde configurar Fail2ban deja de ser teoría. Crea /etc/fail2ban/jail.local y empieza por la sección global [DEFAULT], que fija los valores para todas las cárceles:
- bantime: cuánto dura el bloqueo.
1hes razonable; los reincidentes merecen más. - findtime: la ventana de tiempo en la que cuentan los fallos.
10mes lo habitual. - maxretry: cuántos fallos se toleran antes del veto.
5es un buen punto de partida. - ignoreip: tu propia IP y la red local, para no autobanearte. Pon aquí
127.0.0.1/8y tu IP fija si la tienes.
Ese último punto no es opcional. Quedarte fuera de tu propio servidor por un dedo torpe en la contraseña es un clásico que todos hemos vivido una vez. Una sola.
Para activar la protección de SSH, el caso de uso estrella, añade su jail:
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 1h
Reinicia con sudo systemctl restart fail2ban y ya estás bloqueando IPs que insistan tres veces en SSH. Si cambiaste el puerto SSH del 22 a otro, ajústalo en port. Cambiar de puerto reduce el ruido, pero no sustituye a Fail2ban: es seguridad por oscuridad, y eso dura lo que tarda un escaneo de Shodan.
Bantime incremental y recidiva: castigo proporcional
Las versiones modernas (Fail2ban 0.10 en adelante) incluyen el baneo incremental. La idea es elegante: cuanto más reincide una IP, más larga es su condena. Actívalo en [DEFAULT]:
bantime.increment = truebantime.factor = 2(cada reincidencia duplica el tiempo)bantime.maxtime = 1w(techo de una semana)
Así, el bot que vuelve cada hora pasa de un baneo de minutos a uno de días sin que tú intervengas. Para los muy pesados existe la jail recidive, que vigila el propio log de Fail2ban y veta durante semanas a quien acumula múltiples baneos. Es la lista negra de los que no aprenden.
Para revisar quién está entre rejas, usa el cliente de control: sudo fail2ban-client status sshd te muestra los intentos y las IPs activas. Para liberar una IP por error: sudo fail2ban-client set sshd unbanip 1.2.3.4. Pocos comandos, mucho control.
Más allá de SSH: web, correo y WordPress
SSH es solo el principio. Fail2ban protege cualquier servicio que escriba logs legibles. Algunos jails habituales:
| Jail | Servicio que protege | Ataque que frena |
|---|---|---|
| postfix | Servidor de correo SMTP | Relay y autenticación abusiva |
| dovecot | IMAP / POP3 | Fuerza bruta a buzones |
| nginx-http-auth | Áreas con autenticación básica | Adivinación de credenciales |
| wordpress | WordPress (con filtro propio) | Ataques a wp-login.php |
Para WordPress necesitas un filtro adaptado o un plugin que registre los intentos fallidos en un log que Fail2ban pueda leer. Si gestionas varios sitios, integrarlo con un esquema de seguridad por capas evita que un único punto débil tumbe todo el servidor. Y si tu WordPress es un proyecto serio, conviene apoyarse en un equipo de WordPress profesional que mantenga el endurecimiento al día en lugar de improvisar a las tres de la mañana.
El correo merece mención aparte. Un servidor SMTP mal protegido acaba en listas negras y enviando spam ajeno. Combinar Fail2ban con filtrado inteligente de correo entrante es la diferencia entre dormir tranquilo y explicarle a tus clientes por qué sus emails caen en spam. Para entender cómo se cuela la basura, este repaso sobre qué hacer con el spam da contexto del problema desde el otro lado.
Errores típicos al desplegar Fail2ban
Fail2ban funciona bien, pero la gente tropieza siempre en los mismos sitios:
- Editar jail.conf en vez de jail.local. Ya lo dijimos. Lo repetimos porque lo seguirás viendo.
- Ruta de log equivocada. En Ubuntu con systemd, los logs van al journal, no a
/var/log/auth.log. Usabackend = systemden la jail si los fallos no se detectan. - maxretry demasiado alto. Si dejas 10 intentos, le das al bot diez oportunidades gratis. Tres bastan para un humano.
- Olvidar ignoreip. El autobaneo es un rito de paso, pero no hace falta pasar por él.
- Confiar solo en Fail2ban. Es una capa, no una muralla. Va acompañado de claves SSH, no contraseñas.
Sobre ese último punto: la mejor protección contra la fuerza bruta es eliminar la posibilidad de adivinar. Desactiva el login por contraseña (PasswordAuthentication no en sshd_config) y usa claves criptográficas. Fail2ban pasa entonces de ser tu defensa principal a ser tu sistema de alerta temprana. Las dos cosas suman.
Preguntas frecuentes
¿Fail2ban es suficiente para proteger mi servidor?
No por sí solo. Fail2ban frena los ataques de fuerza bruta, pero la seguridad real es por capas: claves SSH en lugar de contraseñas, firewall configurado, software actualizado y, si hace falta, doble factor. Fail2ban es una pieza excelente y barata, no el muro entero.
¿Cuánto tiempo debo banear una IP?
Una hora es un buen valor de partida para no penalizar errores humanos. Activa el baneo incremental para que los reincidentes acumulen condenas cada vez más largas, con un techo de uno o dos días. Para los más persistentes, la jail recidive aplica semanas.
¿Fail2ban ralentiza el servidor?
Apenas. Lee logs y añade reglas de firewall, operaciones muy ligeras. El consumo de CPU y memoria es mínimo incluso con varias jails activas. En servidores con muchísimo tráfico conviene afinar el backend de logs, pero para el 99% de los casos es transparente.
¿Cómo sé si Fail2ban está bloqueando IPs de verdad?
Ejecuta sudo fail2ban-client status sshd y verás los intentos totales y las IPs actualmente baneadas. Para el panorama completo, sudo fail2ban-client status lista todas las jails activas. Si los números crecen, está trabajando.
¿Puedo usar Fail2ban con Cloudflare o detrás de un proxy?
Sí, pero con cuidado. Detrás de un proxy verás la IP del proxy en los logs, no la del atacante, y banearías al intermediario. Necesitas configurar el servidor para registrar la cabecera X-Forwarded-For y una acción que comunique el baneo a Cloudflare por API.
El siguiente paso
Abre una terminal en tu servidor, instala Fail2ban con el comando de tu distribución y crea /etc/fail2ban/jail.local con la jail [sshd] activada y tu IP en ignoreip. En quince minutos pasas de puerta abierta a puerta con portero. Cuando lo tengas, échale un ojo a más guías de fortificación de servidores y correo en el blog de MataSpam: tu bandeja de entrada, y tu VPS, te lo agradecerán.


