
Tengo dos redes consecutivas, ambas ocultas bajo su propia NAT 192.168.31.0/24
-> 192.168.33.0/24
-> Internet
Tengo un servidor TCP encendido 192.168.33.35
y un cliente encendido192.168.31.32
Un cliente realiza una solicitud TCP al servidor ubicado en Internet en 66.66.66.66
, por ejemplo. Quiero que la última puerta de enlace 192.168.33.1
envíe la solicitud 192.168.33.35
y engañe al cliente.
Lo más factible de lo que probé es:
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
El servidor recibió el paquete Syn y respondió. Pero la IP de origen de la respuesta del servidor parece permanecer 192.168.33.35
después de pasar la puerta de enlace. Y el paquete recibido por la puerta de enlace se pierde 192.168.31.1
.
Parece que la parte SNAT no funciona.
¿Qué puedo hacer para emular/falsificar el servidor con herramientas estándar openWrt?
Respuesta1
Esto es lo que pasa:
- Su
192.168.33.35
servidor ve el paquete Syn192.168.33.Z
(no conoce la192.168.31.0/24
red y ve la dirección "WAN" de la192.168.31.1
puerta de enlace, no sé cuálZ
es) y responde a esta dirección. - Su tabla de enrutamiento dice que esta dirección pertenece a la red local, por lo que la respuesta está destinada a la dirección MAC de
192.168.33.Z
. - Incluso si la respuesta viaja físicamente a través de la
192.168.33.1
máquina, la puerta de enlace no la altera porque está destinada a la dirección MAC de otra máquina. 192.168.33.Z
ve la respuesta de192.168.33.35
. Espera uno66.66.66.66
y no sabe qué hacer.
Tenga en cuenta que no importa que 192.168.33.Z
realice NAT (estando 192.168.31.1
en su lado LAN). El mecanismo de falla es muy similar a aquel en el queEl bucle invertido NAT (NAT en horquilla) está solo parcialmente configurado.
Tienes que hacer que tu 192.168.33.35
servidor envíe respuestas a la dirección MAC de tu 192.168.33.1
puerta de enlace.
Establezca una regla de enrutamiento para
192.168.33.Z
(recuerde que no lo séZ
, usted sí; sustituya el número real) o incluso para toda192.168.33.0/24
la red:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
Tenga en cuenta que afectará todas las comunicaciones desde
192.168.33.35
hasta192.168.33.Z
. En los casos en los que192.168.33.35
debería actuar,192.168.33.35
los paquetes serán enrutados innecesariamente; Aunque no debería romper cosas.O dejar que la
192.168.33.1
puerta de enlace realice no sólo DNAT sino también SNAT. Esta solución es básicamente la misma que la del loopback NAT en la respuesta ya vinculada:# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
Este fragmento se aplica a su situación:
Tenga en cuenta que la tabla NAT
iptables
solo se utiliza para el primer paquete de una conexión. Los paquetes posteriores relacionados con la conexión se procesan utilizando las tablas de mapeo interno establecidas cuando se tradujo el primer paquete.
Esto significa que la segunda de sus líneas ( iptables … -j SNAT --to-source 66.66.66.66
) es irrelevante cuando inicia una conexión desde un cliente. Los paquetes posteriores se editarán SNAT y DNAT correctamente como lo fue el primer paquete.
Creo que si tu primera línea
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
actuó en la 192.168.31.1
puerta de enlace, haría lo que usted quisiera para otros clientes sin 192.168.31.0/24
ningún truco adicional.
Esta segunda línea tuya
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
se aplicará si inicia una conexiónde 192.168.33.35
. Los servidores de Internet rara vez hacen esto, por lo que es posible que no necesite esta regla en absoluto. En caso de que lo necesites, recuerda que:
- la regla solo funcionará si los paquetes se enrutan a través de la
192.168.33.1
puerta de enlace donde actúa esta regla, por lo que para llegar a sus computadoras locales y presentarles lo que66.66.66.66
necesita, debe ajustar la tabla de enrutamiento en la192.168.33.35
máquina de manera similar a lo anterior; - no puede comunicarse como
66.66.66.66
con hosts externos (más allá de su red) porque incluso si lograra comunicarse con ellos actuando como66.66.66.66
, su respuesta llegaría al servidor real66.66.66.66
, no a usted.
Respuesta2
Lo hice con enrutamiento. Lamentablemente es menos flexible para acceder al servidor real, pero al menos funciona. Algo como esto:
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
y en el servidor:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up