¿Por qué SNAT funciona estableciendo reglas en tablas sin las reglas en la cadena PREROUTING?

¿Por qué SNAT funciona estableciendo reglas en tablas sin las reglas en la cadena PREROUTING?

Tengo algunas preguntas sobre SNAT con iptables. Supongamos que hay un enrutador que reproduce el servidor DHCP para asignar IP privadas en mi LAN y NAT para que los hosts de mi LAN puedan acceder a Internet público.

El router tiene dos interfaces una "eth0" con IP pública dinámica y la otra "eth1" con IP privada 192.168.0.1 y la subred es 192.168.0.0/24. Supongamos que el reenvío de paquetes ipv4 está habilitado en ese enrutador. Sé que tengo que establecer una regla en la tabla NAT para enmascarar la IP de origen del paquete a la Internet pública desde los hosts de mi LAN. Esta regla puede parecerse a la siguiente.

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

Entiendo por qué necesito la regla ya que el paquete de mi LAN necesita una IP pública para el enrutamiento de Internet.

Pero no entiendo por qué no necesito poner otra regla en PREROUTINGcadena para los paquetes de respuesta para poder modificar sus direcciones IP de destino.

¿La modificación de la dirección de destino de esos paquetes de respuesta es un comportamiento predeterminado de la regla MASQUERADE que acabo de configurar?

Y otra pregunta es ¿cómo sabe iptable qué paquetes se deben modificar?

Gracias.

Respuesta1

La NAT de iptables tiene estado. El uso de la tabla 'nat' cargará automáticamente elconectarsistema, que mantiene una lista de conexiones activas y reconoce qué paquete pertenece a qué conexión. El sistema conntrack registra ganchos internos que funcionan por separado de las reglas de iptables y transformará automáticamente los paquetes que reconoce.

(Puede ver la tabla de estado de conntrack usando conntrack -L/proc/self/net/nf_conntrack).

Con este sistema, las reglas en la tabla 'nat' en realidad coinciden sólo con lasinicialpaquete que pertenece a cada conexión, no a cada paquete. Una vez que el paquete inicial ha coincidido, la entrada de conntrack correspondiente se marca como que necesita NAT (o no) y los paquetes adicionales se transforman automáticamente sin siquiera pasar por la tabla 'nat'.

información relacionada