Saltar a contenido

Configuración del firewall básico de Linux iptables

En este artículo

iptables es el marco integrado para filtrar y gestionar el tráfico de red en el kernel de Linux. Permite un control flexible sobre las conexiones entrantes, salientes y de tránsito basándose en reglas.

Nota

iptables viene preinstalado en casi todas las distribuciones de Linux.
En sistemas más recientes (RHEL 8+, Ubuntu 20.04+), el predeterminado puede ser nftables (el comando nft), pero iptables sigue siendo compatible a través de la interfaz legacy iptables-legacy.
Para servidores en la nube o VPS, configurar iptables es críticamente importante para la seguridad.

Conceptos básicos

Tres cadenas (chains)

Cadena Propósito
INPUT Tráfico entrante al servidor (SSH, HTTP, etc.)
OUTPUT Tráfico saliente desde el servidor (actualizaciones, solicitudes API)
FORWARD Tráfico que atraviesa el servidor (solo cuando hay enrutamiento/NAT)

Nota

¡Tenga cuidado con INPUT!
Bloquear el puerto 22 sin precaución puede desconectarlo del servidor. Revise siempre las reglas antes de aplicarlas.

Cómo funciona

  1. Un paquete entra en la cadena apropiada INPUT, OUTPUT, FORWARD.
  2. Las reglas se evalúan en orden: tan pronto como se encuentra una coincidencia, se realiza la acción especificada.
  3. Si no se encuentra ninguna coincidencia, se aplica la política predeterminada policy.

Acciones (targets)

Acción Comportamiento Recomendación
ACCEPT Permitir el paquete Para servicios de confianza (SSH, HTTP)
DROP Descartar silenciosamente el paquete (sin respuesta) ****Mejor opción para la seguridad**** — oculta la existencia del puerto
REJECT Rechazar con un error ICMP (p. ej., port-unreachable) Úselo si necesita retroalimentación (p. ej., para depuración)

Nota

Regla de seguridad
De forma predeterminada: denegar todo, luego permitir solo lo necesario.

Sintaxis básica de comandos

iptables [opciones] CADENA [criterios] -j ACCIÓN

Opciones principales:

Opción Propósito
-A Agregar una regla al final de la cadena
-I Insertar una regla al principio (o en un número específico: -I INPUT 1)
-D Eliminar una regla (por número o copiando la línea)
-L Listar reglas
-F Borrar todas las reglas de la cadena
-P Establecer política predeterminada ACCEPT, DROP)

Criterios de uso frecuente:

Opción Ejemplo Descripción
-p tcp/udp/icmp -p tcp Protocolo
--dport N --dport 22 Puerto de destino
-s IP/MÁSCARA -s 192.168.1.5<br-s 203.0.113.0/24 Origen (IP o subred)
-i interfaz -i eth0 Interfaz entrante
-m state --state NEW,ESTABLISHED -m state --state NEW Estado de la conexión
-m connlimit --connlimit-above 5 Límite de conexiones

Visualización y solución de problemas

Mostrar todas las reglas (legible):

sudo iptables -L -n -v --line-numbers
- -n: no resolver nombres (más rápido); - -v: salida detallada; - --line-numbers: mostrar números de regla (útil para la eliminación).

Ver políticas predeterminadas:

sudo iptables -S | grep '^:'
# O:
sudo iptables -L | head -3

Ejemplos prácticos de reglas

1. Configuración básica segura (¡recomendada!)

# 1. Permitir todo el tráfico en loopback
sudo iptables -A INPUT -i lo -j ACCEPT


# 2. Permitir conexiones ya establecidas (¡importante!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


# 3. Permitir SSH (¡reemplace 22 con su puerto si lo ha cambiado!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT


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


# 5. Descartar todo lo demás de forma predeterminada
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT   # ← generalmente permitir salida

2. Restricción de acceso

# Permitir MySQL (3306) solo desde una IP
sudo iptables -A INPUT -s 203.0.113.15 -p tcp --dport 3306 -j ACCEPT


# Bloquear todo el tráfico desde una IP sospechosa
sudo iptables -A INPUT -s 198.51.100.77 -j DROP

3. Protección contra ataques

# Bloquear paquetes malformados/inválidos
sudo iptables -A INPUT -m state --state INVALID -j DROP


# Proteger contra SYN‑flood
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP


# Limitar conexiones a HTTP (no más de 20 simultáneas desde una IP)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP

4. Registro (Logging)

# Registrar intentos de conexión a puertos cerrados (los primeros 5 por minuto)
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 \
  -m limit --limit 5/min -j LOG --log-prefix "PORT-SCAN: " --log-level 4


# Luego descartar
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 -j DROP

Guardar reglas después del reinicio

Las reglas de iptables no se guardan automáticamente: solo residen en la memoria del kernel.

Para RHEL / CentOS 7 y anteriores:

sudo /sbin/service iptables save
# o
sudo iptables-save > /etc/sysconfig/iptables

Para Debian / Ubuntu:

Instale el paquete de persistencia:

sudo apt update && sudo apt install iptables-persistent
Durante la instalación, el sistema le pedirá que guarde las reglas actuales: elija "Yes".

Actualizar las reglas guardadas más tarde:

sudo netfilter-persistent save
# o directamente:
sudo iptables-save > /etc/iptables/rules.v4

Nota

Antes de reiniciar, verifique las reglas:

sudo iptables-restore -t < /etc/iptables/rules.v4
La marca -t es solo para verificar la sintaxis, no se aplica nada.

Eliminar reglas

Eliminar por número (vea --line-numbers):

sudo iptables -D INPUT 3   # eliminar la regla #3 en la cadena INPUT

Eliminar por coincidencia exacta:

sudo iptables -D INPUT -s 198.51.100.77 -j DROP

Borrar una cadena:

sudo iptables -F INPUT      # solo INPUT
sudo iptables -F            # todas las cadenas

Restablecer políticas predeterminadas:

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

Información

  1. Pruebe las reglas localmente o a través de la consola (¡no por SSH!), especialmente al cambiar INPUT.
  2. Use screen o tmux para no perder la sesión en caso de error.
  3. Considere migrar a herramientas más modernas:

    • ufw: interfaz simplificada para iptables (Ubuntu/Debian);
    • firewalld: firewall dinámico para RHEL/CentOS;
    • nftables: el futuro del kernel de Linux (sintaxis más eficiente y concisa).
question_mark
Is there anything I can help you with?
question_mark
AI Assistant ×