Fail2ban es una herramienta en Python que monitoriza registros y aplica bloqueos automáticos contra IPs que realizan intentos repetidos de acceso indebido. En esta guía práctica aprenderás a instalar y configurar fail2ban en Ubuntu, proteger el servicio SSH con un jail real, elegir la acción de baneo adecuada (nftables/iptables/ufw), comprobar que funciona y resolver problemas comunes.
Requisitos previos y compatibilidad
Necesitas un servidor Ubuntu con conexión a Internet y privilegios sudo. Esta guía cubre Ubuntu 22.04 y 24.04 (paquetes oficiales). En Ubuntu actuales el paquete está disponible en los repositorios y la versión empaquetada y valores por defecto pueden variar entre releases; en Ubuntu 24.04 el paquete se distribuye con ajustes para nftables y lectura por systemd en el fichero /etc/fail2ban/jail.d/defaults-debian.conf. (packages.ubuntu.com
Instalación rápida
sudo apt update
sudo apt install fail2ban
# recomendable si quieres que fail2ban lea el journal de systemd
sudo apt install python3-systemd
sudo systemctl enable --now fail2ban
Instalar desde los repos oficiales es la forma soportada y suficiente en la mayoría de escenarios. Si usas python3-systemd facilitas al servicio la lectura del journal (útil en distribuciones recientes donde muchos logs van al journal en lugar de a ficheros). (fail2ban.dev
Comprobar el servicio y comandos básicos
Tras instalar, comprueba el servicio y el estado de los jails con:
sudo systemctl status fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
Advertencia: las acciones de baneo pueden bloquearte si pruebas desde la misma IP que quieres banear. Para pruebas, usa otra máquina o banea/desbanear manualmente con fail2ban-client.
Estructura de configuración: .conf vs .local y /etc/fail2ban/jail.d/
No edites los archivos *.conf provistos por el paquete; en su lugar crea overrides en /etc/fail2ban/jail.local o mejor en ficheros dentro de /etc/fail2ban/jail.d/ (uno por servicio). El paquete de Ubuntu instala un fichero /etc/fail2ban/jail.d/defaults-debian.conf con valores por defecto (por ejemplo, el jail de sshd activado en algunas releases). Esto facilita upgrades sin perder tus ajustes. (fail2ban.dev
Configurar un jail práctico: proteger SSH (paso a paso)
- Crear un fichero específico para SSH:
sudo nano /etc/fail2ban/jail.d/sshd.local. - Pegar una configuración mínima (ejemplo):
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 3600 # whitelist = 192.0.2.0/24 # sustituir por tu red de gestión - Guardar y reiniciar fail2ban:
sudo systemctl restart fail2ban. - Verificar:
sudo fail2ban-client status sshddebería mostrar el jail activo y la lista de IPs baneadas (si las hay).
Explicación de parámetros clave: maxretry es el número de intentos fallidos permitidos; findtime es la ventana en segundos donde se cuentan esos intentos; bantime es la duración del baneo en segundos (puedes usar sufijos como 1h). Ajusta según el riesgo y la tolerancia de tu entorno.
Banaction: iptables vs nftables vs ufw — cómo elegir
La acción que aplica el baneo (banaction) depende del firewall del sistema y de la versión de fail2ban. En Ubuntu 24.04 el paquete suele usar banaction = nftables por defecto y fail2ban crea una tabla propia (por ejemplo inet f2b-table) con sets por jail, lo que es eficiente y evita interferir con UFW/iptables. Si tu sistema usa UFW y prefieres integrarlo con las reglas existentes puedes elegir banaction = ufw. En sistemas más antiguos o si necesitas reglas legacy, existen acciones basadas en iptables. Elige nftables si tu Ubuntu usa nft por defecto; usa ufw si gestionas el cortafuegos mediante UFW y quieres que los bans aparezcan como reglas UFW. (fail2ban.dev
Ejemplo: forzar UFw como banaction
[DEFAULT]
banaction = ufw
Tras cambiar la acción reinicia fail2ban y verifica que las reglas/locks aparecen en sudo ufw status o con sudo nft list ruleset según corresponda.
Gestión de bans: listar, banear y desbanear
sudo fail2ban-client status # lista jails
sudo fail2ban-client status sshd # detalles de sshd (IPs baneadas)
# banear una IP manualmente en el jail sshd
sudo fail2ban-client set sshd banip 198.51.100.23
# desbanear
sudo fail2ban-client set sshd unbanip 198.51.100.23
Si usas nftables puedes inspeccionar con sudo nft list set inet f2b-table sshd (el nombre puede variar). Para ufw, las entradas aparecerán en su listado. Usa estos comandos para recuperar accesos bloqueados por error.
Reglas avanzadas y recomendaciones
- Whitelist: añade tus redes de gestión (oficina, VPN) a
ignoreip = 127.0.0.1/8 203.0.113.0/24. - Recidive: habilita un jail
recidivepara detectar repetidores a largo plazo (lee /etc/fail2ban/jail.conf o crea un fichero en jail.d). - Bantime adaptativo: considera bantime creciente (por ejemplo 1h, 1d, 1w) en combinación con recidive para ataques persistentes.
- Limita el número de reglas por firewall: si tu servidor recibe muchos intentos, nftables con sets es más eficiente que añadir miles de reglas iptables.
Monitorización y logs; troubleshooting
Fail2ban escribe su propio log en /var/log/fail2ban.log y, dependiendo del backend, lee logs de servicios desde ficheros (por ejemplo /var/log/auth.log) o desde el journal. En Ubuntu recientes la configuración del paquete tiende a usar backend = systemd para leer mensajes desde journalctl; si haces esto instala python3-systemd para evitar que fail2ban no encuentre entradas por usar solo journal. Para ver logs de fail2ban usa:
sudo tail -f /var/log/fail2ban.log
sudo journalctl -u fail2ban -f
sudo journalctl -t sshd --since "5 minutes ago"
Errores comunes y soluciones:
- Fail2ban no está baneando: comprueba la action (nftables/ufw), que el filtro detecte los patrones en los logs y que el backend (file vs systemd) esté correctamente configurado. Reinicia fail2ban tras cambios en filtros o acciones. (fail2ban.dev
- Mis reglas desaparecen tras reiniciar UFW o nftables: algunos reinicios flushean las tablas; configura fail2ban para reaplicar reglas o usa una tabla independiente (nftables) creada por fail2ban para minimizar este problema. (fail2ban.dev
- Fail2ban no ve logs en sistemas que usan solo journal: instala
python3-systemdy usabackend = systemdologtarget = SYSTEMD-JOURNALcuando corresponda. (fail2ban.dev
Buenas prácticas y medidas complementarias
- Usa autenticación por claves SSH y deshabilita el acceso por contraseña cuando sea posible. Ver guía práctica sobre claves SSH para reducir intentos: Cómo configurar acceso SSH con claves públicas en Ubuntu.
- Considera cambiar el puerto por defecto y combinar con UFW para reducir ruido: Cómo cambiar el puerto SSH en Ubuntu y ajustar UFW.
- Si usas UFW como firewall principal, integra fail2ban usando
banaction = ufwen lugar de iptables/nft si prefieres que los bans se vean medianteufw status. - Realiza pruebas desde otra IP para evitar bloquearte y documenta tus whitelist.
Resumen rápido y checklist de despliegue
- Instalar:
sudo apt install fail2bany opcionalmentepython3-systemd. (fail2ban.dev - No tocar ficheros .conf de stock; usar
/etc/fail2ban/jail.d/. - Configurar
[sshd], ajustarmaxretry,findtime,bantime, yignoreip. - Elegir banaction acorde a tu firewall (nftables por defecto en Ubuntu 24.04; ufw si usas UFW). (fail2ban.dev
- Comprobar con
systemctl status fail2banyfail2ban-client status.
Preguntas frecuentes
- ¿Puedo usar fail2ban con UFW y nftables a la vez? Sí: fail2ban puede usar diferentes acciones. En Ubuntu 24.04 el paquete usa nftables por defecto; si quieres integración directa con UFW cambia la action a
ufw. Ten en cuenta que recargar UFW puede afectar reglas externas. - ¿Fail2ban protege contra ataques distribuidos? No completamente: fail2ban es eficaz contra intentos repetidos desde la misma IP, pero ataques distribuidos (muchas IPs diferentes) requieren protección adicional (WAF, rate limiting en la infraestructura, autenticación fuerte y monitoreo).
- ¿Puedo bloquear rangos IP grandes? Sí, pero hazlo con precaución — usar sets de nftables o reglas aggregate es más escalable que añadir muchas reglas individuales.
Si necesitas que adapte los ejemplos a tu versión exacta de Ubuntu (p. ej. 22.04 vs 24.04) y al firewall que usas, indícame la salida de lsb_release -a y sudo nft --version o sudo ufw status verbose y preparo los comandos concretos.
