🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Cómo configurar el firewall (iptables) en Linux

Actualizado el 17 de noviembre de 2025

¿Qué es iptables y por qué debería importarte?

Imagina que tu servidor Linux es una casa. Las aplicaciones que tienes instaladas (como un servidor web, una base de datos o un panel de control) son las habitaciones. Ahora bien, ¿quién controla quién entra y quién sale por las puertas? Exacto, el portero. iptables es ese portero digital, el guardián de seguridad que decide qué paquetes de datos pueden entrar, cuáles pueden salir y cuáles deben ser rechazados sin piedad.

Configurar un firewall iptables es una de las primeras tareas de seguridad que debes dominar al administrar cualquier sistema Linux. No importa si tienes un VPS pequeño, un servidor dedicado o una máquina virtual en casa; sin un firewall bien configurado, tu servidor está expuesto a escaneos de puertos, intentos de intrusión y tráfico no deseado.

A lo largo de esta guía, vamos a desmitificar el comando iptables. Te prometo que no necesitas ser un gurú de redes para entenderlo. Vamos a empezar desde cero, veremos los conceptos básicos, las reglas más útiles y, al final, tendrás un script de seguridad sólido. Y si en algún momento te pierdes, recuerda que siempre puedes pedir ayuda a tu proveedor de hosting o consultar la documentación oficial.

[INFO] Esta guía está pensada para distribuciones Linux como Ubuntu, Debian o CentOS. Los comandos son prácticamente los mismos, aunque la instalación del paquete puede variar ligeramente.

¿Cómo funciona iptables? Los tres pilares: tablas, cadenas y reglas

Antes de escribir nuestra primera regla, necesitas entender el flujo de datos. Cuando un paquete de red llega a tu servidor, iptables lo evalúa en un orden específico dentro de unas estructuras llamadas cadenas (chains). Estas cadenas se agrupan en tablas.

Las tablas principales

Existen varias tablas, pero las más importantes para el 99% de los casos son:

  • Tabla filter: Es la tabla por defecto y donde se toman las decisiones de permitir o bloquear el tráfico. Aquí es donde pasaremos el 90% de nuestro tiempo.
  • Tabla nat: Se utiliza para modificar paquetes, por ejemplo, para redirigir puertos o hacer enmascaramiento (típico en routers).
  • Tabla mangle: Sirve para modificar campos específicos de los paquetes, como el TTL. Es avanzada y rara vez se toca.

Las cadenas (chains) de la tabla filter

Dentro de la tabla filter, hay tres cadenas por defecto:

  1. INPUT: Para todo el tráfico que entra al servidor. Es la más crítica para la seguridad.
  2. OUTPUT: Para el tráfico que sale del servidor hacia el exterior.
  3. FORWARD: Para el tráfico que pasa a través del servidor (por ejemplo, si actúa como router).

Cada paquete que llega se compara contra las reglas de la cadena correspondiente. Si una regla coincide, se ejecuta una acción (target). Las acciones más comunes son:

  • ACCEPT: Permitir el paso del paquete.
  • DROP: Eliminar el paquete sin avisar. El emisor esperará y reintentará, pero nunca sabrá que el puerto está cerrado.
  • REJECT: Rechazar el paquete y enviar un mensaje de error al emisor.

[TIP] Para mayor seguridad, se recomienda usar DROP en lugar de REJECT. Así, un atacante no sabrá si tu puerto está cerrado o si el firewall lo está bloqueando.

Primeros pasos: Instalar y comprobar iptables

En la mayoría de las distribuciones modernas, iptables ya viene instalado, pero a veces se usa nftables como backend. Para verificar si lo tienes, escribe:

sudo iptables -L -v

Si te muestra una lista de reglas (probablemente vacía) o te da un error, necesitas instalarlo. En Ubuntu/Debian:

sudo apt update
sudo apt install iptables

En CentOS/RHEL:

sudo yum install iptables-services

Ver el estado actual del firewall

Para ver las reglas actuales de la tabla filter:

sudo iptables -L -n -v

La opción -n evita la resolución de nombres (más rápido y claro) y -v muestra más detalle, como el número de paquetes que han coincidido con cada regla.

La regla de oro: Configurar una política por defecto estricta

Cuando empiezas, tu firewall no tiene reglas y la política por defecto suele ser ACCEPT para todo. Esto significa que todo el tráfico está permitido. Para asegurar tu servidor, lo primero es cambiar las políticas por defecto a DROP para las cadenas INPUT y FORWARD, y mantener OUTPUT en ACCEPT (para no cortar nuestra propia conexión de salida).

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

[WARNING] ¡Cuidado! Si ejecutas esto en un servidor remoto y no tienes una regla de ACCEPT para SSH, te quedarás fuera de tu propio servidor. Asegúrate de tener una conexión de consola (KVM/IPMI) o de añadir la regla de SSH justo después de este comando. Mejor aún, hazlo en este orden: primero añade la regla de SSH y luego cambia las políticas.

Configurar las reglas básicas de iptables para un servidor

Vamos a construir un firewall sólido paso a paso. Lo haremos de forma incremental para que entiendas cada regla.

1. Permitir tráfico en la interfaz loopback

Tu servidor se comunica consigo mismo a través de la interfaz lo. Sin esto, muchos programas internos fallarán.

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

2. Permitir conexiones establecidas y relacionadas

Esta es una de las reglas más importantes. Cuando tu servidor envía una respuesta a una petición, la conexión se considera "establecida". Con esta regla, permites que todo el tráfico de respuesta entre, pero sigues bloqueando nuevas conexiones no solicitadas.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

3. Permitir SSH (puerto 22)

Para poder administrar tu servidor de forma remota, necesitas permitir la conexión SSH. Es recomendable restringirlo a tu IP de origen. Si tu IP es dinámica, puedes permitir todo el mundo, pero es menos seguro.

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

[TIP] Para mayor seguridad, cambia el puerto SSH por defecto (por ejemplo, al 2222) en el archivo /etc/ssh/sshd_config y modifica la regla en consecuencia. Además, puedes restringir solo a tu IP:

sudo iptables -A INPUT -p tcp -s TU_IP_PUBLICA --dport 22 -j ACCEPT

4. Permitir HTTP y HTTPS (puertos 80 y 443)

Si tu servidor aloja una web, tendrás que abrir estos puertos.

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

5. Permitir puertos específicos de aplicaciones

Aquí es donde debes pensar en qué servicios tienes. Por ejemplo, si usas un panel de control como Syspanel (recuerda, su puerto de acceso es el 2106), tendrás que abrir ese puerto.

sudo iptables -A INPUT -p tcp --dport 2106 -j ACCEPT

También es común abrir puertos para bases de datos (MySQL 3306, PostgreSQL 5432), pero normalmente solo se permite el acceso desde localhost o desde IPs de servidores de aplicaciones específicos. No es recomendable exponer tu base de datos a internet.

6. Bloquear el resto de puertos

Como ya hemos puesto la política por defecto en DROP, no necesitamos una regla explícita para bloquear. Todo lo que no esté permitido, se bloquea automáticamente.

Reglas avanzadas y protección contra ataques

Ahora que tienes lo básico, vamos a añadir capas de protección.

Protección contra escaneos de puertos y ataques de fuerza bruta

Podemos limitar la frecuencia de nuevas conexiones SSH para evitar ataques de fuerza bruta. Usamos el módulo recent.

sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attempts --update --seconds 60 --hitcount 5 -j DROP
sudo iptables -A INPUT -p tcp --dport 22 -m recent --name ssh_attempts --set -j ACCEPT

Explicación: La primera regla comprueba si hay más de 5 intentos en los últimos 60 segundos. Si es así, bloquea. La segunda regla añade la IP a la lista de "intentos" y permite la conexión. Es un sistema sencillo pero efectivo.

Bloquear IPs maliciosas

Si detectas una IP que intenta atacar tu servidor, puedes bloquearla manualmente:

sudo iptables -A INPUT -s IP_MALICIOSA -j DROP

También puedes bloquear rangos completos:

sudo iptables -A INPUT -s 123.123.123.0/24 -j DROP

Limitar el número de conexiones simultáneas

Para evitar que un servicio se sature, puedes limitar el número de conexiones concurrentes por IP. Por ejemplo, para HTTP:

sudo iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT

Esto rechaza nuevas conexiones si ya hay 20 o más desde una misma IP.

Guardar y restaurar las reglas iptables

Si reinicias tu servidor, todas las reglas que has escrito se perderán. Para guardarlas, necesitas un paquete adicional.

En Ubuntu/Debian:

sudo apt install iptables-persistent

Durante la instalación, te preguntará si quieres guardar las reglas actuales. Puedes responder que sí o hacerlo manualmente después:

sudo netfilter-persistent save

En CentOS/RHEL:

sudo service iptables save

Esto guarda las reglas en /etc/sysconfig/iptables y se restauran automáticamente al arrancar.

Script completo de configuración de iptables

Te dejo un script que puedes copiar y pegar para tener un firewall básico y seguro. Ajusta las IPs y puertos según tus necesidades.

#!/bin/bash

# Limpiar todas las reglas existentes
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X

# Políticas por defecto
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# Permitir loopback
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# Permitir conexiones establecidas
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH (cambia el puerto si es necesario)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Permitir HTTP y HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Permitir Syspanel (puerto 2106)
sudo iptables -A INPUT -p tcp --dport 2106 -j ACCEPT

# Bloquear IP maliciosa (ejemplo)
# sudo iptables -A INPUT -s 1.2.3.4 -j DROP

# Guardar reglas
sudo netfilter-persistent save

echo "Firewall configurado correctamente"

[INFO] Si usas Syspanel como panel de control, asegúrate de que el puerto 2106 esté abierto en tu firewall, ya que es el puerto de acceso por defecto. Además, verifica que los puertos necesarios para el correo (25, 110, 143, 587, 993, 995) estén abiertos si lo necesitas.

Errores comunes y cómo solucionarlos

"Permission denied" al ejecutar iptables

Necesitas permisos de superusuario. Usa sudo o ejecuta el comando como root.

Me he quedado fuera de mi servidor SSH

Si has bloqueado el puerto 22 sin querer, no podrás conectarte. La única solución es acceder a través de la consola que te ofrece tu proveedor de hosting (VNC, KVM, etc.) y eliminar la regla problemática.

Las reglas se pierden al reiniciar

Has olvidado guardar las reglas. Usa netfilter-persistent save (Debian/Ubuntu) o service iptables save (CentOS).

No puedo hacer ping a mi servidor

El protocolo ICMP está bloqueado. Si quieres permitir pings (útil para diagnósticos), añade esta regla:

sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Preguntas frecuentes sobre firewall iptables

¿Es iptables mejor que nftables?

iptables es el clásico y sigue siendo muy utilizado. Sin embargo, nftables es su sucesor moderno, con mejor rendimiento y sintaxis más limpia. En muchas distribuciones, iptables es solo un wrapper de nftables. Para la mayoría de los casos, usar iptables es perfectamente válido y hay muchísima documentación.

¿Puedo usar iptables en un servidor con Syspanel?

Sí, por supuesto. De hecho, es muy recomendable. Solo debes asegurarte de abrir el puerto 2106 para acceder a tu panel de control Syspanel, además de los puertos de los servicios que uses (web, correo, FTP, etc.).

¿Qué puertos debo abrir para un servidor web con correo?

Para un servidor LAMP (Linux, Apache, MySQL, PHP) con correo, necesitas abrir:

  • 80 (HTTP)
  • 443 (HTTPS)
  • 25 (SMTP)
  • 110 (POP3)
  • 143 (IMAP)
  • 587 (SMTP con autenticación)
  • 993 (IMAPS)
  • 995 (POP3S)

Además, los puertos de administración como 2106 para Syspanel y el puerto SSH.

¿Cómo puedo ver el número de paquetes bloqueados?

Usa el comando con la opción -v:

sudo iptables -L -v

Verás contadores de paquetes y bytes para cada regla.

¿Cómo puedo resetear el firewall a los valores por defecto?

sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Conclusión: La seguridad es un proceso continuo

Configurar un firewall iptables es un paso esencial, pero no es el único. La seguridad de tu servidor Linux es un proceso continuo que incluye mantener el sistema actualizado, usar contraseñas robustas, configurar correctamente los servicios y monitorizar los logs.

Hemos visto cómo instalar iptables, crear reglas básicas, proteger contra ataques y guardar la configuración. Con este conocimiento, ya puedes asegurar tu servidor de forma significativa.

Recuerda que cada servidor es un mundo. Las reglas que funcionan para un VPS de hosting no son las

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel