iptables: El Cortafuegos de Linux

El Cortafuegos Definitivo de Linux

¿Qué es iptables?

iptables es una utilidad de línea de comandos en sistemas operativos Linux que se utiliza para configurar las reglas de firewall. Actúa como la interfaz para el framework Netfilter del kernel de Linux, permitiendo a los administradores de sistemas definir cómo se debe manejar el tráfico de red, ya sea para permitirlo o denegarlo.

Datos Interesantes:

  • iptables fue desarrollado por Rusty Russell en 1998
  • Reemplazó a ipchains e ipfwadm en versiones anteriores de Linux
  • Actualmente está siendo gradualmente reemplazado por nftables en distribuciones modernas

¿Cómo funciona?

iptables opera a través de un sistema de tablas, cadenas y reglas.

Tablas

Son categorías que manejan diferentes tipos de procesamiento del tráfico. Las cuatro tablas principales son:

  • filter: La tabla por defecto, usada para filtrar paquetes. Aquí defines si aceptas, rechazas o eliminas el tráfico.
  • nat (Network Address Translation): Se usa para modificar las direcciones IP de origen o destino de los paquetes, lo cual es fundamental para el reenvío de puertos y compartir una única dirección IP pública entre varios equipos.
  • mangle: Se utiliza para alteraciones de paquetes más especializadas.
  • raw: Se encarga de los paquetes antes de que el sistema de seguimiento de conexiones entre en acción.

Cadenas

Son listas de reglas dentro de una tabla. Un paquete debe pasar por las reglas de una cadena para ser procesado. Las cadenas más comunes son:

  • INPUT: Controla los paquetes que llegan al sistema local.
  • OUTPUT: Controla los paquetes que se originan en el sistema local.
  • FORWARD: Controla los paquetes que se enrutan a través del sistema hacia otro destino.

Reglas

Son las instrucciones individuales dentro de una cadena. Cada regla especifica una condición (por ejemplo, una dirección IP de origen o un puerto de destino) y una acción a tomar si se cumple la condición (por ejemplo, ACCEPT - aceptar, DROP - eliminar, o REJECT - rechazar).

Usos comunes

iptables se usa ampliamente para:

  • Seguridad: Bloquear accesos no deseados desde internet a un servidor o computadora.
  • Administración de red: Configurar el reenvío de puertos, el balanceo de carga y otros servicios de red.
  • Inspección de paquetes: Analizar y registrar el tráfico de red para solucionar problemas o realizar auditorías de seguridad.

Instalación y Verificación

Instalación

En la mayoría de las distribuciones Linux, iptables viene preinstalado. Si no es el caso:

Ubuntu/Debian

sudo apt update && sudo apt install iptables

CentOS/RHEL/Fedora

sudo yum install iptables
# o
sudo dnf install iptables

Arch Linux

sudo pacman -S iptables

Verificar Estado

# Verificar si iptables está funcionando
sudo iptables -L -v -n

# Verificar versión
iptables --version

Sintaxis Básica

La sintaxis general de iptables sigue este patrón:

iptables [-t tabla] [acción] [cadena] [criterios] -j [target]

Parámetros Principales

Los parámetros más comunes incluyen:

  • -t: Especifica la tabla (-t filter por defecto)
  • -A: Agregar regla al final
  • -I: Insertar regla en posición específica
  • -D: Eliminar regla
  • -s: Dirección IP origen
  • -d: Dirección IP destino
  • -p: Protocolo (tcp, udp, icmp)
  • --dport: Puerto destino
  • --sport: Puerto origen

Ejemplos Prácticos

Permitir SSH

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

# Permitir SSH solo desde una IP específica
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT

Configurar Servidor Web

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

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

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

Bloquear IP Específica

# Bloquear una IP específica
sudo iptables -A INPUT -s 192.168.1.50 -j DROP

# Bloquear un rango de IPs
sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP

Configuraciones Avanzadas

NAT (Network Address Translation)

# SNAT - Cambiar IP origen (para salida a Internet)
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1

# MASQUERADE - Para IPs dinámicas
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# DNAT - Redirección de puertos
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

Port Forwarding

# Redirigir puerto 8080 externo al 80 interno
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.10 --dport 80 -j SNAT --to-source 192.168.1.1

Persistencia de Reglas

Ubuntu/Debian

# Instalar iptables-persistent
sudo apt install iptables-persistent

# Guardar reglas actuales
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

# Restaurar reglas
sudo iptables-restore < /etc/iptables/rules.v4

CentOS/RHEL

# Guardar reglas
sudo service iptables save

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

# Habilitar servicio
sudo systemctl start iptables

Mejores Prácticas

Seguridad

  • Principio de menor privilegio: Denegar todo por defecto, permitir solo lo necesario
  • Orden de reglas: Las reglas más específicas primero
  • Logging: Registrar tráfico rechazado para análisis
  • Rate limiting: Proteger contra ataques de denegación de servicio

Precauciones

  • Siempre mantener una regla de acceso SSH antes de aplicar políticas restrictivas
  • Probar reglas en entorno de desarrollo antes de producción
  • Mantener respaldos de configuraciones funcionales
  • Documentar cambios y propósito de cada regla

Configuración Típica

#!/bin/bash
# Configuración básica de iptables para servidor web

# Limpiar reglas existentes
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

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

# Permitir loopback
iptables -I INPUT 1 -i lo -j ACCEPT

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

# SSH (puerto 22) - SIEMPRE PRIMERO
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

# Ping (ICMP)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

echo "Configuración de iptables aplicada correctamente"

Conclusión

iptables sigue siendo una herramienta fundamental para la seguridad en Linux, ofreciendo un control granular sobre el tráfico de red. Aunque las distribuciones más modernas están migrando hacia nftables, el conocimiento de iptables permanece relevante debido a:

  • Su amplia adopción en sistemas existentes
  • La abundante documentación y ejemplos disponibles
  • Su estabilidad y confiabilidad probada
  • La compatibilidad hacia atrás que mantienen las nuevas herramientas