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
maxretryfallos enfindtimesegundos → la IP queda baneadabantimesegundos
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