Frena a los bots con Fail2Ban
Básico
Los pasos marcados en azul cambian según tu sistema.
Abre el registro de SSH de cualquier servidor con IP pública y lo verás: intentos de entrada a todas horas, con usuarios como admin, test u oracle y contraseñas de diccionario. Nadie te está atacando a ti en particular; son programas que recorren internet entera, y lo seguirán haciendo.
Si entras solo con claves (SSH a fondo explica cómo), no tienen nada que adivinar. Pero siguen ahí: llenan los registros, gastan recursos y esperan a que un día algo quede mal configurado. Fail2Ban les cierra el paso. Lee los registros, cuenta los fallos de cada dirección y, cuando una pasa de la raya, la bloquea en el cortafuegos durante un tiempo. Sin que tengas que hacer nada.
La defensa más fuerte es no exponer SSH. Si te lo puedes permitir, deja el puerto cerrado al público y entra a través de una VPN como WireGuard. Fail2Ban no sustituye eso, pero es mucho más sencillo y protege igual cualquier otro servicio con contraseña.
Lo que necesitas
Un servidor con un usuario con sudo y un cortafuegos en marcha; si aún no, sigue los primeros pasos de un servidor Linux. Para la prueba final viene bien una segunda máquina con otra IP (un móvil con datos y una app de terminal también vale): la idea es que la bloqueada sea ella y no tú.
Paso 1: instalar
Ubuntu
sudo apt update
sudo apt install fail2ban
Debian
Además de Fail2Ban, instala python3-systemd: Debian 12 ya no escribe los accesos en /var/log/auth.log, sino en el diario de systemd, y este módulo es el que permite a Fail2Ban leerlo.
sudo apt update
sudo apt install fail2ban python3-systemd
AlmaLinux / Rocky
Fail2Ban vive en EPEL, el repositorio de paquetes extra para la familia Red Hat. Actívalo e instala también la integración con firewalld:
sudo dnf install epel-release
sudo dnf install fail2ban fail2ban-firewalld
No lo pongas en marcha todavía: antes, tu configuración.
Paso 2: tu configuración
Fail2Ban guarda todo en /etc/fail2ban. Ahí verás un jail.conf enorme con todas las opciones y sus valores por defecto. Léelo si te pica la curiosidad, pero no lo edites: cada actualización del paquete lo reemplaza. Tus cambios van en jail.local, que se lee después y tiene la última palabra. Solo necesita lo que quieras cambiar:
sudo nano /etc/fail2ban/jail.local
/etc/fail2ban/jail.local
[DEFAULT]
# Nunca bloquear el propio servidor ni tu IP de casa u oficina
ignoreip = 127.0.0.1/8 ::1 203.0.113.4
# Cinco fallos en diez minutos: una hora fuera
maxretry = 5
findtime = 10m
bantime = 1h
# Cada reincidencia, un bloqueo más largo
bantime.increment = true
[sshd]
enabled = true
Debian
En Debian 12, indica en la sección [sshd] que lea el diario de systemd:
/etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
Las piezas:
ignoreipes tu lista blanca. Si tienes IP fija, ponla: así un día de dedos torpes no acabarás bloqueado en tu propio servidor.maxretryyfindtimedefinen qué es pasarse de la raya: tantos fallos dentro de ese margen de tiempo.bantimees lo que dura el castigo. El valor de fábrica, diez minutos, apenas molesta a un bot; una hora ya es otra cosa.bantime.incrementhace que el bloqueo crezca con cada reincidencia. Los bots tozudos acaban fuera durante días.
Si SSH escucha en otro puerto, añade port = 4444 (o el tuyo) a la sección [sshd]; si no, Fail2Ban bloquearía el 22 y dejaría abierto el que usas.
Cárceles para otros servicios
Cada sección como [sshd] es una cárcel: la vigilancia de un servicio. Detrás de cada una hay un filtro en /etc/fail2ban/filter.d con los patrones que delatan un intento fallido en sus registros. Echa un vistazo a todos los que trae:
ls /etc/fail2ban/filter.d
Casi todos tienen ya su cárcel preparada (y apagada) en jail.conf. Para encender una, basta con nombrarla en tu jail.local. Por ejemplo, si proteges una zona de tu web con contraseña en Nginx:
/etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
Paso 3: ponerlo en marcha
sudo systemctl enable --now fail2ban
Comprueba que está vivo y qué cárceles vigila:
sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
Si no arranca, el motivo suele ser un error de escritura en jail.local o un registro que no encuentra. Míralo con sudo journalctl -u fail2ban -n 50.
Paso 4: comprobar que funciona
Desde la segunda máquina, intenta entrar varias veces con un usuario inventado y contraseñas al azar:
ssh nadie@203.0.113.10
Al cabo de unos cuantos intentos, el servidor dejará de contestar a esa máquina: la conexión se quedará colgada o será rechazada de inmediato. En el servidor, pregunta a Fail2Ban:
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| `- Total failed: 5
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 198.51.100.7
Ahí está tu segunda máquina. Para liberarla sin esperar:
sudo fail2ban-client set sshd unbanip 198.51.100.7
Guárdate este último comando: es el que necesitarás el día que alguien de tu equipo se bloquee a sí mismo.
Listo
Tu servidor se defiende solo: quien falla demasiado se queda fuera, y quien insiste, cada vez más tiempo. Con unas líneas más en jail.local puedes extender esa protección a tu web, tu correo o cualquier servicio que pida contraseña.
Fail2Ban es una capa más, no la única. Entrar solo con claves (SSH a fondo) y abrir solo lo imprescindible (el cortafuegos con UFW) siguen siendo la base.
