使用iptables通过Linux机器转发RDP:不工作

我在一台实现NAT的路由器后面有一台Linux机器和一台Windows机器(图表可能是过度的,但很有趣 ):

网络设置

我正在转发路由器上的RDP端口(3389)到Linux机器,因为我想审计RDP连接。 为了让Linux机器转发RDPstream量,我写了这些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 

端口正在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..) 

而端口正在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 

但是,我没有从外部获得任何成功的RDP连接。 该端口甚至没有响应:

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

有任何想法吗?

更新

Per @Zhiqiang Ma,我在连接尝试期间查看了nf_conntrack proc文件,这就是我所看到的(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 

第二次更新

得到tcpdump在路由器上,似乎win-box正在发送一个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 

为什么Windows会这样做?

在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 

我不是很确定这是原因。 但我通常这样做: http : //www.systutorials.com/816/port-forwarding-using-iptables/

你可以尝试刷新表:iptables -t nat -F; iptables -F,然后添加这两个规则,以防iptables中的其他规则阻塞连接。

你也可以

 cat /proc/net/nf_conntrack 

并看到那里的内容。 每个转发连接都有条目。

注意 :如果窗口的出站路由默认不通过iptables框,那么MASQUERADE也是必需的。 看下面的评论(你可能需要取消隐藏)。

我看到你用MASQUERADE解决了这个问题。 我没有注意到最后的评论是隐藏的,所以我必须为自己解决这个问题,这要感谢伟大的Iptables教程(在Freshmeat中查找)。 我做了和你几乎一样的,但做一个SNAT而不是MASQUERADE,因为linux的盒子有一个静态的本地IP。 MASQUERADE会更合适,如果Linux的IP地址是由DHCP提供的,否则会被告知是一个更耗费处理器的任务。

我不需要任何FORWARD规则,虽然我不得不

回声1 | sudo tee / proc / sys / net / ipv4 / ip_forward

这是我在CentOS 7上的方法:

首先,启用IPv4转发 – 在/etc/sysctl.conf中确保存在以下行:

 net.ipv4.ip_forward=1 

然后configurationiptables:

 iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination <WINDOWS SERVER IP> iptables -A FORWARD -p tcp --dport 3389 -j ACCEPT iptables -t nat -A POSTROUTING -j MASQUERADE 

最后,确保iptables在启动时应用这些规则 – 在互联网上的许多指南。