Iptables no funciona como esperaba: el paquete de respuesta no está DNATed como se esperaba con DNAT en PREROUTING

Iptables no funciona como esperaba: el paquete de respuesta no está DNATed como se esperaba con DNAT en PREROUTING

Mi servidor (en el que iptablesse cargan las siguientes reglas) tiene la IP 192.168.3.110. Hay otra computadora en mi LAN con IP 192.168.3.106. Estoy intentando redirigir solicitudes a mi servidor en el puerto 80 a 192.168.3.106.

Tengo el siguiente iptablesarchivo que está cargado en mi servidor CentOS 7:


*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP

-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

Básicamente estoy haciendo lo siguiente (al menos así lo entiendo):

  • habilitar ssh-ing

  • habilitar TCP en el puerto 80

  • Paquetes DNAT y SNAT para lograr el comportamiento deseado.

Pregunta:No entiendo por qué, cuando hago una llamada desde mi servidor a sí mismo, es decir 192.168.3.110, obtengo una respuesta.

Así entiendo que las cosas deberían funcionar en este caso:

  1. curl http://192.168.3.110- no olvides que esto lo ejecuto desde mi servidor, con IP192.168.3.110
  2. El paquete va a la cadena de SALIDA desde la tabla nat, donde se DNAT.
  3. El paquete va a la cadena POSTROUTING desde la tabla nat, donde se SNATed
  4. mi Apache de 192.168.3.106, está respondiendo a mi solicitud.
  5. El paquete está alcanzando la cadena PREROUTING desde la tabla nat, donde debería ser DNATed.
  6. El paquete se reenvía y se tira a alguna parte.

Todo parece funcionar como se esperaba, excepto 5 y 6. En otras palabras, recibo la respuesta del servidor.¿Alguien puede explicarme dónde se rompe mi lógica?

Respuesta1

Las tablas nat de iptables solo se recorren para el primer paquete de una (psuedo)conexión. Los paquetes posteriores se asignan (o se dejan solos) según las asignaciones establecidas por el primer paquete.

información relacionada