// Engineering Log

Protección del servidor Linux: Parte 2 — Fail2ban contra ataques de fuerza bruta

Publicado el 22.09.2026

// Ruta rapida

Este articulo pertenece al tema Seguridad y proteccion.

Cualquier servidor con SSH abierto es sometido por bots a intentos de fuerza bruta en pocos minutos después de arrancar: prueban combinaciones típicas de usuarios y contraseñas miles de veces por hora. Aquí el cortafuegos no ayudará — el puerto SSH debe estar abierto. Hace falta una herramienta que detecte los intentos de búsqueda por fuerza bruta y bloquee la dirección del atacante. La solución clásica es Fail2ban.

Cómo funciona Fail2ban

Fail2ban es un programa en Python con licencia libre. Lee los registros de los servicios, encuentra en ellos intentos fallidos repetidos de inicio de sesión y bloquea temporalmente la dirección mediante el cortafuegos. La versión actual — 1.1.1 (15.08.2026).

Fail2ban está compuesto por tres partes:

  1. Filtros — expresiones regulares que encuentran en el registro las líneas sobre inicios de sesión fallidos, por ejemplo Failed password for ... en SSH.
  2. Jails (jails) — la combinación «qué registro leer, con qué filtro, cuántos intentos en qué periodo son permitidos y qué hacer».
  3. Actions (acciones) — comandos que ejecutan el bloqueo: reglas nftables, iptables o firewalld.

Parámetros principales de una jail:

  • maxretry — cuántos intentos fallidos se permiten (por defecto 5);
  • findtime — en qué periodo contarlos (por defecto 10 minutos);
  • bantime — cuánto tiempo bloquear la dirección (por defecto 10 minutos).

Instalación y dónde guardar la configuración

bash
sudo apt install fail2ban

No se debe editar el archivo /etc/fail2ban/jail.conf: en su cabecera indica claramente que será sobrescrito al actualizar el paquete. Las configuraciones propias se colocan en /etc/fail2ban/jail.local o en archivos separados /etc/fail2ban/jail.d/*.local — estos anulan los valores por defecto.

En Debian el paquete ya incluye el archivo jail.d/defaults-debian.conf, en el que la jail sshd está habilitada, el bloqueo está configurado mediante nftables, y el registro de SSH se lee desde systemd (backend = systemd). Por eso en un Debian reciente SSH queda protegido inmediatamente tras la instalación.

Configuración mínima funcional

ini
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = nftables
banaction_allports = nftables[type=allports]
# direcciones propias que no deben bloquearse
ignoreip = 127.0.0.1/8 ::1 203.0.113.10

# periodo de bloqueo creciente para infractores reincidentes
bantime.increment = true
bantime.factor = 1
bantime.maxtime = 1w

[sshd]
enabled = true
port = ssh
backend = systemd

ignoreip protege de bloquearnos a nosotros mismos: si introduces mal la contraseña cinco veces seguidas desde la oficina, sin esta línea la oficina perderá acceso al servidor.

bantime.increment activa el aumento del periodo de bloqueo. Fail2ban guarda las direcciones en su base y cada bloqueo siguiente de la misma dirección es más largo: 1, 2, 4, 8, 16 periodos base — hasta el límite bantime.maxtime. Los bots que vuelven a la hora siguiente rápidamente reciben un bloqueo de una semana.

Jail recidive

Para los más persistentes existe una jail separada recidive. Lee el registro del propio Fail2ban y bloquea en todos los puertos las direcciones que ya han sido atrapadas varias veces por otras jails. Por defecto — bloqueo por una semana si en 24 horas la dirección acumuló el número necesario de bloqueos:

ini
[recidive]
enabled = true

La documentación recomienda además aumentar dbpurgeage en fail2ban.local (por ejemplo, a 648000 segundos, 7,5 días), para que la base recuerde las direcciones el tiempo suficiente.

Firewalld y nftables

La acción de bloqueo se elige según el cortafuegos instalado en el servidor:

  • nftables — acciones nftables-multiport, nftables-allports o la genérica nftables con el parámetro type; opción por defecto en Debian;
  • firewalld (RHEL, AlmaLinux, Rocky) — acciones firewallcmd-ipset, firewallcmd-rich-rules y otras;
  • iptables — los clásicos iptables-multiport e iptables-allports, si el servidor aún usa iptables-legacy.

Si se selecciona una acción incompatible con el cortafuegos real, Fail2ban seguirá «bloqueando» direcciones en su registro, pero en la práctica no bloqueará nada.

Comprobación

bash
sudo fail2ban-client status              # lista de jails activas
sudo fail2ban-client status sshd         # cuántas direcciones están bloqueadas
sudo fail2ban-client set sshd unbanip 203.0.113.10   # quitar bloqueo
sudo nft list ruleset | grep -A3 f2b     # reglas creadas por Fail2ban

Para probar un filtro sobre el registro sin realizar bloqueos ayuda fail2ban-regex: muestra cuántas líneas encontró el filtro.

Fortalezas y limitaciones

Fail2ban es simple, consume muy pocos recursos y sabe proteger cualquier servicio que escriba registros legibles: SSH, servidores de correo, paneles web, Asterisk. Para la mayoría de servicios populares ya existen filtros incluidos.

También hay que comprender sus limitaciones:

  • Fail2ban reacciona a la escritura en el registro, no al tráfico en sí: el bloqueo ocurre después de que ya se han producido los intentos;
  • no detecta bien un ataque distribuido, cuando cada dirección hace una o dos intentos;
  • cada servidor se protege por sí mismo y no sabe nada de ataques a servidores vecinos.

Las dos últimas limitaciones las cubre CrowdSec. Pero la principal protección de SSH contra la búsqueda por fuerza bruta no es Fail2ban, sino usar solo autenticación por claves y deshabilitar el acceso por contraseña: entonces no hay nada que adivinar.

Un ejemplo de configuración de Fail2ban para una aplicación web con su propio registro de accesos (Vaultwarden): Secretos y zero trust: Parte 2 — Vaultwarden detrás de Caddy o Nginx y protección inicial.

Errores típicos

  • Configuraciones puestas en jail.conf que desaparecen tras actualizar el paquete.
  • No se ha indicado ignoreip, y el administrador se bloquea a sí mismo.
  • La acción no corresponde al cortafuegos: los bloqueos aparecen en el registro, pero no en las reglas.
  • En Debian 12 y posteriores la jail está configurada para leer /var/log/auth.log, que no existe: el registro de SSH está en systemd, se necesita backend = systemd.
  • SSH se movió a otro puerto, pero en la jail quedó port = ssh, y se está bloqueando el puerto equivocado.

Qué más hacer para proteger un servidor nuevo está recopilado en la lista de verificación «Compré un VPS — ¿qué sigue?».

// Tarea parecida

Si estas resolviendo algo parecido

Este articulo pertenece a uno de los temas principales de trabajo. Puedes seguir leyendo sobre el tema, ir a la pagina principal para entender a que me dedico o abrir directamente los servicios.

Tema del articulo

Seguridad y proteccion

SSL, hardening, accesos, proteccion de servicios y configuraciones seguras.

Tareas frecuentes de esta tema

  • Configurar SSL, certificados y conexiones seguras
  • Restringir accesos y cerrar puntos de entrada innecesarios
  • Reforzar la configuracion del servidor y los servicios

// Siguiente paso

Si necesitas ayuda con este tema y no solo otro articulo, es mejor ir directo a la pagina del servicio. La pagina principal y la seleccion de materiales quedan como rutas secundarias.

Abrir servicios

// Reviews

Reseñas relacionadas

Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más sencilla y económica. Al final ahorré dinero y tiempo. Mikhail — un verdadero experto que trabaja por el resultado del cliente, no por la factura. ¡Lo recomiendo!

Llegué con una solicitud costosa para la configuración de un servidor VPS, pero durante la consulta Mikhail propuso una solución mucho más simple y económica. Al final ahorré presupuesto y tiempo. Mikhail es un …

kfhzasorin

Configuración de VPS, configuración del servidor

12.05.2026 · ★ 5/5

Hubo varios problemas, tanto en la parte técnica como en la comprensión general. Mijaíl respondió rápido a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos; por ello, muchas gracias. Estoy satisfecho con el resultado.

Hubo varios problemas relacionados tanto con la parte técnica como con la comprensión en general. Mijaíl respondió rápidamente a la solicitud, ayudó a aclarar las cosas y resolvió los problemas técnicos, por lo que le …

abazawolf

Configuración de VPS, configuración del servidor

18.02.2026 · ★ 5/5

// Contact

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Respondo en un día laborable (03:00-13:00 GMT)

Или оставьте заявку здесь:

Confirme que no es un bot.

Escribir y recibir una respuesta rápida