Reenviar RDP a través de una máquina Linux usando iptables: No funciona

Tengo una máquina Linux y una máquina Windows detrás de un enrutador que implementa NAT (el diagtwig puede ser excesivo, pero fue divertido de hacer ):

configuración de la red

Estoy reenviando el puerto RDP (3389) en el enrutador a la máquina Linux porque quiero auditar conexiones RDP. Para que la máquina Linux transmita tráfico RDP, escribí estas reglas de iptables:

iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination win-box iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT 

El puerto está escuchando en la máquina Windows:

 C:\Users\nimmy>netstat -a Active Connections Proto Local Address Foreign Address State (..snip..) TCP 0.0.0.0:3389 WIN-BOX:0 LISTENING (..snip..) 

Y el puerto está reenviando en la máquina Linux:

 # tcpdump port 3389 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 01:33:11.451663 IP shieldsup.grc.com.56387 > linux-box.myapt.lan.ms-wbt-server: Flags [S], seq 94663035, win 8192, options [mss 1460], length 0 01:33:11.451846 IP shieldsup.grc.com.56387 > win-box.myapt.lan.ms-wbt-server: Flags [S], seq 94663035, win 8192, options [mss 1460], length 0 

Sin embargo, no obtengo ninguna connection RDP exitosa desde el exterior. El puerto ni siquiera responde:

 C:\Users\outside-nimmy>telnet example.com 3389 Connecting To example.com...Could not open connection to the host, on port 3389: Connect failed 

¿Algunas ideas?

Actualizar

Per @ Zhiqiang Ma, miré el file nf_conntrack proc durante un bash de connection y esto es lo que veo (192.168.3.1 = linux-box, 192.168.3.5 = win-box):

 # cat /proc/net/nf_conntrack | grep 3389 ipv4 2 tcp 6 118 SYN_SENT src=4.79.142.206 dst=192.168.3.1 sport=43142 dport=3389 packets=6 bytes=264 [UNREPLIED] src=192.168.3.5 dst=4.79.142.206 sport=3389 dport=43142 packets=0 bytes=0 mark=0 secmark=0 zone=0 use=2 

2ª actualización

Got tcpdump en el enrutador y parece que win-box está enviando un package RST:

 21:20:24.767792 IP shieldsup.grc.com.45349 > linux-box.myapt.lan.3389: S 19088743:19088743(0) win 8192 <mss 1460> 21:20:24.768038 IP shieldsup.grc.com.45349 > win-box.myapt.lan.3389: S 19088743:19088743(0) win 8192 <mss 1460> 21:20:24.770674 IP win-box.myapt.lan.3389 > shieldsup.grc.com.45349: R 721745706:721745706(0) ack 755785049 win 0 

¿Por qué Windows estaría haciendo esto?

Añadir puerto en las reglas de iptables ?:

 iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination win-box:3389 iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT 

No estoy muy seguro de que sea la razón. Pero lo hago generalmente de esta manera: http://www.systutorials.com/816/port-forwarding-using-iptables/

Todos pueden intentar limpiar primero las tablas: iptables -t nat -F; iptables -F y luego agrega estas dos reglas en caso de que otras reglas en tu bloque de iptables la connection.

Usted también puede

 cat /proc/net/nf_conntrack 

y ver el contenido allí. Cada connection de reenvío tiene inputs allí.

Nota : También se requiere MASQUERADE si la ruta saliente de Windows no pasa por defecto a través del cuadro iptables ; vea los comentarios a continuación (puede que tenga que volver a mostrar).

Te vi resolviendo el problema con MASQUERADE. No me di count de que el último comentario estaba oculto, así que tuve que resolver la pregunta por mi count, gracias al gran tutorial de Iptables (searchlo en Freshmeat). Hice casi lo mismo que tú, pero haciendo un SNAT en lugar de MASQUERADE, ya que la caja linux tiene una IP local estática. MASQUERADE sería más apropiado si la linux box tenía su IP dada por DHCP, de lo contrario se dice que es una tarea más procesadora.

No necesitaba ninguna regla FORWARD, aunque tenía que

echo 1 | sudo tee / proc / sys / net / ipv4 / ip_forward