Configuración Esencial de NAT en Linux: Transición y Uso de iptables

Clasificado en Informática

Escrito el en español con un tamaño de 4,43 KB

Configuración Avanzada de NAT en Linux: Transición y Optimización con iptables

Actualización y Compatibilidad: De Núcleos 2.0/2.2 a Netfilter

Para aquellos que aún se sientan confusos por la transición de los núcleos 2.0 (ipfwadm) a 2.2 (ipchains), hay buenas y malas noticias.

En primer lugar, puede seguir utilizando ipchains o ipfwadm como antes. Para hacerlo, necesita cargar los módulos del núcleo `ipchains.o` o `ipfwadm.o` que encontrará en la última distribución de Netfilter. Son mutuamente exclusivos (se advierte), y no deben combinarse con ningún otro módulo de Netfilter.

Una vez instalado uno de estos módulos, puede utilizar ipchains e ipfwadm con normalidad, con las siguientes excepciones:

  • Establecer los tiempos límite (timeout) con `ipchains -M -S` o `ipfwadm -M -s` no tiene efecto. Dado que los límites de tiempo con la nueva infraestructura NAT son más amplios, esto no debería representar un problema.
  • Los campos `init_seq`, `delta` y `previous_delta` en la lista ampliada de enmascaramiento (verbose masquerade listing) siempre son 0.
  • Listar los contadores y restablecerlos a cero simultáneamente (`-Z -L`) ya no funciona: los contadores no se pondrán a cero.

Los desarrolladores y usuarios avanzados también notarán que:

  • Ahora es posible asociar un programa (bind) a los puertos 61000-65095 incluso si se está realizando enmascaramiento. El código de enmascaramiento asumía que no había nada en este rango, por lo que los programas no podían utilizarlo.
  • El parche (no documentado) de `getsockname`, utilizado por los programas de proxy transparente para averiguar el destino real de la conexión, ya no funciona.
  • El parche (no documentado) `bind-to-foreign-address` (asociado a una dirección externa) tampoco está implementado; se utilizaba para completar la ilusión del proxy transparente.

Enmascaramiento Básico (NAT) con iptables para Conexiones PPP

Esta es la configuración más solicitada por la mayoría de los usuarios. Si dispone de una conexión PPP con IP dinámica (si no está seguro de lo que es, probablemente la tenga), simplemente querrá configurar su máquina para que todos los paquetes provenientes de la red interna parezcan originarse desde la máquina con el enlace PPP.

# Carga el módulo NAT (esto también carga las dependencias).
modprobe iptable_nat

# Agrega (`-A`) una regla a la tabla NAT (`-t nat`), en la cadena de
# post-encaminamiento (`POSTROUTING`), para todos los paquetes que salgan por
# la interfaz `ppp0` (`-o ppp0`), aplicando enmascaramiento (`-j MASQUERADE`).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Habilita el reenvío de IP (IP forwarding)
echo 1 > /proc/sys/net/ipv4/ip_forward

Tenga en cuenta que esta configuración no incluye filtrado de paquetes. Para ello, consulte la sección 'Mezclando NAT con Filtrado de Paquetes' en la documentación de Filtrado de Paquetes.

Reenvío de Puertos (DNAT) con iptables: Alternativa a ipmasqadm

Este programa tiene un nicho de usuarios mucho más específico, por lo que no se ha priorizado la compatibilidad retroactiva. Puede utilizar `iptables -t nat` para realizar el reenvío de puertos. Por ejemplo, en Linux 2.2, la configuración sería:

# Linux 2.2
# Reenvía los paquetes TCP dirigidos al puerto 8080 de `1.2.3.4` al puerto 80 de
# `192.168.1.1`.
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80

Ahora debería hacer:

# Linux 2.4
# Agrega una regla a la cadena de pre-encaminamiento (`-A PREROUTING`) en la tabla NAT
# (`-t nat`), de modo que los paquetes TCP (`-p tcp`) dirigidos a `1.2.3.4`
# (`-d 1.2.3.4`) en el puerto `8080` (`--dport 8080`) sean redirigidos a un destino
# (`-j DNAT`) en `192.168.1.1` en el puerto `80` (`--to 192.168.1.1:80`).
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 \
        -j DNAT --to 192.168.1.1:80

Si desea que esta regla también afecte a las conexiones locales (aquellas que se originan en la propia máquina que realiza NAT), puede insertar la misma regla en la cadena `OUTPUT` (destinada a los paquetes locales de salida):

# Linux 2.4
iptables -A OUTPUT -t nat -p tcp -d 1.2.3.4 --dport 8080 \
        -j DNAT --to 192.168.1.1:80

Entradas relacionadas: