El problema: ataques por fuerza bruta#
Después de exponer mi servidor Ubuntu a internet, me pasé una noche revisando logs. SSH recibía intentos de login fallidos cada segundo. Nginx también tenía solicitudes sospechosas a rutas comunes. Necesitaba algo que bloqueara estos intentos automáticamente. Fail2ban fue mi solución.
Instalación#
sudo apt update
sudo apt install fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2banVerificar que está corriendo:
sudo systemctl status fail2banEstructura de Fail2ban#
Fail2ban funciona así: monitorea logs, detecta patrones de fallo y crea reglas de firewall para bloquear IPs. Tiene tres componentes clave:
- Jails: definen qué servicio proteger
- Filters: patrones regex para detectar intentos fallidos
- Actions: qué hacer cuando se detecta un ataque (ban, email, etc)
Configuración de SSH#
El jail de SSH viene preconfigurado, pero lo personalicé. Crear archivo /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3Explicación:
bantime: segundos que dura el bloqueo (1 hora)findtime: ventana en segundos para contar intentos (10 min)maxretry: intentos fallidos antes de banear (3 en SSH, más restrictivo)
Configuración de Nginx#
Para Nginx necesité crear un jail personalizado. Primero, el filtro en /etc/fail2ban/filter.d/nginx-http-auth.conf:
sudo nano /etc/fail2ban/filter.d/nginx-http-auth.conf[Definition]
failregex = ^<HOST> - \S+ \[\S+ \S+\] ".*?" (401|403) .*$
ignoreregex =Luego, agregar el jail al archivo local:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 600
bantime = 3600Aplicar cambios#
sudo systemctl restart fail2banVerificar que los jails están activos:
sudo fail2ban-client statusVer estado detallado de SSH:
sudo fail2ban-client status sshdMonitoreo#
Después de algunas horas, revisé la actividad:
sudo fail2ban-client status sshdLa salida muestra IPs baneadas. Para ver detalles del jail:
sudo tail -f /var/log/fail2ban.logDesbloquear una IP (por si acaso)#
Si me equivoqué y bloqueé mi propia IP:
sudo fail2ban-client set sshd unbanip <IP>Notas importantes#
- Fail2ban no reemplaza SSH keys. Seguí usando autenticación por clave, no contraseña.
- Aumenté
maxretryen SSH a 3 porque es más restrictivo que 5 en aplicaciones web. - Los logs de Nginx deben estar en formato combinado. Verificar
/etc/nginx/nginx.conf. - Para cambios en filtros, reiniciar:
sudo systemctl restart fail2ban.
Resultado#
Después de implementar esto, los intentos de fuerza bruta desaparecieron. Los logs dejaron de ser un caos. El servidor se siente más tranquilo.
Fail2ban no es una bala de plata, pero es un escudo efectivo contra automatización básica. Vale la pena el tiempo invertido en configurarlo correctamente.