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

Bel*_*dez 6 linux windows iptables remote-desktop port-forwarding

我在实现 NAT 的路由器后面有一台 Linux 机器和一台 Windows 机器(该图可能有点矫枉过正,但制作起来很有趣):

网络设置

我将路由器上的 RDP 端口 (3389) 转发到 Linux 机器,因为我想审核 RDP 连接。为了让 Linux 机器转发 RDP 流量,我写了这些 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
Run Code Online (Sandbox Code Playgroud)

该端口正在 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..)
Run Code Online (Sandbox Code Playgroud)

并且端口正在 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
Run Code Online (Sandbox Code Playgroud)

但是,我没有从外部获得任何成功的 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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

更新

根据@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
Run Code Online (Sandbox Code Playgroud)

第二次更新

得到了tcpdump在路由器上,似乎双赢箱发送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
Run Code Online (Sandbox Code Playgroud)

为什么 Windows 会这样做?

小智 5

在 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
Run Code Online (Sandbox Code Playgroud)

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

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

你也可以

cat /proc/net/nf_conntrack
Run Code Online (Sandbox Code Playgroud)

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

注意:如果 Windows 的出站路由默认不通过iptables框,则还需要 MASQUERADE ;请参阅下面的评论(您可能需要取消隐藏)。

  • 我启用了 Masquerading `/sbin/iptables -t nat -A POSTROUTING MASQUERADE` 就成功了。谢谢! (2认同)