Start typing to search across invoices, services, domains, tickets, and more...
En cuanto un servidor tiene una IP pública, los bots empiezan a adivinar contraseñas SSH en cuestión de minutos, y los sitios web reciben escaneos en busca de páginas de administración y avalanchas de solicitudes. Fail2ban vigila sus logs y, cuando una IP falla demasiadas veces o hace solicitudes demasiado rápido, la bloquea automáticamente a través del firewall. Esta guía explica cómo instalar Fail2ban en Debian/Ubuntu y Rocky Linux/AlmaLinux, crear jail.local, activar la jail sshd contra ataques de fuerza bruta SSH, proteger sitios web con las jails nginx-limit-req y nginx-http-auth, integrarlo con ufw/firewalld, y desbloquear IPs o añadirlas a la lista blanca.
En Debian/Ubuntu, instálelo desde los repositorios estándar junto con python3-systemd para que Fail2ban pueda leer los inicios de sesión SSH desde el journal de systemd (Debian 12 y versiones posteriores ya no crean /var/log/auth.log de forma predeterminada). En Rocky/AlmaLinux, Fail2ban se obtiene de EPEL, y el paquete fail2ban-firewalld hace que bloquee a través de firewalld.
# Debian / Ubuntu
apt update
apt install -y fail2ban python3-systemd
# Rocky Linux / AlmaLinux (EPEL)
dnf install -y epel-release
dnf install -y fail2ban fail2ban-firewalld
systemctl enable --now fail2ban
fail2ban-client version
Nunca edite jail.conf, ya que se reemplaza al actualizar; guarde todos los cambios en jail.local. La configuración siguiente bloquea una IP durante una hora tras tres inicios de sesión fallidos en diez minutos, y los reincidentes reciben bloqueos cada vez más largos, de hasta una semana. Si cambió SSH a otro puerto (consulte nuestro tutorial para cambiar el puerto SSH), indique ese número en port; de lo contrario, el bloqueo no cubrirá el puerto real.
# Nunca edite jail.conf (se sobrescribe al actualizar); use jail.local
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
# Sus propias IPs nunca se bloquean (IP de oficina/casa, monitoreo, otros servidores)
ignoreip = 127.0.0.1/8 ::1 198.51.100.20 203.0.113.0/24
bantime = 1h
findtime = 10m
maxretry = 5
# Los reincidentes reciben bloqueos más largos, de hasta una semana
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = true
# use su puerto personalizado si lo cambió, p. ej. port = 2222
port = ssh
backend = systemd
maxretry = 3
EOF
fail2ban-client -t # test the configuration
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
banaction determina cómo Fail2ban bloquea una dirección. Use ufw en Ubuntu/Debian con ufw; en Rocky/AlmaLinux, el paquete fail2ban-firewalld ya selecciona las rich rules de firewalld; si no tiene ninguno de los dos firewalls, use nftables-multiport. Elija solo una opción, colóquela en la sección [DEFAULT] de jail.local y reinicie Fail2ban (consulte nuestro tutorial de firewall en Linux para los conceptos básicos).
# Debian / Ubuntu con ufw - añada en [DEFAULT] de /etc/fail2ban/jail.local
banaction = ufw
# Rocky / AlmaLinux con firewalld - fail2ban-firewalld lo configura automáticamente
# (/etc/fail2ban/jail.d/00-firewalld.conf), o de forma explícita:
banaction = firewallcmd-rich-rules
# nftables sin ufw/firewalld
banaction = nftables-multiport
# Compruebe que los bloqueos llegan realmente al firewall
ufw status numbered | head
firewall-cmd --list-rich-rules
nft list ruleset | grep -A5 f2b
La jail nginx-limit-req se basa en el módulo limit_req de Nginx: cuando un cliente supera el límite, Nginx escribe "limiting requests" en error.log y Fail2ban bloquea al cliente. nginx-http-auth vigila los inicios de sesión fallidos con Basic Auth, ideal para directorios de administración. Ajuste el límite a su tráfico para no bloquear a visitantes reales.
# /etc/nginx/nginx.conf, dentro de http { }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
# dentro del server { } o location { } que desea proteger
limit_req zone=perip burst=20 nodelay;
# área protegida con autenticación básica (opcional)
location /admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
nginx -t && systemctl reload nginx
Un archivo aparte en jail.d mantiene ordenadas las jails de Nginx. Antes de confiar en ellas, ejecute fail2ban-regex para confirmar que el filtro realmente coincide con líneas de su log. Los paneles de control como aaPanel (BaoTa) guardan los logs de Nginx en otra ubicación, así que ajuste logpath a la ruta real.
cat > /etc/fail2ban/jail.d/nginx.local <<'EOF'
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
findtime = 1m
maxretry = 10
bantime = 2h
EOF
# Compruebe que el filtro coincide con líneas de su log
fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf
fail2ban-client reload
fail2ban-client status nginx-limit-req
Puede desbloquear una IP en una sola jail o en todas. addignoreip solo dura hasta que Fail2ban se reinicia; para una lista blanca permanente, añada la IP a ignoreip en jail.local y recargue. Si se bloqueó a sí mismo y no puede entrar por SSH, conéctese desde otra red (por ejemplo, el punto de acceso de su teléfono), use la consola del área de cliente si está disponible o abra un ticket de soporte.
fail2ban-client status sshd # list banned IPs
fail2ban-client set sshd unbanip 198.51.100.20 # unban from one jail
fail2ban-client unban 198.51.100.20 # unban from all jails
fail2ban-client unban --all # clear every ban
fail2ban-client set sshd addignoreip 198.51.100.20 # whitelist until restart
# Lista blanca permanente: añada la IP a "ignoreip" en jail.local y luego
fail2ban-client reload
tail -f /var/log/fail2ban.log # watch bans live
Es típico en Debian 12 y versiones posteriores, que ya no escriben auth.log. Configure backend = systemd en la sección sshd e instale python3-systemd. fail2ban-client -t muestra el error exacto.
Normalmente banaction no coincide con el firewall en uso, o port es distinto del puerto SSH real. Use los comandos del paso 3 para comprobar que existen las reglas correspondientes.
No. Fail2ban solo frena los ataques de fuerza bruta. La verdadera solución es desactivar el inicio de sesión con contraseña y usar claves SSH; combine ambos para obtener la mejor protección.
¿Sigue sin resolverlo después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico de IMIDC, disponible 24/7, le ayudará. Incluya la IP del servidor, la versión del sistema operativo, los comandos que ejecutó y la salida completa del error para que podamos localizar el problema más rápido.