Configuración de iptables: Guía Completa

Introducción

iptables es el marco de filtrado de paquetes tradicional y poderoso que ha sido la piedra angular de la gestión de firewalls en Linux durante décadas. Como una utilidad de espacio de usuario para configurar el marco netfilter del kernel de Linux, iptables proporciona control integral sobre el tráfico de red, permitiendo a los administradores crear políticas de seguridad sofisticadas, implementar Traducción de Direcciones de Red (NAT), realizar reenvío de puertos y construir escenarios de enrutamiento complejos. A pesar de la aparición de alternativas más nuevas como nftables y firewalld, iptables sigue siendo ampliamente desplegado y profundamente comprendido en todo el ecosistema Linux, lo que lo convierte en una habilidad esencial para administradores de sistemas, profesionales de seguridad e ingenieros de red.

Entender iptables va más allá de simplemente bloquear o permitir tráfico—abarca filtrado de paquetes, seguimiento de conexiones (inspección con estado), traducción de direcciones de red, manipulación de paquetes y conformación de tráfico. Ya sea que esté fortaleciendo un solo servidor, construyendo firewalls empresariales, implementando arquitecturas DMZ o configurando aplicaciones complejas de múltiples niveles, iptables proporciona el control granular necesario para asegurar y optimizar las comunicaciones de red.

Esta guía completa cubre iptables desde los fundamentos hasta configuraciones avanzadas, incluyendo sintaxis de reglas, estructuras de tablas, procesamiento de cadenas, firewall con estado, configuraciones NAT, registro de eventos y solución de problemas. Al dominar iptables, obtendrá una comprensión profunda de la seguridad de red y el procesamiento de paquetes que se aplica en diversos entornos Linux y escenarios de seguridad.

Entendiendo la Arquitectura de iptables

Marco Netfilter

iptables es la interfaz de línea de comandos de espacio de usuario para el marco netfilter a nivel de kernel, que proporciona:

  • Filtrado de paquetes - Aceptar, descartar o rechazar paquetes basándose en reglas
  • NAT - Traducción de Direcciones de Red (SNAT, DNAT, enmascaramiento)
  • Manipulación de paquetes - Modificar encabezados de paquetes
  • Seguimiento de conexiones - Inspección de paquetes con estado

Tablas

iptables organiza las reglas en tablas según su función:

1. filter (Tabla predeterminada)

  • Propósito: Decisiones de filtrado de paquetes
  • Cadenas: INPUT, OUTPUT, FORWARD
  • Uso: Reglas de firewall estándar

2. nat

  • Propósito: Traducción de Direcciones de Red
  • Cadenas: PREROUTING, POSTROUTING, OUTPUT
  • Uso: Reenvío de puertos, enmascaramiento, NAT de origen

3. mangle

  • Propósito: Alteración de paquetes
  • Cadenas: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  • Uso: Modificar TOS, TTL, establecer marcas

4. raw

  • Propósito: Configurar excepciones del seguimiento de conexiones
  • Cadenas: PREROUTING, OUTPUT
  • Uso: Optimización de rendimiento, NOTRACK

5. security (SELinux)

  • Propósito: Reglas de Control de Acceso Obligatorio
  • Cadenas: INPUT, OUTPUT, FORWARD
  • Uso: Integración de políticas de SELinux

Cadenas

Las cadenas son listas de reglas procesadas secuencialmente:

Cadenas integradas:

  • INPUT - Paquetes destinados al sistema local
  • OUTPUT - Paquetes originados desde el sistema local
  • FORWARD - Paquetes enrutados a través del sistema
  • PREROUTING - Paquetes antes de la decisión de enrutamiento
  • POSTROUTING - Paquetes después de la decisión de enrutamiento

Cadenas definidas por el usuario:

  • Cadenas personalizadas para organizar conjuntos de reglas complejos
  • Llamadas desde cadenas integradas con el objetivo -j (saltar)

Flujo de Paquetes a través de iptables

Paquete Entrante
       ↓
   PREROUTING (nat, mangle, raw)
       ↓
   Decisión de Enrutamiento
    ↙     ↘
INPUT        FORWARD
(local)      (enrutador)
   ↓            ↓
Proceso        POSTROUTING
Local            ↓
   ↓          Saliente
OUTPUT
   ↓
POSTROUTING (nat, mangle)
   ↓
Paquete Saliente

Estructura de Reglas

iptables -t <tabla> -<acción> <cadena> <coincidencia> -j <objetivo>

Componentes:

  • -t tabla: Especificar tabla (predeterminado: filter)
  • -acción: -A (agregar), -I (insertar), -D (eliminar), -R (reemplazar)
  • cadena: INPUT, OUTPUT, FORWARD, etc.
  • coincidencia: Criterios para hacer coincidir paquetes
  • -j objetivo: Acción a realizar (ACCEPT, DROP, REJECT, LOG, etc.)

Requisitos Previos

Antes de configurar iptables, asegúrese de tener:

  • Acceso root o sudo al sistema Linux
  • Comprensión básica de redes TCP/IP
  • Conocimiento de los servicios y puertos que desea proteger
  • Acceso SSH (preferiblemente también acceso a consola/KVM)
  • Método de acceso de respaldo en caso de bloqueo
  • iptables instalado (generalmente preinstalado)

Verificar Instalación de iptables

# Verificar que iptables esté instalado
iptables --version

# Verificar reglas actuales
sudo iptables -L -n -v

# Ver reglas NAT
sudo iptables -t nat -L -n -v

Comandos Básicos de iptables

Visualización de Reglas

# Listar todas las reglas
sudo iptables -L

# Listar con números de línea
sudo iptables -L --line-numbers

# Listar con contadores de paquetes/bytes
sudo iptables -L -v

# Listar sin resolución DNS (más rápido)
sudo iptables -L -n

# Listar cadena específica
sudo iptables -L INPUT

# Listar todas las tablas y cadenas
sudo iptables -S

Agregar Reglas

# Agregar regla al final de la cadena
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Insertar regla en posición específica
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

# Insertar en número de línea
sudo iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT

Eliminar Reglas

# Eliminar por especificación
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# Eliminar por número de línea
sudo iptables -D INPUT 3

# Vaciar todas las reglas en cadena
sudo iptables -F INPUT

# Vaciar todas las reglas en todas las cadenas
sudo iptables -F

# Vaciar todas las reglas en todas las tablas
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

Establecer Políticas Predeterminadas

# Establecer política predeterminada para cadena
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP

# Ver políticas
sudo iptables -L | grep policy

Configuración Básica de Firewall

Permitir Acceso SSH Simple

# Permitir SSH (puerto 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

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

# Establecer política predeterminada
sudo iptables -P INPUT DROP

Configuración de Servidor Web

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

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

# Permitir SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

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

# Descartar todo lo demás
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

Script Completo de Firewall Básico

#!/bin/bash
# basic-firewall.sh

# Vaciar reglas existentes
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Establecer políticas predeterminadas
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

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

# Permitir conexiones establecidas y relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

# Permitir ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Registrar paquetes descartados
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables INPUT denied: " --log-level 7

echo "Firewall configurado exitosamente"

Criterios de Coincidencia Avanzados

Coincidencia de Protocolo

# Coincidir TCP
sudo iptables -A INPUT -p tcp -j ACCEPT

# Coincidir UDP
sudo iptables -A INPUT -p udp -j ACCEPT

# Coincidir ICMP
sudo iptables -A INPUT -p icmp -j ACCEPT

# Coincidir por número de protocolo
sudo iptables -A INPUT -p 6 -j ACCEPT  # TCP es protocolo 6

Coincidencia de Puerto

# Puerto de destino único
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Puerto de origen único
sudo iptables -A INPUT -p tcp --sport 1024 -j ACCEPT

# Rango de puertos
sudo iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT

# Múltiples puertos (requiere extensión multiport)
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

Coincidencia de Dirección IP

# Coincidir IP de origen
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT

# Coincidir IP de destino
sudo iptables -A INPUT -d 10.0.0.50 -j ACCEPT

# Coincidir subred
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# Excluir IP (no)
sudo iptables -A INPUT -s ! 192.168.1.100 -j DROP

Coincidencia de Interfaz

# Coincidir interfaz de entrada
sudo iptables -A INPUT -i eth0 -j ACCEPT

# Coincidir interfaz de salida
sudo iptables -A OUTPUT -o eth1 -j ACCEPT

# Múltiples interfaces (usar comodines)
sudo iptables -A INPUT -i eth+ -j ACCEPT

Coincidencia de Estado (Seguimiento de Conexiones)

# Permitir conexiones establecidas y relacionadas
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir nuevas conexiones
sudo iptables -A INPUT -m state --state NEW -j ACCEPT

# Descartar paquetes inválidos
sudo iptables -A INPUT -m state --state INVALID -j DROP

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

Estados de conexión:

  • NEW - Primer paquete de nueva conexión
  • ESTABLISHED - Parte de conexión existente
  • RELATED - Relacionado con conexión existente (ej., datos FTP)
  • INVALID - Paquete no pertenece a conexión conocida

Reglas Basadas en Tiempo

# Permitir acceso durante horario comercial
sudo iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT

# Permitir solo días laborables
sudo iptables -A INPUT -p tcp --dport 22 -m time --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

# Bloquear por la noche
sudo iptables -A INPUT -p tcp --dport 80 -m time --timestart 22:00 --timestop 06:00 -j DROP

Limitación de Velocidad

# Limitar conexiones por IP
sudo iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# Limitar nuevas conexiones por período de tiempo
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# Prevenir inundación SYN
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

Coincidencia de Dirección MAC

# Permitir dirección MAC específica
sudo iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT

# Bloquear MAC específica
sudo iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP

Traducción de Direcciones de Red (NAT)

NAT de Origen (SNAT) / Enmascaramiento

Enmascaramiento (SNAT dinámico):

# Habilitar reenvío de IP
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# Enmascarar tráfico saliente
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Permitir reenvío desde red interna
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

SNAT estático:

# Cambiar IP de origen a dirección específica
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.50

# SNAT para red de origen específica
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.50

NAT de Destino (DNAT) / Reenvío de Puertos

Reenviar puerto externo a servidor interno:

# Reenviar puerto 80 a servidor web interno
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80

# Reenviar puerto 443 a servidor interno
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443

# Permitir tráfico reenviado
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

Redirección de puerto (reenvío de puerto local):

# Redirigir puerto local 80 a 8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

# O para cadena OUTPUT (tráfico generado localmente)
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080

Configuración Completa de Enrutador NAT

#!/bin/bash
# nat-router.sh

# Habilitar reenvío de IP
sysctl -w net.ipv4.ip_forward=1

# Vaciar tabla NAT
iptables -t nat -F

# Enmascarar tráfico saliente
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Ejemplos de reenvío de puertos
# Reenviar SSH a servidor interno
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.10:22

# Reenviar tráfico web a servidor web
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.100:443

# Permitir reenvío
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 192.168.1.0/24 -j ACCEPT

Registro de Eventos

Registro Básico

# Registrar y descartar
sudo iptables -A INPUT -j LOG --log-prefix "iptables DROP: "
sudo iptables -A INPUT -j DROP

# Registrar con prefijo personalizado
sudo iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "TELNET attempt: "

# Establecer nivel de registro
sudo iptables -A INPUT -j LOG --log-level 4 --log-prefix "iptables: "

Niveles de registro:

  • 0 - emerg
  • 1 - alert
  • 2 - crit
  • 3 - err
  • 4 - warning
  • 5 - notice
  • 6 - info
  • 7 - debug

Registro con Limitación de Velocidad

# Prevenir inundación de registro
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
sudo iptables -A INPUT -j DROP

Registrar Eventos Específicos

# Registrar paquetes inválidos
sudo iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID packet: "

# Registrar nuevas conexiones SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "New SSH: "

# Registrar escaneos de puertos
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "Port scan: "

Ver Registros de iptables

# Ver registros de iptables en syslog
sudo tail -f /var/log/syslog | grep iptables

# O en messages
sudo tail -f /var/log/messages | grep iptables

# Usando journalctl
sudo journalctl -f | grep iptables

Cadenas Definidas por el Usuario

Crear Cadenas Personalizadas

# Crear nueva cadena
sudo iptables -N LOGGING

# Agregar reglas a cadena personalizada
sudo iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "iptables packet dropped: " --log-level 7
sudo iptables -A LOGGING -j DROP

# Saltar a cadena personalizada
sudo iptables -A INPUT -j LOGGING

Organizar Conjuntos de Reglas Complejos

# Crear cadenas específicas de servicio
sudo iptables -N SSH_CHECK
sudo iptables -N HTTP_CHECK

# Reglas de cadena SSH
sudo iptables -A SSH_CHECK -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
sudo iptables -A SSH_CHECK -p tcp --dport 22 -j ACCEPT

# Reglas de cadena HTTP
sudo iptables -A HTTP_CHECK -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# Saltar a cadenas desde INPUT
sudo iptables -A INPUT -p tcp --dport 22 -j SSH_CHECK
sudo iptables -A INPUT -p tcp --dport 80 -j HTTP_CHECK

Fortalecimiento de Seguridad

Protección Contra Ataques Comunes

Protección contra Inundación SYN:

# Limitar paquetes SYN
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

# O usando parámetros del kernel
sudo sysctl -w net.ipv4.tcp_syncookies=1

Protección contra Escaneo de Puertos:

# Detectar paquetes NULL
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Detectar paquetes XMAS
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Detectar escaneos sigilosos
sudo iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

Protección contra Ping de la Muerte:

# Limitar solicitudes de ping
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Descarte de Paquetes Inválidos:

# Descartar paquetes inválidos
sudo iptables -A INPUT -m state --state INVALID -j DROP

Protección contra Suplantación de IP:

# Bloquear paquetes de direcciones privadas en interfaz pública
sudo iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
sudo iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
sudo iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
sudo iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP

Protección contra Fuerza Bruta

# Limitar intentos de conexión SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

# Permitir después del límite de velocidad
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

Guardar y Restaurar Reglas

Ubuntu/Debian

Instalar iptables-persistent:

sudo apt update
sudo apt install iptables-persistent

Guardar reglas:

sudo netfilter-persistent save
# O manualmente
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

Restaurar reglas:

sudo netfilter-persistent reload
# O manualmente
sudo iptables-restore < /etc/iptables/rules.v4

CentOS/RHEL/Rocky Linux

Instalar iptables-services:

sudo dnf install iptables-services
sudo systemctl enable iptables

Guardar reglas:

sudo service iptables save
# O
sudo iptables-save > /etc/sysconfig/iptables

Restaurar reglas:

sudo systemctl restart iptables
# O
sudo iptables-restore < /etc/sysconfig/iptables

Guardar/Restaurar Manual

# Guardar reglas actuales
sudo iptables-save > /root/iptables-backup-$(date +%F).rules

# Restaurar desde archivo
sudo iptables-restore < /root/iptables-backup-2024-01-11.rules

# Probar antes de aplicar permanentemente
sudo iptables-restore --test < /root/iptables-backup-2024-01-11.rules

Solución de Problemas de iptables

Problemas Comunes

Bloqueado por SSH:

# Prevención: Siempre permitir SSH antes de establecer política DROP
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -P INPUT DROP

# Recuperación: Acceder vía consola/KVM y vaciar reglas
sudo iptables -F
sudo iptables -P INPUT ACCEPT

Las reglas no funcionan:

# Verificar orden de reglas (las reglas se procesan de arriba hacia abajo)
sudo iptables -L --line-numbers

# Verificar sintaxis de regla
sudo iptables -C INPUT -p tcp --dport 80 -j ACCEPT

# Verificar contadores
sudo iptables -L -v -n
# Poner a cero los contadores y volver a probar
sudo iptables -Z

Problemas de seguimiento de conexiones:

# Verificar tabla conntrack
sudo conntrack -L

# Aumentar tamaño de tabla conntrack
sudo sysctl -w net.netfilter.nf_conntrack_max=131072

# Ver conexiones actuales
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max

Herramientas de Depuración

Habilitar rastreo de paquetes:

# Instalar herramientas conntrack
sudo apt install conntrack

# Habilitar registro de tabla raw
sudo iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
sudo iptables -t raw -A OUTPUT -p tcp --dport 80 -j TRACE

# Ver rastreo en registros
sudo tail -f /var/log/kern.log | grep TRACE

Probar reglas:

# Usar nc para probar accesibilidad de puerto
nc -zv server-ip 80

# Desde host remoto
telnet server-ip 80

Mejores Prácticas

1. Siempre Permitir Loopback

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

2. Permitir Conexiones Establecidas Temprano

sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

3. Usar Reglas Explícitas Antes de la Política Predeterminada

# Permitir lo que necesita
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Luego denegar todo lo demás
sudo iptables -P INPUT DROP

4. Comentar Sus Reglas

sudo iptables -A INPUT -p tcp --dport 22 -m comment --comment "Allow SSH" -j ACCEPT

5. Probar Antes de Aplicar

# Crear script con reversión por tiempo de espera
#!/bin/bash
iptables-restore < /root/new-rules.txt
sleep 60
iptables-restore < /root/known-good-rules.txt

6. Documentar Su Configuración

Mantener documentación que incluya:

  • Propósitos de las reglas
  • Historial de cambios
  • Políticas de seguridad
  • Notas de solución de problemas

7. Respaldos Regulares

# Script de respaldo automatizado
#!/bin/bash
BACKUP_DIR="/root/iptables-backups"
mkdir -p $BACKUP_DIR
iptables-save > $BACKUP_DIR/iptables-$(date +%Y%m%d-%H%M%S).rules
# Mantener solo los últimos 30 días
find $BACKUP_DIR -name "iptables-*.rules" -mtime +30 -delete

Agregar a cron:

0 2 * * * /root/backup-iptables.sh

Ejemplo Completo de Firewall de Producción

#!/bin/bash
# production-firewall.sh

# Vaciar todas las reglas
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F

# Políticas predeterminadas
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Conexiones establecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Paquetes inválidos
iptables -A INPUT -m state --state INVALID -j DROP

# SSH con limitación de velocidad
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH brute force: "
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP (ping) con límite de velocidad
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Protección contra ataques
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

# Registrar paquetes descartados
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Guardar reglas
netfilter-persistent save

echo "Firewall configurado y guardado"

Conclusión

iptables sigue siendo una solución de firewall poderosa, flexible y ampliamente desplegada para sistemas Linux. Si bien herramientas más nuevas como nftables y firewalld ofrecen interfaces simplificadas, entender iptables proporciona una comprensión profunda del filtrado de paquetes, NAT, seguimiento de conexiones y seguridad de red que se aplica en diversos entornos y herramientas.

Puntos clave:

  • Las tablas organizan las reglas por función (filter, nat, mangle)
  • Las cadenas definen la dirección del tráfico (INPUT, OUTPUT, FORWARD)
  • El filtrado con estado mejora la seguridad y el rendimiento
  • Las capacidades NAT permiten enrutamiento y reenvío de puertos
  • Las cadenas personalizadas organizan conjuntos de reglas complejos
  • El registro y monitoreo apoyan la solución de problemas
  • El fortalecimiento de seguridad protege contra ataques comunes
  • La persistencia requiere guardar reglas para sobrevivir al reinicio

Domine iptables para construir configuraciones de firewall seguras y eficientes para servidores, gateways y arquitecturas de red complejas. Las habilidades y conceptos aprendidos a través de iptables proporcionan una base para entender los sistemas modernos de filtrado de paquetes y los principios de seguridad de red.

Para un aprendizaje continuo, explore nftables como el sucesor moderno, firewalld para gestión de nivel superior e integración con fail2ban para bloqueo dinámico basado en análisis de registros.