在宿主机中使用虚拟机的VPN连接

简介

办公环境常常需要通过VPN访问某些服务或资源。但有些VPN软件只存在Windows版本的客户端、不能在Linux系统上使用;这意味着Linux系统用户将无法直接访问前述服务或资源。

为解决上述问题,这里将介绍如何通过Windows虚拟机建立VPN连接并将其共享给Linux宿主机、使后者能够借此访问特定的服务和资源。为了更加具体,下面假设宿主机和虚拟机的操作系统分别是Ubuntu 22.04和Windows 10,且虚拟机是在VirtualBox 6.1中运行的。另外,此方法理论上适用于所有VPN软件,因此下面不对此作具体假设。

为虚拟机添加用于基本网络连接的网卡

先确认目标虚拟机处于已关闭的状态(如果虚拟机正在运行,则先关闭虚拟机),然后在VirtualBox程序界面里选中该虚拟机并点击设置,在网络目录下的网卡1中点击启用网络连接,并选择网络地址转换(NAT)作为连接方式;其他设置保持默认值。下图显示了配置的结果;在此例中,所创建的网卡1的MAC地址是080027D9FE82

完成以上配置后,可以启动虚拟机,检查是否能够正常访问网络、VPN服务器能否ping通。接着,在PowerShell中执行Get-NetAdapter命令,并通过比对MAC地址找到与网卡1所对应的适配器名称用于后面的配置;在此例中,它对应的是以太网(见下图)。

为宿主机添加仅主机网络

在VirtualBox程序界面菜单栏里点击主机网络管理器,并在弹出的主机网络管理器界面中点击创建仅主机(Host-only)网络,然后在网卡标签页中通过手动配置网卡的方式配置网络属性。下图显示了配置的结果;在此例中,所配置的网络名称是vboxnet0,且IPv4地址、IPv4网络掩码分别是192.168.56.1255.255.255.0(其他配置保持默认值即可,不需要在这里启用DHCP服务器1)。

完成以上配置后,可以在宿主机的终端中执行ip link命令列出网络设备并确认vboxnet0是否出现在结果中(如下图所示)。

为虚拟机添加用于共享VPN连接的网卡

在确认目标虚拟机处于已关闭的状态后(如果虚拟机正在运行,则先关闭虚拟机),再次进入目标虚拟机的网络设置界面,打开网卡2并点击启用网络连接,然后在连接方式中选择仅主机(Host-Only)网络、并选择在前一个步骤中创建的网络vboxnet0。其他配置保持默认值即可。下图显示了配置的结果;在此例中,所创建的网卡2的MAC地址是08002791D8FF

完成以上配置后,可以启动虚拟机,在PowerShell中执行Get-NetAdapter命令,并通过比对MAC地址找到与网卡2所对应的适配器名称用于后面的配置;在此例中,它对应的是以太网 2(见下图)。

在虚拟机中建立VPN连接

启动虚拟机并建立VPN连接(所使用的VPN软件根据具体需要而定),并找到对应的适配器(可以通过VPN连接启动前后Get-NetAdapter命令显示的适配器的状态变化来判断)。例如,这里通过Sangfor EasyConnect客户端建立了一个VPN连接,它所对应的适配器是以太网 3

完成此步后,可以在虚拟机中使用ping命令尝试对仅能通过VPN访问的内网地址进行连接测试,确定所建立的VPN连接能够正常运作。

向仅主机网络共享VPN连接

在虚拟机的网络连接界面选择与VPN连接所对应的适配器以太网 3,点击鼠标右键选择属性,然后在共享标签页中点击允许其他网络用户通过此计算机的Internet连接来连接、并选择之前配置好的仅主机网络以太网 2作为共享对象。

完成上述操作后,在虚拟机的网络连接界面选择适配器以太网 2,点击鼠标右键选择属性,然后在网络标签页中打开Internet 协议版本 4 (TCP/IPv4)属性,并对IP地址进行修改,确保修改后的地址与之前配置的vboxnet0的IP地址不同2。回顾前文,vboxnet0的IP地址是192.168.56.1;则这里可以把以太网 2的IP地址改为192.168.56.2

完成此步后,可以在宿主机中使用ping命令尝试对以太网 2192.168.56.2)进行连接测试,确保宿主机与虚拟机之间的网络连接能够正常运作3

在宿主机中使用虚拟机的VPN连接

在成功完成前面的配置后,虚拟机的VPN已经通过仅主机网络vboxnet0以太网 2192.168.56.2)接口共享给宿主机了。接下来,只要告知宿主机接口的使用规则(即路由规则),即可通过VPN访问特定服务和资源了。假设需要通过VPN访问的目标地址(或网段)是172.25.11.77/32,则应该执行以下命令:

sudo ip route add 172.25.11.77/32 via 192.168.56.2 dev vboxnet0

# 以下命令可以删除路由规则
# sudo ip route del 172.25.11.77/32 via 192.168.56.2 dev vboxnet0

添加上述规则后,就应该能顺利访问目标地址了(验证方法:在宿主机的命令行终端中ping目标地址,成功的话一般会有响应)。

注意,上述ip route add命令创建的路由规则是临时的,每次重启宿主机操作系统后都要重新添加路由规则才可以使用VPN连接。如需添加持久的路由规则,请看附录相关介绍。

【TODO】附录:添加持久路由规则

此配置的目的在于使路由规则持久化,避免重复添加。

添加永久路由的其中一个方法是使用NetworkManager的nmcli命令;在添加前,需要先在宿主机命令行终端里通过nmcli general status命令查看NetworkManager是否已启动(如下图)。

如果没有,那么需要进一步了解系统是否使用其他同类软件服务来控制网络(例如networkd或netplan等),并改用对应的操作方法(此处不作介绍)。

剩余操作有待研究。一些备注:

  • 可能要了解相关设备是否需要托管到NetworkManager,以及如何托管;
  • 根据一些材料的说法,路由规则可以通过以下命令添加(但实测未成功);

    sudo nmcli connection modify vboxnet0 +ipv4.routes "172.25.31.76/32 192.168.56.2"
    sudo nmcli connection reload
  • 可以尝试比较使用ip route add添加规则前后nmcli device shownmcli connection shownmcli connection show vboxnet0等命令输出结果的差异,分析如何使用nmcli添加路由规则。

【TODO】附录:同时使用多个VPN连接

此配置的目的在于使虚拟机能够同时建立、共享多个VPN连接,并使宿主机能够同时使用多个VPN连接访问位于不同网络内的服务和资源。

具体操作有待研究。

【TODO】附录:添加DNS地址

此配置的目的在于实现内目标网络内的域名解析。

具体操作有待研究。


  1. 疑问:如果开启了DHCP服务器,是否可以简化配置流程,省略在虚拟机中修改与仅主机网络对应的适配器IP地址(见下文)?另外,我按照默认的配置,并未发现仅主机网络IP以及虚拟机内与该网络对应的适配器IP之间存在冲突(相同),此情况似乎也提示修改在虚拟机中修改适配器IP并不是必要的步骤。找个时间试试。

  2. 为什么?

  3. 参考材料写到可以通过此方法检测宿主机和虚拟机之间的连接是否已经打通;但我在实际操作时发现,即使ping不通,仍然能够访问目标网络中的服务和资源。原因有待研究。

相关

上一页
comments powered by Disqus