Mi servidor (en el que iptables
se 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 iptables
archivo 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:
curl http://192.168.3.110
- no olvides que esto lo ejecuto desde mi servidor, con IP192.168.3.110
- El paquete va a la cadena de SALIDA desde la tabla nat, donde se DNAT.
- El paquete va a la cadena POSTROUTING desde la tabla nat, donde se SNATed
- mi Apache de
192.168.3.106
, está respondiendo a mi solicitud. - El paquete está alcanzando la cadena PREROUTING desde la tabla nat, donde debería ser DNATed.
- 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.