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!
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.
fuente
iptables NAT funciona en "conexiones" *, solo el primer paquete de cada "conexión" pasa por las tablas nat controladas por el usuario.
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.
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.
fuente