我在实现 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
该端口正在 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
有任何想法吗?
更新
nf_conntrack
根据@Zhiqiang Ma,我在连接尝试期间查看了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 为什么会这么做?
答案1
在 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
并查看那里的内容。每个转发连接都有条目。
笔记:如果 Windows 的出站路线默认不通过该iptables
框,则也需要 MASQUERADE;请参阅下面的注释(您可能需要取消隐藏)。
答案2
我看到您使用 MASQUERADE 解决了这个问题。我没有注意到最后一条评论被隐藏了,所以我不得不自己解决这个问题,这要感谢出色的 Iptables 教程(在 Freshmeat 中查找)。我做的几乎和您一样,但是我使用的是 SNAT 而不是 MASQUERADE,因为 Linux 机器有一个静态本地 IP。如果 Linux 机器的 IP 由 DHCP 提供,MASQUERADE 会更合适,否则它会被告知是一项更耗费处理器的任务。
我不需要任何 FORWARD 规则,尽管我必须
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
答案3
这是我在 CentOS 7 上的方法:
首先,启用 IPv4 转发 - 在 /etc/sysctl.conf 中确保有以下行:
net.ipv4.ip_forward=1
然后配置iptables:
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 在启动时应用这些规则 - 互联网上有很多指南。