sudo: Jack of all trades, master of some

NAT con iptables

Comentarios desactivados en NAT con iptables

NAT (Network Address Translation) es la alteración de las direcciones IP de origen o de destino (también se puede alterar el puerto) en el viaje de un paquete en la red y se utiliza en escenarios donde las computadoras no pueden conectarse directamente a redes externas o solamente se cuenta con una sola dirección con acceso a Internet (SNAT) o cuando se necesita que desde una red externa se acceda a una máquina que no esté en un segmento de red con acceso a esta red (DNAT). A continuación comparto con ustedes algunas apreciaciones sobre el uso de esta importante característica.

Las condiciones mínimas para poder hacer NAT con iptables son:

Para activar el módulo ip_forward en el kernel:

echo 1 > /proc/sys/net/ipv4/ip_forward

SNAT

En el script o set de reglas que se esté usando, debemos permitir el forwarding entre las dos interfaces de red:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

En este caso eth0 es la interface de red de la LAN y eth1 la interface de red conectada a Internet.

Con la siguiente regla permitimos el acceso del tráfico proveniente de la LAN con destino a Internet cambiando la dirección IP de origen por 1.2.3.4 que es la que tiene acceso.

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.4

Nótese el uso de la cadena POSTROUTING, el cambio se hace justo antes de que el paquete sea enviado, es importante este detalle ya que significa que dentro de la misma máquina Linux se verá el paquete sin cambios y que la opción '-o' (interface de salida) se puede utilizar. La opción --to-destination (también se puede usar como --to) especifica una dirección IP, un rango de direcciones IP y opcionalmente un puerto o un rango de puertos, solamente para los protocolos UDP y TCP.

DNAT

En este caso debemos habilitar el forwarding a la inversa:

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Y para permitir que desde una red externa accedan a un servicio HTTP hosteado en una máquina en el segmento de red de la LAN debemos tener una regla similar a esta, donde 5.6.7.8 es la dirección IP de la máquina que hostea el servicio HTTP:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 5.6.7.8

Nótese el uso de la cadena PREROUTING, el cambio se hace justo antes de que el paquete entre, lo que significa que el paquete se verá yendo hacia su destino 'real' y que la opción '-i' (interface de entrada) se puede utilizar. La opción --to-destination tiene el mismo uso que en el SNAT.

También podemos hacer un port forward de la siguiente manera:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 5.6.7.8:8080

En este caso el servicio HTTP está en la misma máquina pero eschuchando por el puerto 8080.

MASQUERADING

Existe un caso especial de SNAT llamado masquerading, que solamente debe usarse para las direcciónes IP asignadas dinámicamente y se utiliza de la siguiente manera:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

En este caso se utilizará la dirección IP de la interface por donde sale el paquete y lo más importante, si la conexión se cae, las conexiones se descartan causando menos problemas cuando la conexión regrese con otra dirección IP diferente.

REDIRECTION

Existe un caso especial de DNAT llamado 'redirection' que es exactamente el equivalente a hacer DNAT hacia la dirección IP de la interface de entrada. Por ejemplo, enviar todo el tráfico HTTP (puerto 80) entrante hacia el proxy Squid transparente.

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Notas