Protección básica frente a ataques con fail2ban

Introducción

fail2ban es un daemon que monitoriza los logs del sistema en busca de patrones de comportamiento malicioso (intentos de login fallidos, escaneos, etc.) y bloquea automáticamente las IPs atacantes mediante reglas de firewall temporales. Es especialmente eficaz contra ataques de fuerza bruta a SSH.

Instalación


apt install fail2ban

systemctl enable --now fail2ban
systemctl status fail2ban
          

Cómo funciona

  • Filtro: expresión regular que detecta intentos fallidos en un log
  • Jail: combinación de filtro + log a monitorizar + acción a tomar
  • Acción: lo que hace al detectar el patrón (normalmente bloquear con iptables/ufw/nftables)
  • Tras maxretry fallos en findtime segundos → la IP queda baneada bantime segundos

Configuración

Nunca editar /etc/fail2ban/jail.conf directamente (se sobreescribe al actualizar). Toda la configuración personalizada va en /etc/fail2ban/jail.local:


# /etc/fail2ban/jail.local

[DEFAULT]
# IP o rangos que nunca se banearán (localhost + red local)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

# Tiempo de ban en segundos (1 hora)
bantime  = 3600

# Ventana de tiempo en la que se cuentan los intentos (10 minutos)
findtime = 600

# Número de fallos antes de banear
maxretry = 5

# Backend para leer logs (auto detecta journald o fichero)
backend = auto

# Acción por defecto: bloquear con iptables
banaction = iptables-multiport


[sshd]
enabled  = true
port     = ssh
logpath  = %(sshd_log)s
maxretry = 3
bantime  = 86400    # 24 horas para SSH
          

# Aplicar cambios
systemctl restart fail2ban
          

Comandos de gestión


# Estado general de fail2ban
fail2ban-client status

# Estado de una jail concreta
fail2ban-client status sshd

# Ver IPs baneadas en sshd
fail2ban-client status sshd | grep "Banned IP"

# Desbanear una IP manualmente
fail2ban-client set sshd unbanip 203.0.113.42

# Banear una IP manualmente
fail2ban-client set sshd banip 203.0.113.42

# Recargar configuración sin reiniciar
fail2ban-client reload

# Ver el log de fail2ban
tail -f /var/log/fail2ban.log
          

Jails adicionales útiles

fail2ban incluye filtros predefinidos para muchos servicios. Añadir en jail.local:


# Nginx: peticiones inválidas (4xx)
[nginx-http-auth]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log

# Nginx: límite de rate (requiere configurar limit_req en nginx)
[nginx-limit-req]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log

# Apache
[apache-auth]
enabled  = true
port     = http,https
logpath  = %(apache_error_log)s

# Postfix (correo)
[postfix]
enabled  = true
port     = smtp,465,submission
logpath  = %(postfix_log)s
          

Usar UFW como acción de ban

En Ubuntu con UFW activo, es preferible usar UFW como backend de ban en lugar de iptables directamente:


# En /etc/fail2ban/jail.local, sección [DEFAULT]:
banaction = ufw

# En /etc/fail2ban/action.d/ufw.conf verificar que existe
# (Ubuntu lo incluye por defecto)
ls /etc/fail2ban/action.d/ufw.conf
          

Ban permanente para reincidentes

fail2ban soporta bans incrementales: cada vez que una IP reincide, el tiempo de ban se multiplica. Configurar en [DEFAULT]:


# Ban incremental: duplica el tiempo con cada reincidencia
bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 604800    # máximo 7 días
          

fail2ban es una primera línea de defensa eficaz y ligera. No reemplaza a un firewall bien configurado ni a una autenticación fuerte, pero reduce significativamente el ruido de los ataques automatizados y libera recursos del servidor.

Simulacros de examen 101-500 y 102-500

Índice de la sección

Índice del curso