我的目标是能够使用我的台式机上的远程桌面连接到在我的 Linux 服务器上的 VirtualBox 中运行的 Windows XP。
我的设置:
- 服务器 = debian squeeze,64 位,具有公共 IP 地址(主机)
- virtualbox-ose 3.2.10(来自 debian repo)
- Windows XP 作为客户机在 VBox 内运行;VBox 中的桥接网络模式,ip = 192.168.1.100
- ufw 作为 debian 上的防火墙,打开了 3 个端口:22 / ssh、80 / apache 和 3389 用于远程桌面
我的问题:如果我尝试在家用电脑上使用远程桌面,我无法连接到 Windows 客户机。如果我先“ssh -X -C”进入 Debian 服务器,然后运行“rdesktop 192.168.1.100”,我就可以毫无问题地连接。Windows 防火墙配置为允许远程桌面连接,我甚至关闭了它(因为这里是多余的)以查看是否是问题所在,但没有什么区别。
由于我能够从本地子网内部进行连接,因此我怀疑我没有正确设置 Debian 防火墙来处理来自 LAN 外部的连接。以下是我所做的...
首先是我的 ufw 状态:
ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
3389 ALLOW Anywhere
我编辑了 /etc/ufw/sysctl.conf 并添加:
net/ipv4/ip_forward=1
编辑 /etc/default/ufw 并添加:
DEFAULT_FORWARD_POLICY="ACCEPT"
编辑 /etc/ufw/before.rules 并添加:
# setup port forwarding to forward rdp to windows VM
*nat
:PREROUTING - [0:0]
-A PREROUTING -i eth0 -p tcp --dport 3389 -j DNAT --to-destination 192.168.1.100
-A PREROUTING -i eth0 -p udp --dport 3389 -j DNAT --to-destination 192.168.1.100
COMMIT
# Don't delete these required lines, otherwise there will be errors
*filter
<snip>
重新启动了防火墙等,但没有连接。
我在 debian 主机上的日志文件显示了这一点(我的公共 IP 地址已被删除,但在实际日志中是正确的):
Feb 6 11:11:21 localhost kernel: [171991.856941] [UFW AUDIT] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27518 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
Feb 6 11:11:21 localhost kernel: [171991.856963] [UFW ALLOW] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27518 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
Feb 6 11:11:24 localhost kernel: [171994.856701] [UFW AUDIT] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27519 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
Feb 6 11:11:24 localhost kernel: [171994.856723] [UFW ALLOW] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27519 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
Feb 6 11:11:30 localhost kernel: [172000.856656] [UFW AUDIT] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27520 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
Feb 6 11:11:30 localhost kernel: [172000.856678] [UFW ALLOW] IN=eth0 OUT=eth0 SRC=aaa.bbb.ccc.dd DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=27520 DF PROTO=TCP SPT=54201 DPT=3389 WINDOW=5840 RES=0x00 SYN URGP=0
虽然这是当前的设置/配置,但我也尝试了它的几种变体;我想也许 ISP 会因为某种原因阻止 3389,并尝试使用不同的端口,但仍然没有连接。
有什么想法吗?我是不是忘记修改某个文件了?
答案1
我其实不是在讽刺这一点,但是你需要用比 UFW 更好的东西来管理你的 IPTAbles“防火墙”。
它适合桌面使用,但它的设计目的仅仅是桌面使用,而不是“服务器级”使用。
我强烈建议您坐下来花一些时间学习 NetFilter/IPTables 的工作原理,并熟悉如何直接使用这些命令。如果您担心会破坏某些东西,请在更改之前备份您的 IPTables 配置,或者甚至进行基本的“Git”版本控制设置,这将帮助您进行实验并获得信心。
答案2
这为我解决了这个问题:
sudo ufw allow proto tcp from 192.168.1.100 to any port 22
问题是响应被阻止了。希望这对某些人有帮助。
答案3
不确定您是否仍需要帮助。我遇到了完全相同的问题,而且问题相当简单。目标服务器没有默认网关条目,也没有将回复带回网关。设置默认网关后,一切正常。您可以通过键入route -n
(使用 -n 避免耗时的 DNS 查找每个条目)来检查您的路由。
答案4
我只是这样做了:ufw 允许 [虚拟机 IP 地址]