我遇到了完全相同的问题,并将其彻底解决了,因此,我很乐于详细解释问题和解决方案。
不涉及VPN
了解不涉及VPN 即可满足您的要求所需的配置非常重要。此外,此信息还假定主机和客户机上都没有软件防火墙在干扰。
如果没有VPN,通常可以通过在虚拟机的配置中创建两个网络适配器来解决。
必须将第一个适配器设置为NAT
mode,该模式使访客能够通过主机的网络接口访问网络资源(包括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
目录,但这超出了本说明的范围)
重新启动来宾的网络服务,或更简单地说,重新启动整个来宾VM,一切应该“正常”。
在这一点上,应该能够ping通来宾VM 192.168.56.101
并收到答复(前提是软件防火墙没有干扰)。
同样,应该可以ping通主机10.0.2.2
。该IP地址似乎已“硬编码”到VirtualBox的NAT实现中,或者至少是通过一些非显而易见的配置指令指定的,并且几乎没有关于其来源的信息。但是,a,“它确实有效”。
使用此配置,将满足您的问题中概述的所有三个条件。
输入:VPN
但是,这是磨擦。引入VPN会引起显示停止的问题(嗯,这取决于特定的VPN及其配置)。
现代VPN能够进行Split Tunneling,这是上述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允许拆分隧道,这很可能是一个简单的问题,启用它很简单,在这种情况下,我很乐意听取您关于“一切正常”的信息。