¿Cómo proteger un servidor Linux con firewall?
¿Por qué necesitas un firewall en tu servidor Linux?
Si tienes un servidor Linux, ya sea para alojar tu web, un blog, una aplicación o un proyecto personal, protegerlo es una prioridad absoluta. Internet está lleno de escáneres automáticos, bots y personas con malas intenciones que buscan constantemente puertos abiertos para intentar acceder. Un firewall linux es tu primera y más importante línea de defensa. Piensa en él como un portero virtual que decide quién entra y quién no a tu servidor. Sin un firewall, tu servidor está expuesto a ataques de fuerza bruta, accesos no autorizados y otras amenazas.
En esta guía extensa y práctica, aprenderás desde cero cómo proteger servidor linux usando dos de las herramientas más populares: iptables (el clásico y potente) y UFW (el más amigable para principiantes). Te explicaré conceptos, comandos y ejemplos paso a paso para que puedas implementar una seguridad sólida incluso si no tienes experiencia previa en administración de sistemas.
Entendiendo los conceptos básicos: puertos, tráfico y reglas
Antes de lanzarnos a los comandos, es esencial que comprendas qué es un puerto y cómo funciona el tráfico de red.
¿Qué es un puerto?
Imagina que tu servidor es un edificio de oficinas. La dirección IP es la dirección del edificio, pero para entrar a una oficina concreta necesitas un número de puerta. Cada servicio que corre en tu servidor (web, correo, SSH, base de datos) escucha en un puerto específico:
- Puerto 80 (HTTP): Tráfico web sin cifrar.
- Puerto 443 (HTTPS): Tráfico web cifrado.
- Puerto 22 (SSH): Acceso remoto seguro a la terminal.
- Puerto 21 (FTP): Transferencia de archivos (inseguro, mejor usa SFTP).
Un firewall permite o bloquea el tráfico según el puerto de destino, la IP de origen y el protocolo (TCP o UDP).
Políticas por defecto
Hay dos filosofías principales para configurar un firewall:
- Denegar todo por defecto, permitir solo lo necesario: Es la más segura. Bloqueas todo el tráfico entrante y luego abres únicamente los puertos que uses.
- Permitir todo por defecto, bloquear lo malo: Es menos segura porque asumes que todo es bueno hasta que demuestre lo contrario.
Siempre te recomendaré la primera opción. Es más trabajo al inicio, pero reduce drásticamente la superficie de ataque.
Opción 1: Proteger tu servidor con iptables (el firewall clásico)
iptables es el firewall nativo de Linux, presente en prácticamente todas las distribuciones. Es extremadamente potente y flexible, pero su sintaxis puede resultar críptica al principio. Sin embargo, una vez que entiendes la lógica, es muy eficiente.
¿Cómo funciona iptables?
Iptables organiza las reglas en cadenas (chains) dentro de tablas. La tabla más común es filter, que tiene tres cadenas principales:
- INPUT: Controla el tráfico que entra al servidor.
- OUTPUT: Controla el tráfico que sale del servidor.
- FORWARD: Controla el tráfico que pasa a través del servidor (como un router).
Para proteger servidor linux, nos centraremos en INPUT.
Paso 1: Verificar el estado actual
Antes de hacer cambios, mira las reglas actuales:
sudo iptables -L -n -v
Si no hay reglas, verás tres cadenas vacías. Esto significa que tu servidor está completamente abierto.
Paso 2: Establecer políticas por defecto restrictivas
Vamos a denegar todo el tráfico entrante y de reenvío, pero permitir todo el saliente (porque tu servidor necesita comunicarse hacia afuera):
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
[WARNING] Si ejecutas esto sin haber permitido antes el tráfico SSH, perderás la conexión remota. Asegúrate de estar en el servidor físicamente o de tener una sesión de consola abierta.
Paso 3: Permitir tráfico esencial
Ahora abrimos los puertos que necesitamos. Primero, permitimos el tráfico de bucle local (loopback), necesario para que los servicios internos se comuniquen:
sudo iptables -A INPUT -i lo -j ACCEPT
Luego, permitimos conexiones ya establecidas y relacionadas (esto evita bloquear respuestas a peticiones que hicimos):
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Ahora, el puerto más importante: SSH (puerto 22). Si cambiaste el puerto SSH, usa ese número:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[TIP] Para mayor seguridad, puedes limitar el acceso SSH solo a tu IP pública:
sudo iptables -A INPUT -p tcp --dport 22 -s TU_IP_PUBLICA -j ACCEPT
Reemplaza TU_IP_PUBLICA con tu dirección IP. Si tu IP cambia, tendrás que actualizarlo.
Paso 4: Abrir puertos para servicios web
Si tienes un servidor web (Apache, Nginx), abre los puertos HTTP y HTTPS:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Si usas Syspanel (el panel de control que antes se llamaba HestiaCP), recuerda que su interfaz web corre en el puerto 2106. Debes abrirlo:
sudo iptables -A INPUT -p tcp --dport 2106 -j ACCEPT
Paso 5: Proteger contra ataques comunes
Iptables permite añadir reglas avanzadas para mitigar ataques. Por ejemplo, limitar conexiones SSH para evitar fuerza bruta:
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Esto permite solo 4 intentos de conexión SSH por minuto desde la misma IP. Superado ese límite, la IP se bloquea temporalmente.
Paso 6: Guardar las reglas
Las reglas de iptables se pierden al reiniciar el servidor. Para hacerlas persistentes, usa:
- En Ubuntu/Debian:
sudo apt install iptables-persistenty luegosudo netfilter-persistent save - En CentOS/RHEL:
sudo service iptables save
Comandos útiles para iptables
| Comando | Descripción |
|---|---|
sudo iptables -L -n -v | Lista reglas con detalles |
sudo iptables -F | Borra todas las reglas (¡cuidado!) |
sudo iptables -A INPUT -s IP -j DROP | Bloquea una IP específica |
sudo iptables -D INPUT 3 | Elimina la regla número 3 de INPUT |
Opción 2: Proteger tu servidor con UFW (el firewall amigable)
UFW (Uncomplicated Firewall) es una capa de abstracción sobre iptables que facilita muchísimo la configuración. Es ideal si eres principiante o no quieres lidiar con la sintaxis compleja de iptables. Viene preinstalado en Ubuntu y muchas distribuciones basadas en Debian.
Paso 1: Instalar y habilitar UFW
Si no lo tienes, instálalo:
sudo apt update
sudo apt install ufw -y
Por defecto, UFW está deshabilitado. Para activarlo:
sudo ufw enable
[INFO] Al habilitar UFW, se aplican las reglas actuales. Si no has configurado nada, bloqueará todo el tráfico entrante y permitirá el saliente.
Paso 2: Configurar políticas por defecto
UFW ya trae políticas seguras por defecto (denegar entrante, permitir saliente). Puedes verificarlas con:
sudo ufw default deny incoming
sudo ufw default allow outgoing
Paso 3: Permitir servicios comunes
UFW usa nombres de aplicaciones predefinidos. Para ver los disponibles:
sudo ufw app list
Verás servicios como OpenSSH, Apache Full, Nginx Full, etc. Para permitir SSH:
sudo ufw allow OpenSSH
O puedes especificar el puerto directamente:
sudo ufw allow 22/tcp
Para un servidor web:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Para Syspanel (puerto 2106):
sudo ufw allow 2106/tcp
Paso 4: Limitar el acceso SSH a tu IP
Al igual que con iptables, puedes restringir SSH a una IP específica:
sudo ufw allow from TU_IP_PUBLICA to any port 22 proto tcp
Paso 5: Proteger contra fuerza bruta con rate limiting
UFW incluye una función llamada limit que aplica rate limiting automático. Para SSH:
sudo ufw limit ssh
Esto permite 6 conexiones cada 30 segundos desde la misma IP. Superado ese límite, la conexión se rechaza.
Paso 6: Verificar y gestionar reglas
Para ver el estado de UFW con todas las reglas activas:
sudo ufw status verbose
Para eliminar una regla, primero obtén el número de regla:
sudo ufw status numbered
Luego elimínala:
sudo ufw delete NUMERO_REGLA
Comandos esenciales de UFW
| Comando | Descripción |
|---|---|
sudo ufw status | Muestra estado y reglas |
sudo ufw enable | Activa el firewall |
sudo ufw disable | Desactiva el firewall (solo para pruebas) |
sudo ufw reload | Recarga la configuración |
sudo ufw logging on | Activa logs para depuración |
iptables vs UFW: ¿cuál elegir?
No hay una respuesta única, depende de tu perfil:
- Elige iptables si: Tienes experiencia, necesitas un control granular absoluto, o trabajas con sistemas que no tienen UFW (como CentOS minimal).
- Elige UFW si: Eres principiante, quieres algo rápido y seguro, o administras un servidor Ubuntu/Debian. UFW es perfecto para el 90% de los casos.
Ambos son excelentes. De hecho, UFW usa iptables por debajo, así que estás usando la misma tecnología, pero con una interfaz más amable.
Buenas prácticas adicionales para proteger servidor linux
El firewall es esencial, pero no es suficiente por sí solo. Aquí tienes una checklist de seguridad complementaria:
1. Mantén el sistema actualizado
Ejecuta regularmente:
sudo apt update && sudo apt upgrade -y
Las actualizaciones corrigen vulnerabilidades conocidas.
2. Cambia el puerto SSH
Edita /etc/ssh/sshd_config y cambia Port 22 por otro número (ej: 2222). Luego reinicia SSH: sudo systemctl restart sshd. No olvides actualizar tu firewall.
3. Desactiva el acceso root por SSH
En el mismo archivo, pon PermitRootLogin no. Crea un usuario normal con sudo y úsalo para administrar.
4. Usa autenticación por llaves SSH
Las contraseñas son débiles. Genera un par de llaves con ssh-keygen y copia la pública al servidor.
5. Monitorea los logs
Revisa /var/log/auth.log (Debian/Ubuntu) o /var/log/secure (CentOS) para ver intentos de acceso fallidos.
6. Considera Fail2ban
Fail2ban complementa tu firewall linux bloqueando IPs que muestren comportamientos maliciosos (múltiples intentos fallidos). Se integra perfectamente con iptables y UFW.
Preguntas frecuentes (FAQ)
¿Puedo tener iptables y UFW al mismo tiempo?
No es recomendable. UFW ya gestiona iptables. Si activas ambos por separado, pueden entrar en conflicto. Elige uno.
¿Cómo sé si mi firewall está funcionando?
Usa sudo ufw status (si usas UFW) o sudo iptables -L -n (para iptables). También puedes hacer un escaneo de puertos desde otra máquina con herramientas como nmap.
¿Qué hago si pierdo acceso SSH por el firewall?
Si estás en un datacenter, usa la consola remota (KVM/IPMI). Si es un VPS, muchos proveedores ofrecen acceso por consola web. Desde ahí, desactiva el firewall temporalmente con sudo ufw disable o sudo iptables -F.
¿El firewall afecta el rendimiento del servidor?
Mínimamente. Las reglas se procesan en el kernel de Linux y son muy eficientes. Unas pocas reglas no notarán diferencia.
¿Debo abrir el puerto 2106 para Syspanel?
Sí, si usas Syspanel (la herramienta de administración que antes era HestiaCP), necesitas abrir el puerto TCP 2106 para acceder a su interfaz web. Sin esa regla, no podrás gestionar tu servidor desde el panel.
Conclusión
Proteger servidor linux con un firewall no es opcional, es una necesidad. Ya sea que elijas la potencia de iptables o la simplicidad de UFW, lo importante es dar el primer paso. Empieza con una configuración restrictiva, abre solo los puertos imprescindibles (SSH, HTTP, HTTPS y el de Syspanel si lo usas), y ve ajustando según tus necesidades.
Recuerda: la seguridad es un proceso, no un destino. Revisa periódicamente tus reglas, mantén el sistema actualizado y complementa el firewall con otras herramientas como Fail2ban. Con esta guía, tienes todo lo necesario para blindar tu servidor Linux y dormir tranquilo sabiendo que tu portero virtual está haciendo bien su trabajo.
Si tienes dudas, revisa los logs, consulta la documentación oficial o pregunta en foros especializados. ¡Tu servidor te lo agradecerá!
