Ghost AcademySecLearn// Seguridad Informática
🔒 Fail2Ban · Protección fuerza bruta · SSH · Ubuntu / Debian
Fail2Ban
// Bloqueo automático de intentos de fuerza bruta vía firewall

Instala y configura Fail2Ban para detectar y bloquear automáticamente IPs maliciosas que intentan ataques de fuerza bruta contra SSH y otros servicios. Configuración de jails, parámetros de ban y verificación con capturas reales.

bantime · findtime · maxretry jail.local · sshd jail · apache-auth fail2ban-client status · unbanip /var/log/fail2ban.log · /var/log/auth.log Fail2Ban + UFW + OpenSSH
🛡️
Fail2Ban — ¿Cómo funciona?
Fail2Ban monitoriza los logs del sistema en busca de patrones de ataque y bloquea automáticamente las IPs ofensivas mediante reglas de firewall.
📋
Lee los logs
Monitoriza /var/log/auth.log y otros archivos de registro
→
🔍
Detecta patrones
Usa filtros con expresiones regulares para identificar intentos fallidos
→
⏱️
Cuenta intentos
Si supera maxretry en la ventana findtime, actúa
→
🔥
Bloquea la IP
Añade una regla de firewall (iptables/ufw) bloqueando la IP por bantime
📦
1. Instalación de Fail2Ban
Disponible en los repositorios oficiales de Ubuntu/Debian. También funciona en CentOS/RHEL con pequeñas diferencias.
bash — Ubuntu / Debian
# Actualizar repositorios e instalar Fail2Ban
sudo apt update
sudo apt install fail2ban -y

# Comprobar que el servicio está activo
sudo systemctl status fail2ban
systemctl status fail2ban mostrando el servicio activo
systemctl status fail2ban — servicio activo y corriendo
⚙️
2. Archivos de Configuración
Nunca edites /etc/fail2ban/jail.conf — es el template y se sobreescribe con las actualizaciones. Usa siempre jail.local para personalizaciones.
📁 Regla de oro: jail.conf = template del sistema (no tocar). jail.local = tu configuración personalizada (crea este archivo).
bash — crear jail.local
sudo nano /etc/fail2ban/jail.local

Configuración para SSH — jail [sshd]

⚙️ /etc/fail2ban/jail.local — jail SSH
[sshd]
enabled = true — activa la protección para este servicio
port = ssh — puerto a proteger (22 por defecto)
filter = sshd — filtro con regex para detectar intentos fallidos
logpath = /var/log/auth.log — log a monitorizar
maxretry = 3 — intentos fallidos antes de banear
bantime = 600 — duración del bloqueo en segundos (600 = 10 min)
findtime = 600 — ventana de tiempo para contar intentos (segundos)
Contenido del archivo jail.local con la configuración de [sshd]
Archivo jail.local con la configuración del jail SSH

Parámetros clave

Parámetro Valor ejemplo Descripción
enabledtrueActiva la protección de esta jail
maxretry3Número de intentos fallidos antes de banear la IP
findtime600Ventana de tiempo en segundos en la que se cuentan los intentos (600 s = 10 min)
bantime600Tiempo de bloqueo en segundos. -1 = bloqueo permanente
logpath/var/log/auth.logArchivo de log que Fail2Ban monitoriza
filtersshdNombre del filtro (regex) a usar — en /etc/fail2ban/filter.d/
⚠️ bantime = -1: Establece el bloqueo como permanente. Útil en producción, pero úsalo con cuidado — un falso positivo requeriría desbloqueo manual.
🔄
3. Reiniciar y Verificar el Estado
Después de modificar jail.local, reinicia Fail2Ban para aplicar los cambios y verifica que las jails están activas.
bash
# Reiniciar el servicio para aplicar cambios
sudo systemctl restart fail2ban

# Habilitar inicio automático
sudo systemctl enable fail2ban

# Ver el listado de jails activas
sudo fail2ban-client status

# Ver detalles de la jail sshd (IPs baneadas, contadores...)
sudo fail2ban-client status sshd
systemctl restart fail2ban y enable ejecutándose correctamente
Reiniciando y habilitando Fail2Ban
fail2ban-client status mostrando Number of jail: 1 y Jail list: sshd
fail2ban-client status — jail sshd activa
fail2ban-client status sshd con detalles del jail — currently banned, total banned
fail2ban-client status sshd — detalles completos del jail
📊 fail2ban-client status sshd — salida esperada
Status for the jailsshd
|- Filter — Currently failed0
|- Filter — Total failed0
|- Actions — Currently banned0
|- Actions — Total banned0
`- Actions — Banned IP list(vacía antes de la prueba)
🔑
Habilitar SSH en Ubuntu
Pasos para asegurarte de que el servidor SSH está activo y accesible antes de probar Fail2Ban.
1
Instalar OpenSSH Server
Si no está instalado: sudo apt install openssh-server -y
2
Verificar e iniciar el servicio
systemctl status ssh — si aparece "inactive", arrancarlo con sudo systemctl start ssh y habilitarlo con sudo systemctl enable ssh
3
Verificar que escucha en el puerto 22
sudo ss -tulpn | grep ssh — debe mostrar 0.0.0.0:22
4
Abrir el puerto en UFW
Si UFW está activo: sudo ufw allow ssh y luego sudo ufw reload
5
Probar conexión desde otra máquina
ssh atu@172.26.0.192 — sustituye con la IP de tu servidor
bash — setup completo de SSH
# Instalar SSH server
sudo apt install openssh-server -y

# Iniciar y habilitar el servicio
sudo systemctl start ssh
sudo systemctl enable ssh

# Verificar que escucha en puerto 22
sudo ss -tulpn | grep ssh

# Abrir el puerto en UFW (si está activo)
sudo ufw allow ssh
sudo ufw reload
ufw allow ssh y ufw reload — puerto SSH abierto en el firewall
UFW — abriendo el puerto SSH con ufw allow ssh
⚔️
4. Prueba de Funcionamiento
Simula un ataque de fuerza bruta introduciendo contraseñas incorrectas repetidamente. Luego verifica que Fail2Ban bloqueó la IP correctamente.
bash — simular fuerza bruta desde otra máquina
# Intentar conectar por SSH — introduce contraseñas INCORRECTAS
# Repite más de maxretry (3) veces dentro de findtime (600s)
ssh feval@192.168.1.45 -p 22

# Después de los intentos fallidos, verificar el ban
sudo fail2ban-client status sshd
# La IP atacante aparecerá en "Banned IP list"
Múltiples intentos SSH fallidos — Permission denied (publickey,password)
Intentos SSH fallidos — introduciendo contraseñas incorrectas repetidamente
fail2ban-client status sshd mostrando la IP baneada en Banned IP list
fail2ban-client status sshd — IP baneada correctamente en Banned IP list
✅ Prueba exitosa: La IP atacante aparece en "Banned IP list" y Fail2Ban ha añadido automáticamente una regla de firewall bloqueando todo tráfico desde esa IP durante bantime segundos.
🔓
Desbloquear una IP Manualmente
Si una IP legítima quedó baneada por error (falso positivo), puedes desbloquearla con fail2ban-client.
bash — desbanear una IP
# Desbloquear una IP específica del jail sshd
sudo fail2ban-client set sshd unbanip 192.168.1.42

# Verificar que ya no está en la lista de baneadas
sudo fail2ban-client status sshd
fail2ban-client set sshd unbanip desbloqueando una IP manualmente
Desbloqueo manual de IP con fail2ban-client set sshd unbanip
🔧
5. Extensiones Útiles
Fail2Ban puede proteger cualquier servicio que genere logs. Estas son las extensiones más habituales en entornos de producción.
📧 Notificaciones por correo
Configura Fail2Ban para enviar un email cuando se banea una IP. Útil en servidores de producción para alertas inmediatas.
🌐 Filtros para Apache / Nginx
Crea jails para proteger servicios web. Los filtros están disponibles en /etc/fail2ban/filter.d/.
♾️ Ban permanente
Ajusta bantime = -1 en la jail para bloquear IPs de forma permanente — ideal para atacantes reincidentes.
📬 Postfix / Dovecot
Protege servicios de correo contra ataques de fuerza bruta con jails específicas para SMTP e IMAP.

Jail para Apache — ejemplo

⚙️ /etc/fail2ban/jail.local — jail Apache
[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache*/*error.log
maxretry = 5
📋
6. Verificación de Logs
El log de Fail2Ban registra cada ban, unban y acción del sistema. Es la fuente de verdad para auditoría y diagnóstico.
bash — monitorizar logs en tiempo real
# Ver el log de Fail2Ban en tiempo real
sudo tail -f /var/log/fail2ban.log

# Ver solo los bans recientes
sudo grep "Ban" /var/log/fail2ban.log

# Ver los logs de auth (donde SSH registra los intentos)
sudo tail -f /var/log/auth.log
tail -f /var/log/fail2ban.log mostrando las acciones de ban
tail -f /var/log/fail2ban.log — registro de bans y acciones en tiempo real
📌 Resumen del flujo completo: Fail2Ban monitoriza logs → usa expresiones regulares para detectar ataques → aplica reglas de firewall automáticas. Tres herramientas, una cadena de defensa sólida.