¿Cómo Instalar FreeBSD en un VPS Paso a Paso: Guía Completa" class="internal-post-link">Cómo Instalar y Configurar un Servidor Web en un VPS Cloud en 2025: Guía Completa" class="internal-post-link">Cómo instalar y configurar Fail2ban en un VPS Ubuntu?

Proteger tu VPS de accesos no autorizados es una tarea de vital importancia. Fail2ban es una herramienta poderosa que escanea los registros en busca de actividades sospechosas, como intentos fallidos de inicio de sesión, y bloquea automáticamente las direcciones IP desde las que provienen estos intentos. En este artículo, analizaremos en detalle el proceso de instalación y configuración de Fail2ban en un VPS con Ubuntu, para proporcionar una capa adicional de seguridad para tu servidor.

Cubriremos todas las etapas, desde la instalación del paquete Fail2ban hasta la configuración de filtros para proteger contra diversos tipos de ataques. Aprenderás a definir tus propias reglas de bloqueo y a adaptar Fail2ban a las necesidades específicas de tu servidor. Esta guía está dirigida tanto a principiantes como a usuarios experimentados de Linux que buscan mejorar la seguridad de sus VPS.

Contenido

Instalación de Fail2ban

El primer paso para proteger tu VPS es instalar Fail2ban. Ubuntu proporciona el paquete Fail2ban en sus repositorios estándar, lo que simplifica enormemente el proceso de instalación.

Para empezar, actualiza la lista de paquetes para asegurarte de tener las versiones más recientes:
sudo apt update
Este comando actualizará la información sobre los paquetes disponibles de los repositorios especificados en tu sistema.
VPS Hosting

Servidores virtuales con recursos garantizados

Elegir VPS

Luego, instala Fail2ban:
sudo apt install fail2ban
Este comando descargará e instalará Fail2ban y todas las dependencias necesarias. Durante la instalación, es posible que se te pida que confirmes la instalación del paquete. Responde afirmativamente presionando «Y» y Enter.

Una vez finalizada la instalación, Fail2ban se iniciará automáticamente. Puedes verificar su estado con el siguiente comando:
sudo systemctl status fail2ban
La salida mostrará si el servicio Fail2ban está activo, su tiempo de funcionamiento y los últimos registros. Si el servicio no está en funcionamiento, puedes iniciarlo manualmente:

sudo systemctl start fail2ban
Y para asegurarte de que se inicie automáticamente al arrancar el sistema:

sudo systemctl enable fail2ban
Ejemplo 1: Actualización e instalación de Fail2ban.

sudo apt update && sudo apt install fail2ban
Este comando combina la actualización de la lista de paquetes y la instalación de Fail2ban en una sola línea, lo que hace que el proceso sea un poco más rápido.

Ejemplo 2: Verificación de la versión de Fail2ban.

fail2ban-client --version
Este comando mostrará la versión de Fail2ban instalada. Esto es útil para rastrear las actualizaciones de seguridad y la compatibilidad con otras aplicaciones.

Ejemplo 3: Visualización del registro de Fail2ban.

sudo tail -f /var/log/fail2ban.log
Este comando muestra las últimas líneas del archivo de registro de Fail2ban en tiempo real. Esto te permite rastrear qué direcciones IP se están bloqueando y por qué. La opción `-f` significa «follow», es decir, el comando continuará mostrando nuevas líneas a medida que se agreguen al archivo.

Configuración básica de Fail2ban

Después de una instalación exitosa, es necesario configurar Fail2ban para proteger eficazmente tu servidor. La configuración de Fail2ban se gestiona a través de los archivos `jail.conf` y `jail.local`. Es importante comprender que `jail.conf` es el archivo de configuración predeterminado y no se recomienda modificarlo directamente, ya que las actualizaciones del paquete pueden sobrescribir tus cambios. En su lugar, debes utilizar el archivo `jail.local` para redefinir los parámetros de `jail.conf`.

Primero, crea el archivo `jail.local` a partir de `jail.conf`:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Luego, abre `jail.local` para editarlo:

sudo nano /etc/fail2ban/jail.local
En este archivo, puedes cambiar varios parámetros, como el tiempo de bloqueo, la cantidad de intentos antes del bloqueo y la dirección de correo electrónico para las notificaciones. Consideremos algunos parámetros importantes:

  • `bantime`: Define durante cuántos segundos se bloqueará la dirección IP. Por ejemplo, `bantime = 600` significa un bloqueo de 10 minutos.
  • `findtime`: Define durante cuánto tiempo Fail2ban rastreará los intentos de inicio de sesión. Por ejemplo, `findtime = 600` significa que Fail2ban tendrá en cuenta los intentos de inicio de sesión realizados en los últimos 10 minutos.
  • `maxretry`: Define cuántos intentos fallidos de inicio de sesión son permisibles durante `findtime` antes de bloquear la dirección IP. Por ejemplo, `maxretry = 3` significa que después de tres intentos fallidos de inicio de sesión, la dirección IP se bloqueará.
  • `destemail`: Especifica la dirección de correo electrónico a la que se enviarán las notificaciones de bloqueo.
  • `sendername`: El nombre del remitente en los correos electrónicos de notificación.
Por ejemplo, para cambiar el tiempo de bloqueo a 1 hora (3600 segundos), la cantidad de intentos antes del bloqueo a 5 y especificar la dirección de correo electrónico para las notificaciones, realiza los siguientes cambios en `jail.local`:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
destemail = your_email@example.com
sendername = Fail2ban
Reemplaza `your_email@example.com` con tu dirección de correo electrónico real.

Después de realizar los cambios, guarda el archivo y reinicia Fail2ban para aplicar la nueva configuración:

sudo systemctl restart fail2ban
Ejemplo 1: Cambio del tiempo de bloqueo y la cantidad de intentos.

[DEFAULT]
bantime = 7200  ; Bloqueo durante 2 horas
maxretry = 4    ; 4 intentos fallidos
Este ejemplo muestra cómo cambiar el tiempo de bloqueo a 2 horas y permitir solo 4 intentos fallidos de inicio de sesión.

Ejemplo 2: Habilitación del envío de notificaciones por correo electrónico.

[DEFAULT]
destemail = admin@example.com
sendername = Fail2ban VPS
mta = sendmail
action = %(action_mwl)s
Este ejemplo habilita el envío de notificaciones a la dirección `admin@example.com` con el nombre del remitente «Fail2ban VPS». `mta = sendmail` indica que se utiliza el servidor de correo sendmail (o compatible), y `action = %(action_mwl)s` define la acción que se realizará al bloquear, incluyendo el envío de una notificación por correo electrónico con información sobre el evento. Asegúrate de que tu servidor tenga configurado un servidor de correo (por ejemplo, postfix o sendmail) para enviar notificaciones.

Ejemplo 3: Especificación de otro archivo de registro para el monitoreo (no recomendado sin una necesidad particular).

[DEFAULT]
logfile = /var/log/my_custom_log.log
Este ejemplo muestra cómo cambiar el archivo de registro que Fail2ban monitoreará. Atención: Esto solo debe hacerse si sabes exactamente lo que estás haciendo y si el archivo de registro estándar no contiene la información necesaria. La especificación incorrecta del archivo de registro puede provocar que Fail2ban no funcione.

Configuración de Jail.local para la protección SSH

Fail2ban utiliza «jails» (prisiones) para definir las reglas de bloqueo para varios servicios. Cada prisión está asociada con un servicio específico (por ejemplo, SSH, Apache, Nginx) y define qué registros deben monitorearse, qué patrones deben buscarse y qué acciones deben tomarse al detectar actividad sospechosa. De forma predeterminada, en el archivo `jail.conf` ya se definen algunas prisiones, pero a menudo están desactivadas. Para activar y configurar la prisión para la protección SSH, debes realizar cambios en el archivo `jail.local`.

Abre el archivo `jail.local` para editarlo:

sudo nano /etc/fail2ban/jail.local
Encuentra la sección `[sshd]` (o agrégala si no existe) y realiza los siguientes cambios:

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
Analicemos cada línea:

  • `enabled = true`: Habilita la prisión sshd.
  • `port = ssh`: Especifica el puerto que Fail2ban protegerá. En este caso, es el puerto SSH estándar (22). Si utilizas un puerto SSH no estándar, reemplaza `ssh` con el número de tu puerto (por ejemplo, `port = 2222`).
  • `logpath = %(sshd_log)s`: Especifica la ruta al archivo de registro SSH. `%(sshd_log)s` es una variable definida en `jail.conf` que apunta al archivo de registro SSH estándar.
  • `backend = systemd`: Especifica cómo Fail2ban rastreará los cambios en el archivo de registro. `systemd` es el sistema de inicialización utilizado en Ubuntu. Otros valores posibles: `polling`, `gamin`, `inotify`. `systemd` suele ser la forma más eficaz y fiable.
Después de realizar los cambios, guarda el archivo y reinicia Fail2ban:

sudo systemctl restart fail2ban
Ahora Fail2ban monitoreará el archivo de registro SSH y bloqueará las direcciones IP desde las que provienen los intentos fallidos de inicio de sesión.

Importante: Si utilizas un puerto SSH no estándar, debes especificarlo en la configuración de la prisión sshd. De lo contrario, Fail2ban no monitoreará el puerto correcto y no podrá proteger tu servidor de ataques.

Ejemplo 1: Configuración de Fail2ban para proteger SSH en un puerto no estándar.

[sshd]
enabled = true
port = 2222
logpath = %(sshd_log)s
backend = systemd
En este ejemplo, Fail2ban protegerá SSH en el puerto 2222.

Ejemplo 2: Habilitación de la protección contra ataques de fuerza bruta en SSH mediante filtros.

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
filter = sshd
En este ejemplo, se agrega la línea `filter = sshd`. `filter` define qué filtro se utilizará para analizar el archivo de registro. Los filtros son archivos que contienen expresiones regulares que Fail2ban utiliza para buscar actividad sospechosa en los registros. En este caso, se utiliza el filtro `sshd`, que ya está definido en Fail2ban y contiene reglas para detectar ataques de fuerza bruta en SSH. El uso de filtros permite determinar con mayor precisión qué intentos de inicio de sesión son sospechosos y evitar el bloqueo de usuarios legítimos.

Ejemplo 3: Aumento del tiempo de bloqueo para SSH.

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
bantime = 86400 ; Bloqueo durante 24 horas
En este ejemplo, el tiempo de bloqueo para SSH se aumenta a 24 horas (86400 segundos). Esto puede ser útil para proteger contra ataques persistentes.

Pruebas y verificación del funcionamiento de Fail2ban

Después de instalar y configurar Fail2ban, es necesario verificar su funcionalidad para asegurarte de que protege eficazmente tu servidor. Hay varias maneras de hacerlo:

  • Verificación del estado de la prisión: Puedes verificar el estado de una prisión específica con el comando `fail2ban-client`.
  • Análisis del registro de Fail2ban: La visualización del registro de Fail2ban te permite ver qué direcciones IP se han bloqueado y por qué.
  • Emulación de un ataque: Puedes emular intentos fallidos de inicio de sesión para verificar que Fail2ban bloquea correctamente la dirección IP.
Para verificar el estado de la prisión `sshd`, ejecuta el siguiente comando:

sudo fail2ban-client status sshd
Este comando mostrará información sobre la prisión `sshd`, incluyendo:

  • Estado (habilitada o deshabilitada)
  • Cantidad de direcciones IP bloqueadas
  • Lista de direcciones IP bloqueadas
Si la prisión funciona correctamente y bloquea las direcciones IP, verás una lista de direcciones IP bloqueadas. Si la lista está vacía, significa que no se ha bloqueado ninguna dirección IP. Esto puede deberse a que nadie ha intentado acceder a tu servidor de forma no autorizada, o porque Fail2ban no está configurado correctamente.

Para ver el registro de Fail2ban, ejecuta el siguiente comando:

sudo tail -f /var/log/fail2ban.log
En el registro, verás entradas sobre todos los eventos relacionados con Fail2ban, incluyendo el inicio y la detención del servicio, la activación y desactivación de prisiones, así como el bloqueo y desbloqueo de direcciones IP. El análisis del registro te permite comprender cómo funciona Fail2ban e identificar posibles problemas.

Para emular un ataque y verificar que Fail2ban bloquea correctamente la dirección IP, puedes intentar conectarte varias veces a tu servidor por SSH con una contraseña incorrecta. Después de varios intentos fallidos, tu dirección IP debe estar bloqueada. Puedes verificar esto con el comando `fail2ban-client status sshd` o visualizando el registro de Fail2ban.

Importante: Ten cuidado al emular un ataque para no bloquearte durante mucho tiempo. Puedes reducir el tiempo de bloqueo para las pruebas y luego volver a su valor normal.

Ejemplo 1: Desbloqueo manual de una dirección IP.

sudo fail2ban-client set sshd unbanip 192.168.1.100
Este comando desbloquea la dirección IP 192.168.1.100 en la prisión `sshd`. Esto puede ser útil si accidentalmente has bloqueado tu propia dirección IP.

Ejemplo 2: Verificación de las reglas iptables creadas por Fail2ban.

sudo iptables -L FAIL2BAN-SSHD
Este comando muestra las reglas iptables creadas por Fail2ban para la prisión `sshd`. Iptables es un firewall de Linux que Fail2ban utiliza para bloquear direcciones IP. La salida del comando mostrará una lista de reglas que bloquean el tráfico entrante desde direcciones IP bloqueadas. Esto te permite asegurarte de que Fail2ban configura correctamente el firewall para bloquear el tráfico sospechoso.

Ejemplo 3: Recarga de Fail2ban sin reiniciar todo el sistema.

sudo fail2ban-client reload
Este comando recarga la configuración de Fail2ban sin reiniciar todo el servicio. Esto es más rápido que reiniciar y te permite aplicar cambios de configuración sin interrumpir el funcionamiento de Fail2ban.

Desbloqueo automático de direcciones IP

En algunos casos, puede ser necesario desbloquear automáticamente las direcciones IP después de un período de tiempo determinado. Fail2ban, de forma predeterminada, bloquea las direcciones IP durante el tiempo especificado (`bantime`), pero a veces es necesario que una dirección IP se desbloquee automáticamente antes, por ejemplo, si el bloqueo se produjo por error o si la dirección IP dinámica ha cambiado.

Para implementar el desbloqueo automático, se pueden utilizar varios enfoques:

  • Establecimiento de un tiempo de bloqueo corto: La forma más sencilla es establecer un valor pequeño para el parámetro `bantime`. Sin embargo, esto puede hacer que tu servidor sea más vulnerable a los ataques, ya que un atacante podría repetir los intentos de inicio de sesión en un corto período de tiempo.
  • Uso de scripts para el desbloqueo automático: Un enfoque más complejo, pero también más flexible, es el uso de scripts que desbloquean automáticamente las direcciones IP después de un período de tiempo determinado.
Consideremos un ejemplo de uso de un script para el desbloqueo automático. Crea un script, por ejemplo, `/usr/local/bin/fail2ban-auto-unban.sh`, con el siguiente contenido:

#!/bin/bash

# Tiempo en segundos, después del cual se deben desbloquear las direcciones IP
UNBAN_TIME=3600

# Prisiones para las que se debe realizar el desbloqueo automático
JAILS="sshd"

for JAIL in $JAILS; do
  fail2ban-client status $JAIL | grep "Banned IP list:" | awk '{print $4}' | tr -d '[]' | tr ',' '\n' | while read IP; do
    BAN_TIME=$(fail2ban-client get $JAIL banip $IP | grep "Ban since" | awk '{print $3 " " $4 " " $5 " " $6 " " $7}')
    BAN_TIMESTAMP=$(date -d "$BAN_TIME" +%s)
    CURRENT_TIMESTAMP=$(date +%s)
    ELAPSED_TIME=$((CURRENT_TIMESTAMP - BAN_TIMESTAMP))

    if [ "$ELAPSED_TIME" -gt "$UNBAN_TIME" ]; then
      fail2ban-client set $JAIL unbanip $IP
      echo "$(date) - Desbloqueada la IP $IP en la prisión $JAIL" >> /var/log/fail2ban-auto-unban.log
    fi
  done
done
Este script realiza las siguientes acciones:

  • Define el tiempo en segundos después del cual se deben desbloquear las direcciones IP (`UNBAN_TIME`).
  • Define una lista de prisiones para las que se debe realizar el desbloqueo automático (`JAILS`).
  • Recorre la lista de direcciones IP bloqueadas para cada prisión.
  • Define la hora de bloqueo de la dirección IP.
  • Si el tiempo de bloqueo supera el valor especificado (`UNBAN_TIME`), desbloquea la dirección IP.
  • Guarda información sobre el desbloqueo en un archivo de registro.
Haz que el script sea ejecutable:

sudo chmod +x /usr/local/bin/fail2ban-auto-unban.sh
Luego, configura cron para que el script se ejecute automáticamente, por ejemplo, cada hora:

sudo crontab -e
Agrega la siguiente línea al archivo cron:

0 * * * * /usr/local/bin/fail2ban-auto-unban.sh
Esta línea indica que el script debe ejecutarse al comienzo de cada hora.

Importante: Este script es un ejemplo y puede ser necesario adaptarlo a tus necesidades específicas. Por ejemplo, es posible que debas cambiar la lista de prisiones, el formato del archivo de registro o agregar comprobaciones adicionales.

Ejemplo 1: Configuración del desbloqueo automático a través de cron utilizando un `bantime` corto.

[DEFAULT]
bantime = 300 ; Bloqueo durante 5 minutos

; Ejecución del script una vez por minuto para el desbloqueo

  • * * * * /usr/local/bin/fail2ban-auto-unban.sh
Este ejemplo muestra cómo establecer un tiempo de bloqueo corto (5 minutos) y configurar cron para ejecutar el script una vez por minuto. El script verificará las direcciones IP bloqueadas y las desbloqueará si han estado bloqueadas durante más de 5 minutos. Este enfoque es fácil de implementar, pero puede ser menos seguro que usar un tiempo de bloqueo más largo y un script más complejo.

Ejemplo 2: Desbloqueo de direcciones IP solo para determinadas prisiones.

JAILS="sshd apache"
En el script `fail2ban-auto-unban.sh`, cambia la variable `JAILS` para especificar solo aquellas prisiones para las que se debe realizar el desbloqueo automático. En este ejemplo, el desbloqueo automático solo se realizará para las prisiones `sshd` y `apache`.

Ejemplo 3: Registro de las acciones del script en un archivo separado.

echo "$(date) - Desbloqueada la IP $IP en la prisión $JAIL" >> /var/log/fail2ban-auto-unban.log
Esta línea en el script `fail2ban-auto-unban.sh` guarda información sobre el desbloqueo de la dirección IP en el archivo `/var/log/fail2ban-auto-unban.log`. Esto permite rastrear qué direcciones IP se han desbloqueado y cuándo. Revisa este archivo de registro con regularidad para identificar posibles problemas.