iptables SNAT / DNAT explica el comportamiento

0

Soy nuevo en iptables y quiero entender cómo funciona iptables nat. Tengo una máquina linux con un contenedor lxc. La configuración de la red de la máquina es la siguiente: la interfaz eth0 que conecta la máquina a internet (su dirección IPv4 es 10.9.63.173) y una interfaz veth-1 (192.168.2.1) para el contenedor lxc. En el contenedor lxc hay una interfaz eth0 (192.168.2.2) conectada al veth-1.

En la máquina linux he añadido dos reglas de iptables:

1) iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.9.63.173
2) iptables -t nat -A PREROUTING -d 10.9.63.173 -j DNAT --to-destination 192.168.2.2

Si hago un ping 8.8.8.8 desde el contenedor lxc, todo funciona (la IP de origen se traduce a 10.9.63.173 al salir de la máquina Linux). Pero la segunda regla nunca coincide con las respuestas de eco de ping. He visto los paquetes entrantes en eth0 (10.9.63.173) usando tcpdump y la salida es la siguiente:

23:34:33.151565 IP google-public-dns-a.google.com > host.local: ICMP echo reply, id 536, seq 174, length 64

Por lo tanto, los paquetes con destino 10.9.63.173 llegan a la interfaz eth0.

Tengo tres preguntas:

1) ¿Por qué nunca se cumple la regla nat prerouting?

2) ¿Cómo sabe iptables cómo modificar las respuestas para que se envíen a 192.168.2.2?

3) ¿Puede el objetivo SNAT modificar el puerto de origen (sin indicar explícitamente que se traduzca a un puerto o puertos específicos)?

¡Gracias!

SebiSebi
fuente

Respuestas:

0

Iptables está utilizando una tabla NAT, y la máquina de conntrack. De esta manera, si su contenedor inicia la conexión, coincidirá con la regla de SNAT, escribirá en la tabla NAT y llenará la de Conntrack.

Cuando se recibe una respuesta, conntrack sabe (con origen, destino, ip y puerto, y secuencia de TCP si la conexión es TCP) que el paquete pertenece a la conexión y lo dirigirá a la correspondencia de NAT correcta.

Por conexión, solo el primer paquete coincidirá con una regla de NAT, luego todos los demás seguirán la misma ruta (o ruta inversa).

Si llega una nueva conexión desde el exterior a su contenedor, en su lugar coincidirá con la regla DNAT.

SNAT no puede modificar el puerto de origen.

Sanael
fuente
¡De acuerdo! ¡Gracias! ¿Existe alguna documentación oficial para especificar el comportamiento exacto de iptables nat?
SebiSebi
Echar un vistazo a esta , esta y esta .
Sanael
0

Tome una lectura para TCP y el seguimiento de la conexión, supongo: http://www.iptables.info/en/connection-state.html

SNAT solo puede modificar la dirección IP de origen hasta ahora.

Tim Connor
fuente
Incluir la información pertinente de un enlace mejorará en gran medida esta respuesta, y la hará aún más útil incluso si el enlace cambia y se estropea.
music2myear
0

1) ¿Por qué nunca se cumple la regla nat prerouting?

iptables NAT funciona en "conexiones" *, solo el primer paquete de cada "conexión" pasa por las tablas nat controladas por el usuario.

2) ¿Cómo sabe iptables cómo modificar las respuestas para que se envíen a 192.168.2.2?

Cuando el primer paquete de una "conexión" pasa a través del NAT, establece una entrada en una tabla de seguimiento de conexión interna. Esto se utiliza para traducir los paquetes posteriores de la conexión.

3) ¿Puede el objetivo SNAT modificar el puerto de origen (sin indicar explícitamente que se traduzca a un puerto o puertos específicos)?

Sí puede, pero por defecto solo lo hará si es necesario para evitar la ambigüedad.

* "conexión" aquí se refiere a un conjunto de criterios que se pueden usar para hacer coincidir las solicitudes con sus respuestas correspondientes. p.ej. la fuente IP / puerto de origen / destino ip / destino puerto tuple para TCP / UDP o la fuente de origen / tipo / id / código / destino ip para consultas ICMP.

plugwash
fuente