1. Introducción

El servicio SSH es uno de los principales objetivos de ataques automatizados en servidores expuestos a Internet. Es habitual recibir miles de intentos de autenticación fallidos procedentes de bots que prueban contraseñas o usuarios comunes.

Aunque el uso de claves SSH reduce significativamente el riesgo, estos intentos siguen:

  • Generando ruido en los logs

  • Consumiendo recursos

  • Ocultando intentos de acceso legítimos maliciosos

Para mitigar este problema, se utiliza fail2ban, una herramienta diseñada para bloquear automáticamente direcciones IP que muestran un comportamiento sospechoso.

2. ¿Qué es fail2ban y cómo funciona?

Fail2ban es una herramienta de seguridad que analiza los logs del sistema y aplica reglas de firewall dinámicas cuando detecta patrones de ataque, como múltiples intentos fallidos de autenticación.

En el caso de SSH, su funcionamiento es el siguiente:

  1. Fail2ban monitoriza los logs del servicio SSH.

  2. Detecta intentos de autenticación fallidos repetidos desde una misma IP.

  3. Superado un umbral configurable, la IP es bloqueada temporalmente mediante el firewall.

  4. Tras un tiempo determinado, el bloqueo se elimina automáticamente.

Este enfoque permite reaccionar en tiempo real ante ataques de fuerza bruta sin intervención manual.

3. Instalación de fail2ban

En sistemas basados en Debian / Ubuntu:

sudo apt update
sudo apt install fail2ban -y

Una vez instalado, el servicio se inicia automáticamente. Podemos comprobar su estado con:

sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service                                                    (1)
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: enabled) (2)
     Active: active (running) since Mon 2025-12-15 23:20:53 UTC; 8s ago                  (3)
       Docs: man:fail2ban(1)                                                             (4)
   Main PID: 1718 (fail2ban-server)                                                      (5)
      Tasks: 5 (limit: 2320)                                                             (6)
     Memory: 20.5M (peak: 21.0M)                                                         (7)
        CPU: 313ms                                                                       (8)
     CGroup: /system.slice/fail2ban.service                                              (9)
             └─1718 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
1 El servicio se llama fail2ban.service y se corresponde al servidor OpenSSH.
2 El archivo unit de systemd (/usr/lib/systemd/system/fail2ban.service) está cargado, y el servicio está configurado como habilitado para iniciarse automáticamente durante el arranque del sistema (enabled). El valor de preset: enabled indica que según la política de presets del sistema definida en /usr/lib/systemd/system-preset/, el servicio debe estar habilitado por defecto.
3 El servicio está en active (running).
4 La documentación del servicio está disponible mediante el comando man fail2ban.
5 El PID principal del proceso fail2ban-server es 1718.
6 El servicio está utilizando 5 hilos y el límite máximo permitido por systemd para este servicio es de 2320.
7 Uso de memoria RAM del servicio.
8 Tiempo total de CPU consumido por el servicio desde su inicio.
9 CGroup (Control Group) al que pertenece el servicio.

4. Configuración básica para proteger SSH

Fail2ban utiliza un sistema de jails para definir cómo debe protegerse un servicio concreto.

Una jail es una unidad de configuración que indica a Fail2ban:

  • Qué servicio o aplicación se va a proteger.

  • Qué archivo o archivos de log deben analizarse.

  • Qué patrones de error deben considerarse intentos fallidos.

  • Cuántos intentos se permiten en un intervalo de tiempo.

  • Durante cuánto tiempo debe bloquearse una dirección IP.

Cada jail actúa de forma independiente, por lo que un mismo sistema puede tener múltiples jails activas al mismo tiempo, una por cada servicio que se desee proteger (SSH, servicios web, correo, etc.).


4.1 Jails predefinidas

Fail2ban incluye por defecto algunas jails predefinidas para servicios comunes, donde utilizan filtros ya existentes y suelen requerir únicamente su activación. Algunos ejemplos son:

  • sshd: Protege el servicio SSH.

  • apache-auth: Protege la autenticación de Apache.

  • nginx-http-auth: Protege la autenticación de Nginx.

  • postfix: Protege el servicio de correo Postfix.


4.2 Archivo de configuración recomendado

Fail2ban utiliza varios archivos de configuración. El archivo principal, jail.conf, contiene la configuración por defecto y no debe modificarse directamente, ya que puede ser sobrescrito durante actualizaciones del sistema o del propio Fail2ban.

Para realizar configuraciones personalizadas de forma segura, se debe utilizar el archivo jail.local, que tiene prioridad sobre jail.conf. Cualquier parámetro definido en jail.local sobrescribirá el valor correspondiente definido en jail.conf.

Si el archivo jail.local no existe, se puede crear copiando el archivo de configuración por defecto:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Este enfoque permite mantener una separación clara entre la configuración original del sistema y las personalizaciones realizadas por el administrador, facilitando el mantenimiento y evitando la pérdida de cambios tras actualizaciones.


4.3 Jail para SSH

Para proteger el servicio SSH, se debe definir una jail específica asociada al demonio sshd. Esta jail se encargará de monitorizar los logs de autenticación y aplicar bloqueos automáticos cuando se detecten intentos fallidos repetidos desde una misma dirección IP.

Si buscamos la sección que hace referenica a la jail para SSH en el archivo /etc/fail2ban/jail.conf, encontraremos una sección similar a esta:

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
port    = ssh                   (1)
logpath = %(sshd_log)s          (2)
backend = %(sshd_backend)s      (3)
1 port: Puerto del servicio SSH. Puede ser un número distinto de 22.
2 logpath: Ruta completa del archivo de log que se va a analizar
3 backend: Backend utilizado para leer los logs. En sistemas modernos suele ser systemd.

Para realizar una configuración básica de esta jail vamos a editar el archivo /etc/fail2ban/jail.local y vamos a añadir los siguientes parámetros:

[sshd]
enabled  = true                 (1)
port     = ssh                  (2)
filter   = sshd                 (3)
logpath  = /var/log/auth.log    (4)
maxretry = 5                    (5)
findtime = 10m                  (6)
bantime  = 1h                   (7)
1 enabled: Activa la protección para SSH.
2 port: Puerto del servicio SSH. Puede ser un número distinto de 22.
3 filter: Nombre del filtro que se va a utilizar. En este caso el filtro sshd ya viene predefinido y contiene las expresiones regulares necesarias para detectar intentos fallidos de SSH.
4 logpath: Ruta completa del archivo de log que se va a analizar. También se puede poner la variable %(sshd_log)s, que guarda la misma ruta.
5 maxretry: Número máximo de intentos fallidos permitidos. Si una dirección IP realiza maxretry intentos fallidos dentro del intervalo definido por findtime, será bloqueada. Un findtime muy largo combinado con un maxretry bajo puede provocar el bloqueo de IPs legítimas.
6 findtime: Intervalo de tiempo durante el cual Fail2ban contabiliza los intentos de conexión fallidos de una misma dirección IP.
7 bantime: Duración del bloqueo.

Podemos verificar que la sintaxis de la configuración es correcta ejecutando:

sudo fail2ban-client -t

5. Reiniciar Fail2ban y verificar el estado

Después de modificar la configuración de Fail2ban, es necesario reiniciar el servicio para que se apliquen los cambios.

sudo systemctl restart fail2ban

Comprueba que el jail de SSH está activo:

sudo fail2ban-client status

Nos mostrará una salida similar a esta:

Status
|- Number of jail:  1
`- Jail list:   sshd

En este caso, se indica que existe una jail activa, correspondiente al servicio SSH.

5.1 Ver estado del jail SSH

Para consultar el estado específico del jail sshd y ver las IPs bloqueadas podemos ejecutar:

sudo fail2ban-client status sshd

La salida mostrará información detallada en dos secciones: Filter y Actions. Donde podremos ver:

  • IPs que están bloqueadas.

  • Número total de bloqueos.

  • Estadísticas del jail.

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- File list:    /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.5.4

6. Desbloquear una IP manualmente

En determinadas situaciones, una dirección IP legítima puede ser bloqueada por Fail2Ban como consecuencia de múltiples intentos fallidos de autenticación. En estos casos, el bloqueo puede eliminarse manualmente utilizando el cliente de Fail2Ban.

Para desbloquear una dirección IP concreta en el jail sshd, se debe ejecutar el siguiente comando:

sudo fail2ban-client set sshd unbanip IP_A_DESBLOQUEAR

Ejemplo:

sudo fail2ban-client set sshd unbanip 192.168.5.4

Referencias