La seguridad es uno de los pilares fundamentales de la infraestructura. Si gestionas servidores Linux con SSH expuesto a Internet, sabrás que los intentos de acceso no autorizados ocurren constantemente. Bots automatizados escanean direcciones IP de forma masiva intentando realizar ataques de fuerza bruta, probando miles de combinaciones de usuario y contraseña hasta encontrar una válida.
Para mitigar este problema existe Fail2Ban, una herramienta extremadamente eficaz que monitoriza los registros del sistema y bloquea automáticamente direcciones IP que muestran comportamientos sospechosos.
¿Qué es Fail2Ban?
Fail2Ban es una herramienta de seguridad que analiza logs del sistema en tiempo real buscando patrones de fallos de autenticación u otros comportamientos maliciosos.
Cuando detecta demasiados intentos fallidos desde una misma dirección IP, ejecuta una acción automática como:
- Bloquear la IP en iptables.
- Bloquear la IP en nftables.
- Modificar reglas de firewall.
- Enviar alertas por correo.
Esto permite automatizar la defensa contra ataques de fuerza bruta sin intervención manual.
Explorando el directorio de configuración
Instalamos Fail2ban:
sudo apt install fail2banHabilitamos el servicio:
sudo systemctl enable fail2banUna vez instalado Fail2Ban, toda su configuración se encuentra en:
/etc/fail2banAccedemos al directorio y listamos su contenido:
cd /etc/fail2ban
lsEncontraremos una estructura similar a esta:
action.d/
fail2ban.conf
fail2ban.d/
filter.d/
jail.conf
jail.d/
paths-arch.conf
paths-common.conf
paths-debian.conf
paths-opensuse.conf
fail2ban.conf
Archivo de configuración principal del servicio Fail2Ban. Controla cómo funciona el daemon, logs, sockets y parámetros internos.
fail2ban.d/
Directorio para configuraciones adicionales o sobrescrituras del archivo principal sin modificar el original.
jail.conf
Archivo de configuración principal que contiene todas las jails predeterminadas para distintos servicios (SSH, Apache, etc.).
jail.d/
Directorio donde se pueden añadir configuraciones personalizadas de jails sin modificar jail.conf.
filter.d/
Contiene filtros basados en expresiones regulares que permiten identificar intentos fallidos o comportamientos sospechosos dentro de los logs.
action.d/
Define las acciones que se ejecutarán cuando una IP sea bloqueada, como agregar reglas al firewall, enviar alertas o registrar eventos.
paths-common.conf
Define rutas comunes de logs utilizadas por diferentes servicios.
paths-debian.conf
Especifica rutas de logs específicas para sistemas Debian/Ubuntu.
paths-opensuse.conf
Define rutas de logs utilizadas en OpenSUSE.
paths-arch.conf
Contiene rutas de logs adaptadas para Arch Linux.
La regla obligatoria de Fail2ban
Uno de los errores más comunes es editar directamente el archivo:
jail.confEsto no es recomendable, ya que este archivo puede ser sobrescrito durante una actualización del sistema.
La práctica correcta consiste en crear un archivo de configuración local llamado:
jail.localFail2Ban carga primero jail.conf y posteriormente jail.local, aplicando las configuraciones personalizadas definidas en este último.
Para crearlo copiamos el archivo original:
sudo cp jail.conf jail.localVerificamos que se haya creado correctamente:
lsLuego abrimos el archivo para editarlo:
sudo nano jail.local
Entendiendo las advertencias del archivo
Al abrir jail.local, veremos una serie de comentarios en la parte superior del archivo.
Estos comentarios indican que:
- jail.conf puede cambiar en futuras actualizaciones.
- Las personalizaciones deben realizarse en jail.local.
- también pueden crearse archivos individuales dentro de jail.d/.
Este enfoque permite mantener una configuración estable y resistente a actualizaciones del sistema.

Configuración de acciones en Fail2Ban
En esta sección del archivo jail.local se definen algunos parámetros globales utilizados por las acciones de Fail2Ban cuando se detecta un intento de acceso malicioso.

Aquí es posible configurar:
Direcciones de correo
Se pueden definir direcciones de correo para recibir notificaciones cuando una IP es bloqueada.
Método de envío de correo (MTA)
Fail2Ban permite elegir el sistema de envío de emails que se utilizará para las alertas.
Protocolo y puertos
Se puede definir el protocolo de red (TCP/UDP) y los puertos que serán protegidos o bloqueados.
Cadena del firewall
Permite especificar en qué cadena del firewall se aplicarán las reglas de bloqueo.
Acciones de bloqueo
Se determinan las acciones que se ejecutarán cuando se detecte un ataque, por ejemplo:
- Bloquear la IP en el firewall.
- Bloquear todos los puertos.
- Enviar una alerta por correo.
- Incluir información adicional como WHOIS o registros del log.
Esta parte de la configuración permite definir cómo reaccionará Fail2Ban ante un ataque, estableciendo desde el método de bloqueo hasta las notificaciones que recibirá el administrador del servidor.
Configuración de Jails en Fail2Ban
En esta sección se definen las jails, que son las configuraciones que indican a Fail2Ban qué servicio proteger y qué logs monitorear para detectar intentos de acceso maliciosos.

Cada jail especifica principalmente:
Servicio a proteger
Por ejemplo SSH o servidores web como Apache.
Puerto del servicio
Define el puerto donde escucha el servicio (por ejemplo ssh, http o https).
Ruta del log
Indica el archivo de logs que Fail2Ban analizará para detectar intentos fallidos.
Backend de lectura de logs
Determina el método que Fail2Ban utilizará para leer los registros del sistema.
Ejemplos de jails comunes:
sshd
Protege el servicio SSH detectando intentos fallidos de inicio de sesión.
dropbear
Jail para proteger servidores que utilizan Dropbear SSH.
selinux-ssh
Utilizada en sistemas con SELinux, monitorea eventos relacionados con SSH en los logs de auditoría.
apache-auth
Detecta intentos fallidos de autenticación en servidores Apache.
apache-badbots
Bloquea bots maliciosos o crawlers sospechosos que intentan abusar del servidor web.
Simulando un ataque de fuerza bruta
Antes de configurar Fail2ban intentaremos un ataque de fuerza bruta desde uno de mis proyecto creados en bash llamado ssh-bruteforce.
Clonamos el repositorio desde GitHub:
git clone https://github.com/Gabriel-GR14/ssh-bruteforce.gitDamos permisos de ejecución:
chmod +x ssh-bruteforce.shAccedemos al directorio:
cd ssh-bruteforceCreamos un diccionario de contraseñas. Los ataques de fuerza bruta utilizan listas de contraseñas conocidas.
Creamos un archivo llamado wordlist.txt:
nvim wordlist.txtEjemplo:
abc123
hello456
password789
miClave2026
Ejecutamos el ataque:
./ssh-bruteforce.sh -i 192.168.88.252 -u gabrielgr -w wordlist.txt
Vemos que el script nos ha devuelto la contraseña correcta del servicio SSH asociado a esa IP. Por lo que ahora haremos pie a la activación y configuración de Fail2ban para evitar estos ataques.
Activando y configurando la protección SSH
Para protegerlo buscamos la sección:
[sshd]Veremos los siguientes parámetros:
[sshd]
#mode = normal
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)sLuego agregamos:
#mode = normal
port = ssh
enabled = true
logpath = %(sshd_log)s
backend = %(sshd_backend)s
filter = sshd
maxretry = 2
findtime = 30
bantime = 3600Modos de detección en SSH
Fail2Ban permite utilizar distintos modos de detección para el filtro de SSH, los cuales determinan qué tipo de eventos se analizarán en los logs para detectar ataques.
normal
Es el modo predeterminado. Detecta intentos fallidos de autenticación en SSH basándose en los mensajes estándar del log.
ddos
Amplía la detección para identificar ataques de fuerza bruta más agresivos o automatizados, analizando patrones adicionales en los registros.
extra
Incluye reglas adicionales de detección, lo que permite identificar más tipos de intentos sospechosos o errores relacionados con autenticación.
aggressive
Combina todos los modos anteriores, aplicando la detección más estricta posible para bloquear intentos maliciosos.
Protección para SSH
port = ssh
Indica el puerto del servicio SSH que será monitoreado. Normalmente corresponde al puerto 22.
enabled = true
Activa la jail para que Fail2Ban comience a proteger el servicio SSH.
logpath = %(sshd_log)s
Define la ruta del archivo de logs de SSH que Fail2Ban analizará para detectar intentos fallidos de autenticación.
backend = %(sshd_backend)s
Especifica el método que Fail2Ban utilizará para leer los logs del sistema.
filter = sshd
Indica el filtro que se utilizará para detectar intentos fallidos dentro de los logs de SSH.
maxretry = 2
Define la cantidad máxima de intentos fallidos permitidos antes de bloquear una dirección IP.
findtime = 30
Establece el tiempo en segundos en el que se contabilizan los intentos fallidos.
bantime = 3600
Determina cuánto tiempo permanecerá bloqueada la IP después de superar el número máximo de intentos.

Con esta configuración, Fail2Ban monitorea los logs de SSH y bloquea automáticamente cualquier dirección IP que supere el número permitido de intentos de autenticación en un periodo determinado.
Ejecutando el ataque y observando el bloqueo
Ahora lanzamos el ataque contra nuestro servidor nuevamente:

Debido a nuestra configuración:
maxretry = 2
findtime = 30Después de dos intentos fallidos, Fail2Ban detectará el comportamiento sospechoso y ejecutará el bloqueo automático.
A partir de ese momento cualquier intento de conexión SSH desde la IP atacante será rechazado.
Si intentamos conectarnos manualmente veremos:
ssh gabrielgr@192.168.88.252Resultado:
ssh: connect to host 192.168.88.252 port 22: Connection refusedEsto indica que el firewall del servidor está bloqueando completamente la conexión.
Verificando el estado de Fail2Ban
Para comprobar que la configuración funciona correctamente utilizamos:
sudo fail2ban-client status sshdLa salida mostrará información como:
Filter
|- Currently failed: 6
`- File list: /var/log/auth.log
Actions
|- Currently banned: 1
`- Banned IP list: 192.168.88.253Esto indica:
- Cuántos intentos fallidos fueron detectados.
- Qué archivo de log se está analizando.
- Qué direcciones IP están bloqueadas.
Vemos que se ha bloqueado la IP desde la máquina que ejecutamos el script de fuerza bruta.
También podemos listar todos los bloqueos activos con:
sudo fail2ban-client banned
Desbanear una IP manualmente
En ocasiones puede ocurrir que un usuario legítimo sea bloqueado por error.
Para eliminar el bloqueo utilizamos:
sudo fail2ban-client unban 192.168.88.253El sistema devolverá:
1Esto indica que la IP fue eliminada correctamente de la lista de bloqueo.
Podemos verificarlo con:
sudo fail2ban-client bannedLa salida mostrará que no hay direcciones bloqueadas.
Excluir direcciones IP del bloqueo (ignoreip)
En algunos escenarios es necesario evitar que ciertas direcciones IP sean bloqueadas por Fail2Ban. Esto es especialmente útil para:
- La IP del administrador.
- Servidores de monitorización.
- Redes internas.
- Sistemas de automatización o backups.
Esto es de forma temporal ya que al reiniciar el servicio la IP ignorada es eliminada.

Configuración permanente mediante jail.local
La forma correcta de hacerlo permanente es definiendo la directiva ignoreip dentro del archivo de configuración.
Dentro del archivo jail.local encontramos la siguiente línea y agregamos las IPs que deseamos:
ignoreip = 127.0.0.1/8 ::1 192.168.88.253
Conclusión
Fail2Ban es una herramienta esencial para proteger servicios expuestos a Internet, especialmente SSH, ya que permite detectar intentos de acceso fallidos y bloquear automáticamente direcciones IP sospechosas. Sin embargo, es importante recordar que Fail2Ban debe formar parte de una estrategia de seguridad más amplia. La práctica más recomendable es no exponer el servicio SSH directamente a Internet, sino acceder al servidor a través de una VPN segura, permitiendo que solo dispositivos autorizados puedan conectarse.
De esta manera combinamos acceso restringido mediante VPN y protección automática con Fail2Ban, logrando una infraestructura mucho más segura frente a ataques automatizados.
GabrielGR









