我想将一些端口(特别是 TCP 22、UDP 1194、TCP 80、TCP 443)从 Windows Server 2003 转发到在同一台机器上的 VirtualBox 内运行的 Linux VM。有没有简单可靠的方法可以做到这一点?目前,VM 与服务器位于桥接网络上,并且应该可以通过所有其他端口从外部(LAN)访问。
答案1
我认为这不是真正的解决方案。您指的是桥接网络以及如何在 Windows 托管机器上实现这一点。
您的答案是不要在 Windows 托管机器上使用桥接,而是使用 NAT。
从我的角度来看,这就像有人问如何更换奔驰的电池并回答:使用大众。
因此要回到 Windows 主机上的桥接网络 VM。
Windows 不会将数据包转发到虚拟适配器。因此,当您的 Windows 计算机使用 192.168.1.2 并且您的虚拟机桥接在 192.168.1.3 上时,从路由器的角度来看,您将数据包转发到 192.168.1.2 或 192.168.1.3,这一切最终都会到达 Windows 使用的 NIC,即 192.168.1.2。由于 LAN 内部使用了一些较低层协议,这不适用于 LAN 内部!虚拟 LAN 适配器实际上会看到您前往 192.168.1.3 的 LAN 计算机,而路由器转发的数据包则不会。因此,路由器上的端口转发到 192.168.1.2 或 192.168.1.3 将始终到达 192.168.1.2,但在 LAN 内部,由于一些较低级别的分层数据包,Windows 会明白它不是针对 192.168.1.2,而是针对 192.168.1.3。
这是 Windows 的一个限制,Windows 数据包的处理方式与 LAN 中的不同,LAN 中的数据包包含更多的低层数据,而互联网数据包则缺少这些信息,Windows 需要知道它不是用于主 NIC,而是用于桥接虚拟。
阻止数据包到达 Windows 或允许(防火墙)不会改变此问题!这只是主机操作系统在虚拟适配器获取数据包之前首先如何处理数据包(因此在这种情况下永远不会)这必须在防火墙规则实际生效之前很久就确定。
但是有一个解决方案,您仍然可以将您的 VM 与 Windows 主机桥接,使用桥接网络可能性和网络中的较低层网络协议,并且仍然告诉 Windows,特定端口上的数据包是用于 VM 而不是 Windows NIC!
为此,您可以使用:netsh interface portproxy add v4tov4 listenport=80 connectport=80 connectaddress=192.168.1.3
现在,端口 80 上到 192.168.1.2 或 192.168.1.3 的所有传入数据包仍都传入主机操作系统(Windows),但 Windows 现在会将它们转发到 192.168.1.3 的虚拟机
这就是您设置桥接网络的方式,它具有作为主机所连接的 LAN 的一部分的所有好处,并且仍然可以使正确的数据包到达您希望它们到达的 VM 的位置。
希望这能解释一下如何设置。当然,这并没有解释为什么 Windows 处理来自路由器转发的外部数据包的方式与处理 LAN 内部数据包的方式不同,但我认为这与您的问题无关。您问的是如何在桥接环境中完成此操作。
祝你好运。上述解决方案已经过测试并证明有效。
答案2
我自己找到了一个解决方案:
将 Virtualbox 中的网络设置更改为 NAT,并使用内置功能将任意端口隧道传输到 VM。这样做的缺点是 VM 无法记录任何 IP(因为 NAT 会阻止这种情况发生),并且除指定端口外,其他端口不再可用,但由于您可以指定任意数量,因此对我来说这不是什么大问题。