Instalar Fail2ban en Debian 12 y que funcione.

Internet está lleno de gente con menos vergüenza que un gato en una matanza, así que imagino que mi Raspberry Pi, al estar las 24 horas conectada a Internet, estará siendo atacada regularmente. Por este motivo, he decidido instalar Fail2ban.

Si logras poner este tutorial en marcha, descubrirás que no estoy exagerando.

¿Qué es Fail2ban?

Fail2ban es una aplicación que te ayudará a proteger tu servidor contra ataques maliciosos y con la que podrás mantener tus datos seguros.

Fail2ban evitará los accesos de bots, es decir, de máquinas automatizadas que realizan intentos de acceso indiscriminados a los servidores. Este tipo de bots son muy comunes en Internet y simplemente se dedican a intentar loguearse en los servidores, probando diferentes usuarios y claves de acceso, para autorizarse correctamente y tomar el control de la máquina.

Fail2ban se encarga de monitorizar los registros de acceso al servidor en busca de fallos de acceso e impidiendo nuevos intentos de login desde las direcciones IP involucradas, por un tiempo determinado.

Como instalar Fail2ban

Para instalar fail2ban deberemos abrir una terminal y escribir lo siguiente:

sudo apt install fail2ban python3-systemd

Configuración

La configuración de Fail2ban se encuentra en la carpeta «/etc/fail2ban/«. Allí encontraremos un archivo llamado «jail.conf» con las configuraciones del sistema.

Pero nosotros trabajaremos con una copia del archivo jail.conf a la que llamaremos jail.local, ya que así evitaremos que tras una actualización este pueda ser sustituido por la versión por defecto, cambiando así toda nuestra configuración.

El archivo jail.local se carga después de jail.conf y en él realizaremos nuestra configuración, por lo que todo lo que se escriba en jail.local es lo que se va a tener en cuenta definitivamente.

La copia del archivo jail.conf, la haremos desde la terminal con el comando cp (copy)

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

Ahora abre el archivo en cuestión

sudo nano /etc/fail2ban/jail.local

Configuración Default (por defecto)

En la sección [DEFAULT] encontramos las configuraciones predeterminadas que afectarán a todos los jail. Todas las configuraciones que pongas en [DEFAULT] son heredadas por los jail

En la sección «[DEFAULT]» encontramos la configuración global de las opciones. Allí veremos diversas variables a definir como las siguientes:

  • ignoreip: Aquí puedes añadir direcciones IP que nunca serán baneadas por Fail2ban. Por ejemplo, nuestra propia dirección IP.
  • bantime: es el tiempo que una IP será baneada, expresado en segundos, minutos, horas, días …. (por defecto en 10 minutos)
  • findtime: es el tiempo que transcurre entre intentos de conexión antes de ser baneado. (por defecto en 10 minutos)
  • maxretry: es el número máximo de intentos de login que podrán realizarse antes de que la IP sea baneada. (por defecto en 5 intentos)

Nota si quieres que se ignoren todas las ips procedentes de tu red local, escribe la primera dirección IP (que suele ser la del router) seguido de un /24, esto hará que no se tengan en cuenta las direcciones de la 1 a la 254.

Seguimos cambiando otras cosas de la sección Default.

Como yo no uso iptables, ya que el firewall lo tengo activo a nivel de router, haremos algunos cambios.

Busca las siguientes líneas y comenta con el signo #

[Default]

banaction = iptables-multiport
banaction_allports = iptables-allports

Pega debajo las siguientes líneas.

banaction = nftables
banaction_allports = nftables[type=allports]

Quedando como en la siguiente imagen.

Configuración de Jail

El siguiente paso es configurar los jails.

Los Jails en Debian se se configuran sobre el archivo llamado defaults-debian.conf, que se encuentra en la ruta etc/fail2ban/jail.d/defaults-debian.conf. Estos Jail tienen prioridad a la configuración por defecto, por lo que puedes crear reglas independientes para cada servicio.

Abre defaults-debian.conf desde la terminal

sudo nano /etc/fail2ban/jail.d/defaults-debian.conf

Nos muestra el contenido del archivo

[sshd] 
enabled = true

Esto significa que tengo habilitado el jail sshd.

Este jail tiene los parámetros de configuración heredados por [Default], pero lo mejor será crear unos parámetros específicos.

Añade las líneas en negrita, que son, el puerto de conexión, la ruta de log de eventos y el backend

[sshd]
enabled = true
port    = 2353
logpath = %(sshd_log)s
backend = systemd

Nota: Cambia port por el puerto que usas en tu servidor ssh

Reinicia el el servicio fail2ban así:

sudo systemctl restart fail2ban

Hasta aquí todo listo, ya solo queda comprobar que todo va bien.

Comprobaciones.

Vamos a realizar una serie comprobaciones para ver si se están ejecutando correctamente los servicios, estados y advertencias.

Test estado del servicio

Comprobamos el estado del servicio con:

sudo systemctl status fail2ban

Es posible que después de hacer una status, el servicio aparezca inactivo, como se muestra en la siguiente imagen.

Para arreglar esto, haz lo siguiente. En una terminal, escribe:

sudo echo "sshd_backend = systemd" >> /etc/fail2ban/paths-debian.conf

Reinicia el servicio con:

sudo systemctl restart fail2ban

Y volvemos a ver el estado de como está el servicio:

sudo systemctl status fail2ban

Ahora está todo correcto, el servicio aparece activo y corriendo.

Test estado general de fail2ban

Comprobamos el estado y la cantidad de jails en funcionamiento.

sudo fail2ban-client status

Test estado de Jails específicos

Comprobamos si una jail específica funciona, en mi caso solo tengo configurado ssh, así que ejecuta el siguiente comando:

sudo fail2ban-client status sshd

La salida nos muestra bastante información sobre las IPs baneadas, el número de intentos de conexión, el número de baneos etc etc

Visualizar el log de eventos

Veamos si el archivo log de fail2ban contiene algún error. Visualiza el archivo log en tiempo real para ver los cambios que se van produciendo instantáneamente.

Copia y pega el siguiente comando:

sudo tail -f /var/log/fail2ban.log

En la siguiente imagen verás que no aparece ningún error y se carga nuestro jail sshd

Test de Fail2ban

Fail2ban tiene un comando testar la configuración. Para esta comprobación tienes que usar este comando:

sudo fail2ban-client --test
Test de la configuración de fail2ban

Vaya! tenemos un mensaje de advertencia. No es un error, tampoco afectará al funcionamiento de fail2ban, pero se puede arreglar.

Corregir advertencia Warning IPV6

Para arreglar esto tendremos que abrir el archivo de configuración que se encuentra en /etc/fail2ban/fail2ban.conf

sudo nano /etc/fail2ban/fail2ban.conf

Ve al apartado [Definition], verás que está vacío y escribe debajo lo siguiente:

 allowipv6 = auto

Quedando de la siguiente manera:

Volvemos a repetir el test y ahora se habrá quitado el mensaje de advertencia.

Test de Baneo

Provocamos un ban sobre nosotros para ver si la configuración es correcta.

Intento entrar por ssh desde mi teléfono móvil con una contraseña errónea. Debe de haber 5 intentos de conexión y un baneo de 10 minutos.

Conexión baneada por excesos de inicio de sesión fallidos.

Al quinto intento nos banea y como vimos antes, hasta transcurridos 10 minutos no dejará que volvamos a probar.

Conexión baneada por excesos de inicio de sesión fallidos.

Pasados 10 minutos, tal como está configurado en [Default] se levanta el baneo y dará permiso para volver a dejarnos entrar.

Desbaneo de una IP a los 10 minutos.

Mi teléfono vuelve a dejarnos escribir la contraseña.

Desbanear una IP

Las IP baneadas pueden ser sacadas de la lista de ban sin tener que esperar al tiempo de ban por defecto. Para ello usa unban y la ip a desbanear.

sudo fail2ban-client unban 192.168.1.1

Envío de alertas por email.

Para que fail2ban envíe alertas por email, debes de tener instalado y configurado algún programa que envíe correos electrónicos. En mi caso uso sSMTP y la configuración que usaré en fail2ban, será con este programa.

sSMTP es un programa que envía correo electrónico desde un equipo a un servidor de correo configurado. Es decir que este no es un servidor de correo como si lo es sendmail o postfix sino que solo se encarga del envío de correos.

Si quieres saber cómo he configurado sSMTP puedes ver mi post «Como enviar emails con sSMTP» e ir al apartado 2- Instalar ssmtp y configurar la cuenta de correo y seguir los pasos que allí te indico.

Fail2ban te avisará cuando una IP sea baneada, aportando una valiosa información acerca de su procedencia, proveedor etc etc

Continuamos con nuestra configuración jail.local ….

En una terminal homologada, escribe el siguiente comando:

sudo nano /etc/jail2ban/jail.local

Ve al apartado Actions

Busca la líneas que dicen, destemail y mta

# Some options used for actions

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = root@localhost

# Sender email address used solely for some actions
sender = root@<fq-hostname>

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
mta = sendmail

En destemail escribe la dirección de correo a la que llegarán las alertas, por ejemplo mi_email@gmail.com
En mta aquí usa el modo en que tu programa envía mails, en el caso de sSMTP pondré mail

# Some options used for actions

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = mi_email@gmail.com

# Sender email address used solely for some actions
sender = root@<fq-hostname>

# E-mail action. Since 0.8.1 Fail2Ban uses sendmail MTA for the
# mailing. Change mta configuration parameter to mail if you want to
# revert to conventional 'mail'.
mta = sendmail

Ve al Jail [sshd ] (recuerda que la ruta era /etc/fail2ban/jail.d/defaults-debian.conf) y añádele la siguiente línea:

action = %(action_mwl)s

action = “mw” después de “action_” le dice a Fail2ban que le envíe correos electrónicos. “mwl” además adjunta los registros.

Ahora nuestra Jail sshd queda de la siguiente manera:

[sshd]
enabled = true
port    = 2353
logpath = %(sshd_log)s
backend = systemd
action = %(action_mwl)s

Reinicia el servicio fail2ban

sudo systemctl restart fail2ban

Vuelve a visualizar el log de eventos a ver si todo está correcto

sudo tail -f /var/log/fail2ban.log

Si todo anda bien y no recibes errores, puedes intentar loguearte por ssh de forma errónea por 5 veces consecutivas y recibirás un bonito mail de baneo.

Control de fallos (incremento de la seguridad)

Tenemos una opción con la que incrementar el tiempo de baneos de una ip. Con esta configuración, proporcionamos una protección más dinámica contra ataques de fuerza bruta, por lo que, si los atacantes persisten, serán bloqueados por períodos de tiempo cada vez más largos, lo que dificulta sus intentos de acceso.

Esto lo realizaremos con fail.increment, con lo que fail2ban aumentará el tiempo de bloqueo para cada intento fallido adicional de una IP.

¿Cómo funciona?

Si una IP falla X veces en X minutos, se bloqueará durante X horas.

Si la misma IP intenta conectarse nuevamente y falla otras X veces en X minutos, el tiempo de bloqueo se multiplicará por X horas.

Este proceso continúa, aumentando el tiempo de bloqueo en cada intento fallido adicional, hasta alcanzar el tiempo máximo de bloqueo definido en fail2ban_increment_max_bantime.

¿Cómo lo hago?

Vuelve a editar el archivo defaults-debian.conf desde la terminal.

sudo nano /etc/fail2ban/jail.d/defaults-debian.conf

Ahora añade al final las siguientes líneas.

maxretry = 3
findtime = 10m
bantime = 1h
fail2ban_increment = true 
fail2ban_increment_factor = 1.5 
fail2ban_increment_max_bantime = 1d

Quedando de la siguiente manera

[sshd]
enabled = true
port = 2353
logpath = %(sshd_log)s
backend = systemd
action = %(action_mwl)s
maxretry = 3
findtime = 10m
bantime = 1h
bantime.increment = true
bantime.factor = 1.5
bantime.maxtime = 1d

Explicación de los parámetros clave

  • enabled = true: Activa el jail para SSH.
  • port = ssh: Especifica el puerto SSH (generalmente 22).
  • logpath = %(sshd_log)s Define la ruta al archivo de registro de autenticación.
  • maxretry = 3: Establece el número máximo de intentos fallidos antes de bloquear una IP.
  • bantime = 1h: Tiempo de bloqueo inicial de 1 hora.
  • findtime = 10m: Tiempo en el que se buscan los intentos fallidos (10 minutos).
  • fail2ban_actions: Define las acciones que se realizarán al bloquear una IP (bloqueo, envío de correo electrónico, etc.).
  • fail2ban_increment = true: Habilita la función de incremento de tiempo de bloqueo.
  • fail2ban_increment_factor = 1.5: Factor por el cual se multiplicará el tiempo de bloqueo en cada intento fallido adicional.
  • fail2ban_increment_max_bantime = 1d: Tiempo de bloqueo máximo de 1 día.

¿Cómo funciona fail.increment?

En el ejemplo anterior, fail2ban aumentará el tiempo de bloqueo para cada intento fallido adicional de una IP. Por ejemplo:

Si una IP falla 3 veces en 10 minutos, se bloqueará durante 1 hora.

Si la misma IP intenta conectarse nuevamente y falla otras 3 veces en 10 minutos, el tiempo de bloqueo se multiplicará por 1.5 (1.5 horas).

Este proceso continúa, aumentando el tiempo de bloqueo en cada intento fallido adicional, hasta alcanzar el tiempo máximo de bloqueo definido en fail2ban_increment_max_bantime.

4 comentarios en “Instalar Fail2ban en Debian 12 y que funcione.”

  1. Hola estimado admin, primero que nada, muchas gracias por el tiempo de redactar los manuales y las configuraciones, de manera clara y directa, estoy leyendo varias entradas y woow van excelente, muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio