Qué es un firewall
Un firewall es un filtro de entrada y salida de tu servidor. Toda conexión que intenta llegar hasta él pasa primero por este filtro. El firewall verifica adónde quiere ir la conexión (a qué puerto) y decide: la deja pasar o la bloquea. Sin firewall, cualquier puerto abierto de tu servidor queda accesible para todo el mundo.
🧠 Analogía: el portero del edificio
Imagina un edificio con un portero en la entrada. Todos los que quieren entrar se detienen en la recepción. El portero tiene una lista: quien está en la lista entra; quien no, se queda afuera, por más que insista. El firewall es ese portero de tu servidor.
- •Visitante en la lista (puerto 443): entra para ver el sitio
- •Tú, el propietario (puerto 22): entra para administrar
- •Extraño sin permiso: rechazado en la entrada
💡 De forma predeterminada, el ataque ya comenzó
En cuanto pones un servidor en línea, los bots automáticos empiezan a escanear tus puertos en cuestión de minutos, buscando uno abierto para entrar. Esto es normal y ocurre con todos los servidores. El firewall es la primera y más importante línea de defensa contra este ruido constante.
UFW: Permitir y bloquear puertos
En Linux, la forma más sencilla de configurar un firewall es UFW (Uncomplicated Firewall, o «firewall sencillo»). Es una capa fácil de usar sobre el firewall del sistema. Con comandos cortos y en inglés claro, indicas qué puertos abrir y cuáles cerrar.
ufw allow e ufw deny
Los comandos son casi frases: "ufw allow 22" = "firewall, permite el puerto 22".
# Permitir un puerto (dejar pasar)
$ sudo ufw allow 22
Rules updated
Rules updated (v6)
# Permitir por nombre del servicio
$ sudo ufw allow OpenSSH
# Denegar un puerto (bloquear)
$ sudo ufw deny 3306
Rules updated
ufw enable e ufw status
Definir las reglas no basta: necesitas activar el firewall. Y siempre verificar el estado para ver qué está vigente.
# Activar el firewall
$ sudo ufw enable
Firewall is active and enabled on system startup
# Ver las reglas activas
$ sudo ufw status
Estado: activo
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
# Apagar (si hace falta)
$ sudo ufw disable
⚠️ Error común
Problema: Ejecuté sudo ufw enable y me desconectaron del servidor para siempre.
Solución: Esto ocurre cuando activas el firewall SIN haber permitido antes el puerto 22 (SSH). Como el firewall bloquea todo lo que no se haya permitido, corta tu propia conexión. Siempre ejecuta sudo ufw allow 22 ANTES de enable. Si ya te quedaste fuera, usa la consola web de tu proveedor (VPS) para entrar y abrir el puerto.
✓ Qué HACER
- ✓Liberar el puerto 22 (SSH) ANTES de ejecutar
enable - ✓Verificar con
ufw statusdespués de cada cambio - ✓Abrir solo los puertos que realmente usas
✗ Qué NO hacer
- ✗Ejecutar
enablesin habilitar primero el SSH - ✗Abrir el puerto de la base de datos (3306) para Internet
- ✗Dejar todo abierto «para resolverlo después»
Puertos esenciales: 22, 80 y 443
Un puerto es como una puerto numerado de un edificio: cada servicio vive detrás de un puerto específico. Para un servidor web simple, solo necesitas tres puertos abiertos. Saber para qué sirve cada uno evita abrir demasiados puertos (peligroso) o muy pocos (sitio fuera de línea).
Tu puerta de administración. Por aquí entras al servidor desde la terminal.
La puerta de los sitios sin candado. Generalmente solo redirige al visitante a HTTPS.
La puerta de los sitios con candado verde. Y es donde responderá tu sitio realmente seguro.
Liberando los tres a la vez
# SSH primero (para no quedarte fuera)
$ sudo ufw allow 22
# Sitio sin candado (redirige al seguro)
$ sudo ufw allow 80
# Sitio con candado (HTTPS)
$ sudo ufw allow 443
# Ahora sí, activar el firewall
$ sudo ufw enable
Firewall is active and enabled on system startup
👁 Qué vas a ver en la pantalla
Después de habilitar y activar, el ufw status numbered muestra la lista numerada de tus reglas. Cada línea es un puerto habilitado:
$ sudo ufw status numbered
Estado: activo
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 80 ALLOW IN Anywhere
[ 3] 443 ALLOW IN Anywhere
Los números entre corchetes sirven para eliminar una regla después: sudo ufw delete 2 borra la regla número 2.
💡 Consejo: no abras puertos «por si acaso»
Cada puerto abierto es una puerta más que un intruso puede probar. Si no sabes para qué sirve un puerto, NO lo abras. Las bases de datos (3306, 5432), por ejemplo, deben permanecer cerradas a Internet y ser accesibles solo desde el propio servidor.
Fail2ban: Bloqueo de intentos de intrusión
El firewall abre el puerto 22 para que administres, pero también queda visible para los intrusos que intentan adivinar tu contraseña miles de veces. El Fail2ban resuelve eso: observa los intentos fallidos y, después de varios seguidos, bloquea la IP del atacante por un tiempo.
🧠 Analogía: el guardia que memoriza rostros
Imagina a un guardia en la puerta de una discoteca. Si la misma persona intenta entrar con una identificación falsa cinco veces seguidas, le anota la cara y le prohíbe acercarse durante una hora. Fail2ban hace eso con las IP: si te equivocas demasiadas veces al ingresar la contraseña, quedas bloqueado temporalmente.
Instalando y activando
# Instalar
$ sudo apt install fail2ban -y
# Activar para que se inicie junto con el servidor
$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
# Ver las IP bloqueadas en este momento
$ sudo fail2ban-client status sshd
Estado del jail: sshd
|- Currently failed: 2
|- Total failed: 148
`- Banned IP list: 203.0.113.45 198.51.100.7
El atacante intenta entrar
Un bot intenta iniciar sesión en SSH con contraseñas aleatorias: admin, 123456, root...
Fail2ban cuenta los intentos fallidos
Cada contraseña incorrecta queda registrada en el log. Fail2ban vigila ese log.
Superaste el límite, ban
Después de 5 fallos (valor predeterminado), el firewall bloquea la IP durante 10 minutos. ¿Lo intentaste de nuevo? El tiempo de bloqueo será mayor.
👁 Dónde se ajustan los límites
La configuración está en el archivo /etc/fail2ban/jail.local. Los tres ajustes más comunes:
# cuánto tiempo queda bloqueada la IP (10 min)
bantime = 10m
# período en que se cuentan los fallos
findtime = 10m
# cuántos fallos hasta el bloqueo
maxretry = 5
⚠️ Error común
Problema: "Me equivoqué con mi propia contraseña varias veces y ahora me bloquearon el acceso a mi servidor."
Solución: Fail2ban no te distingue de un intruso. Si eso sucede, accede por la consola web del proveedor (VPS) y ejecuta sudo fail2ban-client unban SEU_IP. Para evitarlo, usa claves SSH (módulo 3.2) en vez de una contraseña: así nunca te equivocas.
Certificado SSL con Let's Encrypt
El candado verde del navegador (HTTPS) significa que la conexión entre el visitante y tu sitio encriptada: nadie en el camino puede leer los datos. Para tener ese candado, necesitas un certificado SSL. El Let's Encrypt emite estos certificados gratis, y certbot hace todo el trabajo por ti.
🧠 Analogía: el sobre sellado
HTTP es como una postal: cualquier cartero en el camino puede leer lo que está escrito. HTTPS es una carta dentro de un sobre sellado: solo el destinatario puede abrirlo. El certificado SSL es lo que garantiza ese sello, y el candado verde es la prueba de que el sello está intacto.
Instalando certbot y emitiendo el certificado
# Instalar certbot (ejemplo con Nginx)
$ sudo apt install certbot python3-certbot-nginx -y
# Emitir el certificado para tu dominio
$ sudo certbot --nginx -d meusite.com -d www.meusite.com
Requesting a certificate for meusite.com
Successfully received certificate.
Deploying certificate
Congratulations! You have successfully enabled HTTPS
Certbot edita la configuración de Nginx por su cuenta y activa la redirección de HTTP a HTTPS.
👁 El certificado vence en 90 días (y se renueva automáticamente)
Los certificados de Let's Encrypt son válidos por 90 días. Pero certbot ya programa la renovación automática. Puedes probar si la renovación funciona sin esperar:
$ sudo certbot renew --dry-run
Processing /etc/letsencrypt/renewal/meusite.com.conf
Congratulations, all simulated renewals succeeded
⚠️ Error común
Problema: Certbot falla con "Could not bind to port 80" o "connection refused".
Solución: Let's Encrypt necesita acceder a tu servidor por los puertos 80 y 443 para validar que el dominio es tuyo. Confirma que sudo ufw allow 80 e sudo ufw allow 443 ya se ejecutaron y el dominio apunta (DNS) a la IP del servidor.
Lista de verificación de seguridad del servidor
En conjunto: un servidor bien protegido sigue algunos pasos básicos que cubren el 90% de los ataques automáticos. Usa esta lista de verificación cada vez que inicies un servidor nuevo. Son pocos comandos y hacen una gran diferencia.
1.Actualiza el sistema
$ sudo apt update && sudo apt upgrade -y
Los paquetes desactualizados son la puerta de entrada más común.
2.Usa una clave SSH y desactiva el inicio de sesión con contraseña
# en /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
Sin contraseñas que adivinar, el ataque de fuerza bruta desaparece.
3.Activa el firewall solo con lo necesario
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw enable
4.Instala Fail2ban
$ sudo apt install fail2ban -y
$ sudo systemctl enable fail2ban
5.Activa HTTPS
$ sudo certbot --nginx -d meusite.com
✓ Hábitos seguros
- ✓Actualizar el sistema con regularidad
- ✓Acceder solo con clave SSH, nunca con contraseña
- ✓Verificar
ufw statusy los logs de vez en cuando - ✓Crear un usuario común y no usar root en el día a día
✗ Riesgos que debes evitar
- ✗Iniciar sesión como root directamente desde Internet
- ✗Usar contraseñas cortas o repetidas
- ✗Dejar puertos abiertos «para probar y olvidarse»
- ✗Servir el sitio solo por HTTP, sin candado
🏆 Tu servidor ahora tiene portero
Con firewall, Fail2ban y HTTPS, ya estás por delante de la mayoría de los servidores en internet. La seguridad no es un único botón: es la suma de varias capas. En el próximo módulo aprenderás a administrar tokens y accesos de forma segura, para que tus claves y secretos nunca se filtren.
📚 Resumen del módulo
Siguiente módulo:
3.4 - Tokens y acceso (gestionar claves y secretos sin dejar que se filtren nunca)