我有一个 Oracle Linux 客户机在 Windows 7 主机上的 VirtualBox 中运行 Web 服务器。我需要设置网络,以便可以做三件事:
- 主机可以通过浏览器和 ssh 连接到客户机
- 访客可以通过主机的 VPN 与内部网络上的其他服务器通信
- 客人可以访问外部互联网
我读过一些答案并尝试了一些配置,结果如下:
桥接
- 主人无法联系到客人
- 访客无法通过 VPN 看到内容
- 客人可以上网
NAT
- 主人无法联系到客人
- 客人可以通过VPN查看
- 客人无法访问互联网
仅限主持人
三个条件均不成立。
NAT网络
- 主人无法联系到客人
- 客人可以通过VPN查看
- 客人无法访问互联网
我还应该指出,有时主机通过 VPN 连接,而有时主机直接插入公司网络。当直接插入时,桥接适配器满足所有 3 个条件。理想情况下,无论有 VPN 还是直接连接,都会有一个配置满足所有 3 个条件。
答案1
我有精确的同样的问题,并且已经得到解决,所以我很乐意详细解释问题和解决方案。
无需 VPN
了解满足您的要求所需的配置非常重要没有涉及 VPN。此外,此信息假设主机和客户机上均没有软件防火墙干扰。
如果没有 VPN,通常可以通过在虚拟机配置中创建两个网络适配器来解决此问题。
第一个适配器必须设置为NAT
模式,使客户机能够通过主机的网络接口访问网络资源(包括 Internet)。
第二个适配器必须设置为Host-only
,以实现主机和客户机之间的双向通信。
此适配器的设置比第一个稍微复杂一些,因为它需要修改 VirtualBox 的全局网络首选项才能配置仅主机适配器(注意:这需要管理员权限)。
在 VirtualBox 中,转到File -> Preferences -> Network
。单击Host-only Networks
选项卡,然后单击小+
图标以添加新适配器。系统将提示您提升 VirtualBox 的权限。
填写该Adapter
标签是强制性的;它看起来应该像这样(忽略标有的适配器#2
;它用于不相关的操作):
服务器选项卡上的值DHCP
是可选的。如果您打算在客户机的网络配置中硬编码此适配器的 IP 地址,则这些值是不必要的。另一方面,如果您打算使用 DHCP,这些值可能如下所示:
配置 VirtualBox 的最后一步是返回 VM 的网络配置并添加第二个适配器,该适配器引用我们刚刚创建的仅主机适配器:
现在,在客户操作系统中,必须配置网络以利用这两个网络接口。
在 Debian 或 Ubuntu GNU/Linux 上,配置很简单,只需修改/etc/network/interfaces
如下即可:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet dhcp
# The secondary network interface
auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
(纯粹主义者可能更喜欢使用/etc/network/interfaces.d
目录,但这超出了本解释的范围)
重新启动客户的网络服务,或者更简单地重新启动整个客户虚拟机,然后一切都应该“正常工作”。
此时,应该能够 ping 客户虚拟机192.168.56.101
并收到答复(前提是软件防火墙没有干扰)。
同样,应该能够 ping 主机10.0.2.2
。此 IP 地址似乎“硬编码”到 VirtualBox 的 NAT 实现中,或者至少通过一些不明显的配置指令指定,并且关于其来源的信息很少。但是,唉,“它就是有效”。
鉴于这种配置,您的问题中概述的所有三个条件均得到满足。
输入:VPN
但问题就在这里。引入 VPN 会导致严重的问题(当然,这取决于具体的 VPN 及其配置)。
现代 VPN 能够分割隧道,这是上述 VirtualBox 配置按照您的三个要求运行所必需的。出于(良好的)安全原因,拆分隧道通常被禁用,而这正是您的情况(和我的情况)中的问题。
当您连接到 VPN 时,VPN 客户端(我的情况是 Cisco AnyConnect Secure Mobility Client,3.1.02026)会检查主机的路由表、记住它们,然后用通常来自某些集中管理位置的值覆盖它们(即,即使具有本地管理员权限,也不可能覆盖这些设置)。
command.exe
您可以通过打开以下内容(在 Windows 上)自行检查路由表:
C:\>route print
在连接到 VPN 之前,路由表包含使 VirtualBox 配置正常运行的关键条目。连接到 VPN 会导致这些条目被删除,从而阻止主机和客户机之间的通信。
(还有许多其他条目,我在这里省略了,因为它们与这种行为的根本原因无关。)
连接到 VPN 之前:
192.168.56.0 255.255.255.0 On-link 192.168.56.1 266
192.168.56.1 255.255.255.255 On-link 192.168.56.1 266
192.168.56.255 255.255.255.255 On-link 192.168.56.1 266
224.0.0.0 240.0.0.0 On-link 192.168.56.1 266
255.255.255.255 255.255.255.255 On-link 192.168.56.1 266
连接到VPN后:
192.168.56.1 255.255.255.255 On-link 192.168.56.1 266
224.0.0.0 240.0.0.0 On-link 192.168.56.1 266
255.255.255.255 255.255.255.255 On-link 192.168.56.1 266
VPN客户端删除以下几行:
192.168.56.0 255.255.255.0 On-link 192.168.56.1 266
192.168.56.255 255.255.255.255 On-link 192.168.56.1 266
如果没有最后两个条目,主机和客户机就无法通信,这正是在 VPN 配置中禁用拆分隧道时的预期行为。
通常情况下,这两个命令会恢复这些路由:
C:\>route ADD 192.168.56.0 MASK 255.255.255.0 192.168.56.1 METRIC 266
C:\>route ADD 192.168.56.255 MASK 255.255.255.255 192.168.56.1 METRIC 266
但 VPN 客户端仍保持警惕:它会拦截修改路由表的尝试。我的客户端似乎允许第二个条目,但不允许第一个条目。(它可能会定期覆盖这两个条目;我没有对此进行测试。)
如果您的特定 VPN 及其相关配置允许启用拆分隧道,通常按如下方式打开:
断开与 VPN 的连接后,运行良好的 VPN 客户端将恢复连接前存在的路由表。我的 VPN 客户端似乎可以可靠地执行此操作,这很有帮助,因为这意味着当我连接到 VPN 或断开与 VPN 的连接时,不需要重新启动客户 VM。在这种情况下,VM 的辅助适配器会重置,但它会自动且透明地重新获取其 IP 地址,几乎立即恢复主机和客户机之间的通信。更好的是,主机和客户机之间的 NFS 挂载(我使用的是 CIFS 挂载)在 VPN 连接/断开操作期间保持连接。
如果您的 VPN 允许拆分隧道,那么启用它可能是一个简单的问题,在这种情况下,我很想听听您的意见,了解“一切是否正常”。