UFW y Fail2Ban: El escudo Invisible
'El acceso físico está comprometido,' murmuró Amin,'Cualquiera podría encontrarlo.Y aunque la autenticación por clave es robusta, una vez que encuentren la IP, los ataques de fuerza bruta serán cuestión de tiempo.'
Lara asintió. 'Lo sé. Es un riesgo calculado, pero podemos mitigarlo. Necesitamos fortificar ese acceso lógico. Crear un escudo, una barrera invisible que repela los intentos de intrusión. No hay tiempo para sutilezas, pero sí para lo esencial.'
Amin entendió. '¿Un firewall y algo que los bloquee?'
'Exacto,' respondió Lara, sacando su portátil. 'UFW para el firewall, y Fail2ban para los ataques persistentes.
Instalación de UFW y Fail2ban
┌──(lara㉿kali)-[~]
└─$ ssh amin@192.168.8.101
amin@1-bytepath:~$ sudo apt update
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian bookworm-updates InRelease
Hit:3 http://deb.debian.org/debian-security bookworm-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
amin@1-bytepath:~$ sudo apt install ufw fail2ban -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libiptc0 libnfnetlink0 libxtables12 python3-systemd python3-pyinotify rsyslog
Suggested packages:
tcpd libclamav-client-perl
The following NEW packages will be installed:
fail2ban libiptc0 libnfnetlink0 libxtables12 python3-systemd python3-pyinotify rsyslog ufw
0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,985 kB of archives.
After this operation, 9,332 kB of additional disk space will be used.
........
Processing triggers for man-db (2.11.2-1) ...
Processing triggers for libc-bin (2.36-9+deb12u3) ...
Configuración de UFW: La Barrera Exterior
"Con UFW ya instalado, Lara procedió a fortificar el servidor. La prioridad era establecer una política de denegación por defecto para el tráfico entrante, asegurando que solo lo explícitamente permitido pudiera pasar. El puerto SSH, la puerta de entrada remota que los conectaba con el servidor, era la excepción crucial. Sin él, estarían ciegos y aislados.
Primero, lo básico,' comentó Lara, tecleando rápidamente. 'Denegar todo lo que no conozcamos, y permitir nuestra conexión. No podemos permitirnos un error que nos deje fuera del sistema.'"
┌──(lara㉿kali)-[~]
└─$ ssh amin@192.168.8.101
amin@1-bytepath:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny' (active)
amin@1-bytepath:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow' (active)
amin@1-bytepath:~$ sudo ufw allow ssh
Rule added
Rule added (v6)
amin@1-bytepath:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall enabled and active on system startup
amin@1-bytepath:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
amin@1-bytepath:
Configuración de Fail2ban: El Centinela Agresivo
Con la barrera exterior de UFW levantada, Lara se enfocó en el segundo componente de su defensa: Fail2ban. Si UFW era el muro, Fail2ban era el centinela vigilante, capaz de detectar a los asaltantes persistentes y castigarlos bloqueándolos temporalmente. Su misión principal era proteger el puerto SSH de los ataques de fuerza bruta, pero su flexibilidad le permitiría proteger otros servicios en el futuro.
Ahora, el ojo que todo lo ve,' explicó Lara a Amin. 'Fail2ban monitoreará los intentos fallidos de acceso. Demasiados errores y el atacante será bloqueado automáticamente. Es una defensa proactiva contra los intentos sistemáticos de adivinar nuestra clave.'"
┌──(lara㉿kali)-[~]
└─$ ssh amin@192.168.8.101
amin@1-bytepath:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
amin@1-bytepath:
Lara creó una copia del archivo de configuración principal de Fail2ban (jail.conf) a jail.local. Este es un paso estándar y recomendado; permite modificar las configuraciones de Fail2ban sin riesgo de que los cambios sean borrados por una actualización del sistema. El archivo jail.local sobrescribe las configuraciones de jail.conf.
Ahora, Lara editará el archivo jail.local para ajustar las configuraciones globales y habilitar la protección SSH.
amin@1-bytepath:~$ sudo nano /etc/fail2ban/jail.local
Dentro de jail.local, Lara buscaría o añadiría las siguientes líneas para configurar el comportamiento básico:
# CONTENIDO DEL ARCHIVO /etc/fail2ban/jail.local (solo las partes relevantes)
# Configuración global
[DEFAULT]
# Duración del baneo (en segundos)
bantime = 1h
# Número de intentos fallidos antes del baneo
maxretry = 5
# Intervalo de tiempo para los reintentos
findtime = 10m
# Acciones a tomar (email, firewall, etc.). '%(action_mwl)s' por defecto.
# Puedes añadir 'action = %(action_mwl)s %(mta)s[name=sshd,dest=tu_email@example.com]' si quieres emails
action = %(action_mwl)s
# Ignorar IPs
# ignoreip = 127.0.0.1/8 ::1 192.168.8.0/24 # <-- IMPORTANTE: Si conoces IPs seguras (ej. tu propia IP estática, la red de tu portátil), añádelas aquí.
# Habilitar la jaula SSH
[sshd]
enabled = true
# Puedes ajustar el puerto si no es el 22 por defecto
# port = ssh
# logpath = %(sshd_log)s
# backend = %(sshd_backend)s
# [OTRAS JAULAS COMO NGINX, APACHE, ETC. ESTARÍAN DESHABILITADAS POR DEFECTO O CONFIGURADAS MÁS TARDE]
Explicación de las configuraciones clave en jail.local:
- bantime = 1h Lara configuró el tiempo de baneo a 1 hora. Esto significa que una IP bloqueada por Fail2ban no podrá intentar conectarse de nuevo durante 60 minutos.
- maxretry = 5Estableció el número máximo de intentos fallidos a 5. Después de 5 intentos fallidos en un periodo de findtime, la IP será baneada.
- findtime = 10mDefinición del intervalo de tiempo en el que se cuentan los maxretry. Si un atacante realiza 5 intentos fallidos en 10 minutos, será baneado.
- ignoreip = ...Esta línea es crucial. Lara recordó la importancia de añadir IPs que nunca debieran ser baneadas (por ejemplo, la IP de su propio portátil si fuera estática, o rangos de red conocidos y seguros). De lo contrario, si ellos mismos cometen errores, podrían autobloquearse.
- [sshd] y enabled = true Finalmente, Lara habilitó la "jaula" (jail) específica para el servicio SSH (sshd). Esto le dice a Fail2ban que empiece a monitorear los logs de SSH para detectar intentos de acceso fallidos.
amin@1-bytepath:~$ sudo systemctl restart fail2ban
amin@1-bytepath:
El servidor de Amin tenía ahora dos capas de protección digital. UFW, el muro que decidía quién entraba y quién no. Y Fail2ban, el centinela silencioso, siempre atento a los lobos que rondaran la puerta.
Un respiro.
No era Arcadia, pero era un comienzo.
Con las herramientas en su lugar y las defensas activas, Lara y Amin sabían que su pequeño nodo en el desierto estaba tan seguro como podía estarlo.
El sol casi había desaparecido, y el crepúsculo envolvía el antiguo peaje. La carretera, antes una arteria de comercio, ahora se extendía vacía y silenciosa hacia el horizonte incierto.
Un nuevo tramo del viaje les esperaba, y con cada kilómetro, la esperanza de Arcadia brillaba un poco más.