Iptables es la herramienta clásica de filtrado de paquetes en Linux. Aunque hoy en día existen frontends como firewalld o ufw, iptables sigue siendo ampliamente utilizado y su conocimiento es fundamental para comprender el funcionamiento interno del cortafuegos del kernel.
En el examen LFCS, es probable que debas configurar reglas de iptables directamente, entender el flujo de paquetes y hacer persistentes tus configuraciones.
24.1. Introducción a Iptables
Iptables opera a nivel del kernel (a través del framework Netfilter) y permite definir reglas que aceptan, rechazan o transforman paquetes de red según criterios como dirección IP, puerto, protocolo, interfaz, estado de conexión, etc.
24.1.1. Tablas y cadenas
Iptables organiza las reglas en tablas, cada una con un propósito específico:
- filter: tabla por defecto, usada para el filtrado de paquetes (ACCEPT, DROP, REJECT).
- nat: para traducción de direcciones de red (SNAT, DNAT, masquerade).
- mangle: alteración de paquetes (TOS, TTL, marcado).
- raw: para configurar excepciones de seguimiento de conexiones.
- security: para reglas de control de acceso obligatorio (SELinux).
Dentro de cada tabla hay cadenas predefinidas:
- INPUT: paquetes destinados al propio sistema.
- OUTPUT: paquetes generados localmente.
- FORWARD: paquetes enrutados a través del sistema (cuando actúa como router).
- PREROUTING (en nat/mangle): modifica paquetes antes de enrutar.
- POSTROUTING (en nat/mangle): modifica paquetes después de enrutar.
En la práctica, la mayoría de las configuraciones se realizan en la tabla filter, cadenas INPUT, OUTPUT y FORWARD.
24.2. Sintaxis básica de iptables
El comando general es:
iptables [-t tabla] comando [criterios] -j ACCIÓN
Si no se especifica -t, se asume la tabla filter.
24.2.1. Comandos principales
-L: listar reglas.-A: añadir regla al final de una cadena.-I: insertar regla al inicio (o en una posición concreta).-D: eliminar una regla.-F: vaciar (flush) todas las reglas de una cadena o de todas.-P: establecer la política por defecto de una cadena.-N: crear una cadena definida por el usuario.-X: eliminar una cadena definida por el usuario.-Z: poner a cero los contadores.
24.2.2. Criterios de coincidencia
-p protocolo: tcp, udp, icmp, all.-s dirección: dirección de origen (puede ser IP, red CIDR, o nombre).-d dirección: dirección de destino.--sport puerto: puerto de origen (requiere-p tcpo-p udp).--dport puerto: puerto de destino.-i interfaz: interfaz de entrada (solo INPUT, FORWARD, PREROUTING).-o interfaz: interfaz de salida (solo OUTPUT, FORWARD, POSTROUTING).-m estado --state ESTADO: coincidencia por estado de conexión (NEW, ESTABLISHED, RELATED, INVALID). Requiere módulo conntrack.--tcp-flags: para flags TCP específicos (SYN, ACK, etc.).--icmp-type: tipo de ICMP (echo-request, echo-reply, etc.).-m multiport --dports: múltiples puertos separados por comas.-m iprange --src-range: rango de IPs.-m limit --limit: limitar tasa de paquetes (útil para protección DoS).
24.2.3. Acciones (targets)
ACCEPT: permitir el paquete.DROP: descartar silenciosamente.REJECT: descartar y enviar un ICMP de error (más informativo).LOG: registrar el paquete en syslog y continuar evaluando reglas.MASQUERADE: NAT dinámico (para interfaces con IP variable).SNAT: NAT estático (IP fija).DNAT: redirigir a un destino interno.REDIRECT: redirigir a un puerto local.
24.3. Políticas por defecto
Las cadenas tienen una política por defecto que se aplica si ningún regla coincide. Se define con -P:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Precaución: si pones DROP en INPUT y no permites explícitamente el tráfico de red (incluido el que ya está establecido), puedes perder la conexión SSH.
24.4. Configuración básica de un cortafuegos
24.4.1. Reglas típicas para un servidor
Estas reglas convierten al equipo en un servidor seguro, permitiendo solo lo necesario:
# Limpiar reglas y establecer políticas
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Permitir tráfico de loopback
iptables -A INPUT -i lo -j ACCEPT
# Permitir conexiones ya establecidas y relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Permitir SSH (puerto 22) desde una red de confianza
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# Permitir HTTP y HTTPS para todos
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Permitir ping (ICMP echo-request) desde red local
iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.1.0/24 -j ACCEPT
# El resto se deniega por la política DROP
24.4.2. Reglas para un router NAT
Si el equipo actuará como router y debe enmascarar el tráfico de la red interna:
# Activar reenvío de IP (temporal)
sysctl -w net.ipv4.ip_forward=1
# Limpiar y políticas
iptables -F
iptables -t nat -F
iptables -P FORWARD DROP
# Permitir reenvío de la red interna hacia el exterior
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
# NAT masquerade en la interfaz de salida
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
24.5. Gestión de reglas
24.5.1. Listar reglas
iptables -L -n -v --line-numbers
-n: no resolver nombres (más rápido).-v: información detallada (contadores).--line-numbers: muestra números de línea para insertar/eliminar.
24.5.2. Insertar una regla en una posición
iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
Inserta al principio de la cadena INPUT.
24.5.3. Eliminar una regla
Por línea (usando --line-numbers):
iptables -D INPUT 3
O especificando la regla completa:
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
24.5.4. Reemplazar una regla
iptables -R INPUT 2 -p tcp --dport 2222 -j ACCEPT
24.5.5. Guardar y restaurar reglas
Las reglas de iptables no persisten por defecto. Para guardarlas:
- En Debian/Ubuntu, se puede usar
iptables-save > /etc/iptables/rules.v4y restaurarlas coniptables-restore < /etc/iptables/rules.v4. Se puede automatizar con el paqueteiptables-persistent. - En RHEL/CentOS, el servicio
iptablesguarda en/etc/sysconfig/iptables(si se usasystemctl). También se puede usariptables-saveyiptables-restore.
Comandos de guardado:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
Restaurar:
iptables-restore < /etc/iptables/rules.v4
24.6. Redirección de puertos con DNAT
Para redirigir tráfico del puerto 80 a un servidor interno (ej. 192.168.1.5) en el puerto 8080:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.5:8080
Además, se debe permitir el reenvío:
iptables -A FORWARD -p tcp --dport 8080 -d 192.168.1.5 -j ACCEPT
24.7. Registro de paquetes
Para registrar paquetes antes de descartarlos:
iptables -A INPUT -p tcp --dport 23 -m limit --limit 5/min -j LOG --log-prefix "SSH Intento: "
iptables -A INPUT -p tcp --dport 23 -j DROP
Los logs van a syslog (normalmente /var/log/syslog o /var/log/messages).
24.8. Solución de problemas
- Verificar reglas cargadas:
iptables -L -n -v - Probar conectividad:
ping,nc -zv host puerto,telnet. - Registrar tráfico rechazado: añadir reglas LOG antes de DROP.
- Revisar logs del kernel:
dmesg | tailojournalctl -k. - Contadores:
iptables -L -n -vmuestra cuántos paquetes coinciden con cada regla, lo que ayuda a diagnosticar.
Cuidado con bloquearse a uno mismo: al establecer política DROP en INPUT, asegúrate de permitir primero las conexiones SSH y las establecidas. Si pierdes acceso, desde la consola física puedes limpiar reglas con iptables -F y iptables -P INPUT ACCEPT.
24.9. Ejercicios prácticos
Políticas básicas: 1.1. Establece políticas DROP para INPUT y FORWARD, ACCEPT para OUTPUT. 1.2. Permite tráfico de loopback. 1.3. Permite conexiones establecidas y relacionadas. 1.4. Permite SSH solo desde tu red local. 1.5. Prueba desde fuera de la red (si puedes) que el acceso se deniega.
Permitir servicios: Añade reglas para permitir HTTP, HTTPS y DNS saliente. Luego, verifica con
curlydig.Protección contra pings: Deniega todos los pings entrantes (
-p icmp --icmp-type echo-request -j DROP). Luego, prueba conping. Luego elimina la regla y permite solo desde localhost.NAT y reenvío: Configura un router NAT con MASQUERADE en la interfaz de salida y reenvío entre dos redes simuladas (usa máquinas virtuales o contenedores). Luego, comprueba que los clientes internos pueden acceder a Internet.
Redirección de puertos: Usa DNAT para redirigir el puerto 8080 del router a un servidor web interno en el puerto 80. Luego, configura FORWARD y prueba con
curl.Persistencia: Guarda tus reglas con
iptables-saveen un archivo. Reinicia el servicio o el sistema (según el entorno) y restaura coniptables-restore. Verifica que persisten.Logging: Añade una regla LOG para registrar intentos de conexión al puerto 22 antes de DROP. Revisa los logs.
24.10. Resumen y consejos para LFCS
- La tabla más usada es
filter, con las cadenas INPUT, OUTPUT, FORWARD. - Las políticas por defecto definen el comportamiento general; las reglas específicas permiten o deniegan.
- El orden de las reglas importa: la primera coincidencia gana.
- Utiliza
-m state --state ESTABLISHED,RELATEDpara no cortar conexiones existentes. - NAT se configura en la tabla
nat, con PREROUTING (DNAT) y POSTROUTING (SNAT/MASQUERADE). - Guarda siempre tus reglas para que persistan.
- En el examen, es probable que te pidan configurar un cortafuegos básico que permita ciertos servicios y deniegue el resto. Practica el flujo: limpiar, políticas, reglas, guardar.
Con este capítulo has dominado iptables, la base del cortafuegos en Linux. En el próximo capítulo nos adentraremos en enrutamiento estático y dinámico, donde verás cómo gestionar rutas y protocolos de enrutamiento.
Descubre más desde CIBERED
Suscríbete y recibe las últimas entradas en tu correo electrónico.
