212.1 - Configuración de router

Introducción al enrutamiento en Linux

Linux puede funcionar como un router completo, reenviando paquetes entre interfaces de red. Para ello se requiere habilitar el reenvío de paquetes (IP forwarding) y configurar reglas de filtrado y traducción de direcciones mediante herramientas como iptables, nftables o firewalld.

Habilitación del reenvío IP (IP Forwarding)

El reenvío de paquetes está deshabilitado por defecto en Linux. Para activarlo:

Activación temporal

# IPv4
echo 1 > /proc/sys/net/ipv4/ip_forward
# o bien
sysctl -w net.ipv4.ip_forward=1
 
# IPv6
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
sysctl -w net.ipv6.conf.all.forwarding=1

Activación permanente

Editar /etc/sysctl.conf o crear un archivo en /etc/sysctl.d/:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Aplicar los cambios sin reiniciar:

sysctl -p

Para el examen: Es fundamental saber que sin ip_forward=1 el sistema Linux no reenviará paquetes entre interfaces, aunque las reglas de iptables estén correctamente configuradas.

iptables: el firewall clásico de Linux

Arquitectura de tablas y cadenas

iptables organiza las reglas en tablas, y cada tabla contiene cadenas:

TablaPropósitoCadenas principales
filterFiltrado de paquetes (tabla por defecto)INPUT, OUTPUT, FORWARD
natTraducción de direcciones de redPREROUTING, POSTROUTING, OUTPUT
mangleModificación de cabeceras de paquetesPREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
rawExcepciones al seguimiento de conexionesPREROUTING, OUTPUT

Cadenas principales

  • INPUT: paquetes destinados al propio host
  • OUTPUT: paquetes generados por el propio host
  • FORWARD: paquetes que atraviesan el host (enrutamiento)
  • PREROUTING: paquetes antes de la decisión de enrutamiento (DNAT)
  • POSTROUTING: paquetes después de la decisión de enrutamiento (SNAT/MASQUERADE)

Flujo de un paquete

Paquete entrante
    │
    ▼
PREROUTING (nat/mangle)
    │
    ├── ¿Para este host? ──► INPUT (filter) ──► Proceso local
    │                                               │
    │                                           OUTPUT (filter/nat)
    │                                               │
    └── ¿Reenviar? ──► FORWARD (filter) ────────────┘
                                                    │
                                                    ▼
                                          POSTROUTING (nat/mangle)
                                                    │
                                                    ▼
                                            Paquete saliente

Sintaxis básica de iptables

iptables [-t tabla] COMANDO cadena [opciones] -j OBJETIVO

Comandos principales

ComandoDescripción
-AAñadir regla al final de la cadena (append)
-IInsertar regla en posición específica (insert)
-DEliminar regla (delete)
-RReemplazar una regla
-LListar reglas
-FVaciar todas las reglas (flush)
-PEstablecer política por defecto
-NCrear cadena personalizada
-XEliminar cadena personalizada

Objetivos (targets) principales

ObjetivoDescripción
ACCEPTPermitir el paquete
DROPDescartar silenciosamente
REJECTRechazar con mensaje ICMP
LOGRegistrar en syslog sin detener procesamiento
MASQUERADENAT dinámico (IP de salida variable)
SNATNAT de origen con IP fija
DNATNAT de destino (redirigir a otra IP/puerto)

Ejemplos prácticos de reglas

# Permitir tráfico SSH entrante
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# Bloquear todo el tráfico de una IP específica
iptables -A INPUT -s 192.168.1.100 -j DROP
 
# Permitir tráfico establecido y relacionado
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# Rechazar ping con mensaje ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
 
# Registrar paquetes descartados
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
iptables -A INPUT -j DROP
 
# Establecer política por defecto
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Configuración de NAT

SNAT (Source NAT) - IP fija de salida

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5

MASQUERADE - IP dinámica de salida

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Para el examen: MASQUERADE se usa cuando la IP pública es dinámica (conexiones PPPoE, DHCP). SNAT es más eficiente cuando la IP es estática.

DNAT (Destination NAT) - Port forwarding

# Redirigir puerto 80 externo al servidor interno 192.168.1.10:8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.10:8080
 
# Necesario también permitir el tráfico en FORWARD
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 8080 -j ACCEPT

Persistencia de reglas iptables

# Guardar reglas actuales
iptables-save > /etc/iptables/rules.v4
 
# Restaurar reglas
iptables-restore < /etc/iptables/rules.v4

nftables: el sucesor de iptables

nftables reemplaza a iptables, ip6tables, arptables y ebtables con una sintaxis unificada.

Comando nft - Sintaxis básica

# Listar todas las reglas
nft list ruleset
 
# Crear una tabla
nft add table inet mi_firewall
 
# Crear una cadena
nft add chain inet mi_firewall entrada { type filter hook input priority 0 \; policy drop \; }
 
# Añadir reglas
nft add rule inet mi_firewall entrada tcp dport 22 accept
nft add rule inet mi_firewall entrada ct state established,related accept
 
# Configurar NAT con nftables
nft add table ip nat
nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule ip nat postrouting oifname "eth0" masquerade

Para el examen: nftables usa la familia inet para reglas que aplican tanto a IPv4 como a IPv6 simultáneamente.

Diferencias clave entre iptables y nftables

Característicaiptablesnftables
Herramientaiptables, ip6tablesnft (unificado)
FamiliasSeparadasinet (IPv4+IPv6)
TablasPredefinidasDefinidas por el usuario
RendimientoMenor con muchas reglasMejor (mapas, conjuntos)
Compatibilidadiptables-nft (capa de traducción)Nativo

firewalld: gestión dinámica de firewall

firewalld es un frontend para iptables/nftables que usa el concepto de zonas.

Zonas predefinidas

ZonaDescripción
dropDescarta todo, sin respuesta
blockRechaza con icmp-host-prohibited
publicRed pública, no confiable (zona por defecto)
externalNAT/masquerading habilitado
dmzZona desmilitarizada, acceso limitado
workRed de trabajo
homeRed doméstica
internalRed interna
trustedTodo permitido

Comandos esenciales de firewall-cmd

# Ver zona activa
firewall-cmd --get-active-zones
 
# Listar servicios permitidos
firewall-cmd --list-all
 
# Añadir servicio de forma permanente
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
 
# Añadir puerto específico
firewall-cmd --permanent --add-port=8080/tcp
 
# Activar masquerading
firewall-cmd --permanent --zone=external --add-masquerade
 
# Port forwarding
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.10
 
# Añadir interfaz a zona
firewall-cmd --permanent --zone=internal --add-interface=eth1

Para el examen: Los cambios con --permanent requieren --reload para aplicarse. Sin --permanent, los cambios se aplican inmediatamente pero se pierden al reiniciar.

Archivo /etc/sysctl.conf

Parámetros relevantes para enrutamiento y seguridad de red:

# Habilitar reenvío IPv4
net.ipv4.ip_forward = 1
 
# Protección contra SYN floods
net.ipv4.tcp_syncookies = 1
 
# Ignorar pings de broadcast (prevención de smurf)
net.ipv4.icmp_echo_ignore_broadcasts = 1
 
# No aceptar redirecciones ICMP
net.ipv4.conf.all.accept_redirects = 0
 
# No enviar redirecciones ICMP
net.ipv4.conf.all.send_redirects = 0
 
# Protección contra IP spoofing
net.ipv4.conf.all.rp_filter = 1
 
# No aceptar paquetes con source routing
net.ipv4.conf.all.accept_source_route = 0

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • Sin ip_forward=1, Linux NO reenvia paquetes aunque iptables este bien configurado — es el requisito previo mas olvidado. Se activa con sysctl -w net.ipv4.ip_forward=1 o permanentemente en /etc/sysctl.conf. Sin esto, las reglas de FORWARD y NAT no funcionan.

  • MASQUERADE vs SNATMASQUERADE se usa con IPs dinamicas (DHCP, PPPoE) porque detecta la IP de salida automaticamente. SNAT es mas eficiente pero requiere una IP fija con --to-source. Usar SNAT con IP dinamica es un error.

  • DNAT va en PREROUTING, SNAT/MASQUERADE en POSTROUTING — DNAT modifica el destino ANTES del routing (PREROUTING). SNAT modifica el origen DESPUES del routing (POSTROUTING). Invertir las cadenas es un error clasico.

  • -t filter es la tabla por defecto, no es necesario especificarlaiptables -A INPUT es equivalente a iptables -t filter -A INPUT. Pero para NAT se DEBE especificar -t nat. Olvidar -t nat en reglas de NAT es error frecuente.

  • DROP vs REJECTDROP descarta silenciosamente (el cliente espera hasta timeout). REJECT envia un mensaje ICMP de error (el cliente sabe inmediatamente que fue rechazado). DROP es mas “sigiloso”, REJECT es mas “educado”.

  • iptables-save / iptables-restore para persistencia — las reglas de iptables se pierden al reiniciar. Hay que guardarlas con iptables-save > /etc/iptables/rules.v4 y restaurarlas al arranque. Sin esto, el firewall se pierde tras cada reinicio.

  • nftables usa familia inet para IPv4 + IPv6 simultaneamente — con nftables no necesitas reglas separadas para IPv4 e IPv6. La familia inet aplica a ambos. En iptables necesitas iptables e ip6tables por separado.

  • firewalld: --permanent requiere --reload — los cambios con --permanent no se aplican hasta firewall-cmd --reload. Sin --permanent, los cambios se aplican inmediatamente pero se pierden al reiniciar. El examen pregunta por este comportamiento.

  • Orden de reglas en iptables: primera coincidencia gana — iptables procesa las reglas en orden secuencial dentro de cada cadena. La primera regla que coincide se aplica y se deja de evaluar. Poner una regla ACCEPT antes de una DROP mas especifica anula la restriccion.

  • La cadena FORWARD se usa para paquetes que ATRAVIESAN el host — INPUT es para paquetes destinados al propio host, OUTPUT para paquetes generados por el host, FORWARD para paquetes que pasan a traves (routing). Confundir INPUT con FORWARD es muy comun.