Lyndra's Blog

Linux(Manjaro)宿主机通过virtualBox虚拟机win11连接vpn访问内网

2023-10-12
系统维护网络安全 NetworkManjaroLinux
12分钟
2389字
温馨提示:本文最后更新于 2025-03-11 ,部分信息可能因时间推移而不再适用,欢迎反馈。

参考链接:宿主机利用在虚拟机中建立的VPN加密隧道连接内网在宿主机中使用虚拟机的VPN连接

  整体思想是:

  建立一张单独的host-only网卡,使得虚拟机和宿主机之间可以通信,利用windows的网络分享功能,将VPN的网卡的网络分享到这张host-only网卡。那么访问这张host-only网卡,就可以访问到VPN的网络。而host-only网卡可以被主机访问到。因此,就是实现了主机通过虚拟机的VPN进行访问的功能。但虚拟机仍然需要一张可以直接上网的网卡。因为虚拟机需要正常和外界通信,因此主机需要为虚拟机创建两张独立的网卡。

  注意:本文的应用场景是在非校园网环境,Linux系统通过虚拟机的VPN来访问校园网资源,在上述参考链接中,其中一个虚拟机使用的是桥接网卡上网,另一个使用的是网络地址转换NAT上网。

  根据我的测试,校园网环境可能会阻止桥接模式下虚拟机获取 ipv4 地址,我们学校最开始允许宿舍有线网络上网,这时还可以通过桥接模式获取到ipv4的地址。后面禁止了有线网络,现在我的虚拟机桥接模式在校园网环境中就获取不到ipv4地址了。于是我在校园网中只能使用NAT模式上网。

  但在公司时,虚拟机使用NAT上网并在开启VPN后,整个虚拟机将无法访问网络。这应该跟网络地址转换NAT有关,因为使用该方法,虚拟机获取的ip地址是10.0.2.16,可能跟VPN代理的10.0.0.0网段有冲突。导致最后虚拟机无法正常上网。

  解决方案就是:在学校校园网用虚拟机NAT上网,在校园网以外的地方,用桥接网卡的方式上网。

  为了方便,我创建了三张网卡:NAT、host-only、桥接。便于在NAT和host-only之间切换。

虚拟机添加host-only网络

virtaulBox建立host-only网卡

  选中工具->网络,然后建立一个host-only网络

default

  点击DHCP服务器,启动服务器,也可以不使用DHCP。区别在与在后续Linux宿主机添加路由节点时,DHCP分配到的网址可能不唯一,每次都需要重新查看。而使用默认地址,则固定为192.168.137.1。

  这里需要注意,VirtualBox >= 6.1.28 ​的版本上,默认指定的网段是192.168.56.0/24,无法更改为其他网段。因此不能够像这篇文章 宿主机利用在虚拟机中建立的VPN加密隧道连接内网 中提到的,修改VirtualBox的网段。

2024.10.21补充:目前virtualbox 7.1.2​已经支持修改网段。我将该host-only网址指定为 192.168.137.2,因为windows11在网络共享时默认指定的网络地址192.168.137.1,需要两者在同一网段内。可以在后续少修改一次网络地址。

default

default

  添加完后,可以在Linux宿主机中查看

Terminal window
1
ip addr

default

为虚拟机添加host-only的网卡并设置共享VPN网络

  在虚拟机对应的设置中,增加一个网卡,连接方式选择 仅主机(Host-Only)网络​。但需要先关闭虚拟机,否则无法进行更改,就像我这里一样,没有关闭虚拟机,按钮是灰色的。

​​default​​

  添加完成后,记住这里的MAC地址结尾E124,后续识别网卡的时候会用。打开虚拟机,进入设置->网络和Internet->高级网络设置->更多网络适配器选项。

default

  这里的三个网卡,其中一个是深信服的Sanfor的网卡,也就是我这里的vpn软件使用的网卡。以太网是NAT网络的网卡,以太网2是host-only网卡。

  可以在win11中的终端中输入命令Get-NetAdapter​查看,前面添加网卡的时候提到,E124结尾的是Host-Only,所以这里就可以区分出哪一些是VPN的网卡,哪一些是virtualbox创建的网卡。

default

  然后开启VPN,转到网络适配器界面。右键VPN对应的网卡,选择 属性->共享,然后选择Host-Only网卡。

default

  这里win10以前的系统可能弹出提示窗,说会前往设置以太网2的IP为192.168.137.1,我是安装的win11,没有弹窗,默认更改。因此,我们需要手动将Host-Only网卡的IP修改回原来的设定好的地址。

2024.10.21补充:目前virtualbox 7.1.2​已经支持修改网段。我将该host-only网址指定为 192.168.137.2,因为windows11在网络共享时默认指定的网络地址是192.168.137.1,两者需要在同一网段内不能冲突。这里就不需要更改。

  右键Host-Only网卡,选择属性,Internet 协议版本 4,然后双击,就会弹出修改IP的弹窗。

​​default​​

  如果前面开启了DHCP,则可以点自动获取IP,否则需要手动改动IP为Host-Only网络段中与前面设置不同的IP地址。比如前面已经使用了 192.168.56.1 和 192.168.56.2,则就现在就需要设置为192.168.56.3。

default

  设置完成后,回到host。

连通性测试

  设置完成后,在host的终端中,应该可以ping通虚拟机中的host网卡的地址
default

  如果ping不通,显示无法到达,很可能是win11的防火墙没有开启报文回复功能。

  参考:知乎回答,在设置中按照 隐私安全性 -> Windows安全中心 -> 防火墙和网络保护,打开防火墙设置

default

  然后打开高级设置,将入站和出站的ICMPv4回显请求​功能打开。

default

宿主机设置路由

添加路由规则

  我使用的manjaro,默认安装的是ip工具,先查看当前路由表

Terminal window
1
sudo ip route

default

  可以看到192.168.56.0/24的网络段都会被路由到虚拟机win11的地址为192.168.56.1的网卡上去。但没有将VPN内网地址路由到虚拟机的表项。

  因此需要添加路由规则,将VPN访问的网段路由到192.168.56.3,也就是之前在虚拟机中的host-only网卡中修改的地址。vboxnet0就是之前添加网卡时,系统中显示的网卡。

Terminal window
1
sudo ip route add 10.0.0.0/8 via 192.168.56.3 dev vboxnet0 metric 100

  我要访问的VPN网段为10.0.0.0/8,如有需要可以更改为自己的内网网段。metric 100​设置路由优先级,避免在Linux宿主机开启其他网络代理时,优先代理该网络段。

2024.10.21补充:目前virtualbox 7.1.2​已经支持修改网段。我将该host-only网址指定为 192.168.137.1,因为这是windows11在网络共享时默认指定的网络地址。则这里路由添加表项就应当修改为

Terminal window
1
sudo ip route add 10.0.0.0/8 via 192.168.137.1 dev vboxnet0 metric 100

  添加完成后再次查看

default

  此时 PING 自己的内网网段,就可以ping通。如果这里发现,ping不通,则需要在win11中重新将VPN的网卡分享到host-only网卡,然后修改host-only网卡(或者是VPN不会转发ICMP消息,可以直接打开对应VPN内网资源看看是否成功)。下一次开机时,需要先取消共享网络,再重新共享,否则也会出现没有回复的情况。(即每次开虚拟机并开启VPN后,都需要重新共享网络

default

  设置完成后,如果重启虚拟机,需要重新分享网络,然后再更改ip。​​

  目前还没有添加永久路由的方法,每次Linux宿主机重启后,都需要重新添加路由。

在主机中访问对应网段

  当可以ping通时,就能够在主机中正常访问了。实测ssh到内网网段服务器也是可以的。

default

  且不会和主机中的vpn冲突。我的主机使用的是v2ray进行科学上网,实测对本文中的行为没有影响,如果使用其他方式,不能保证。

2024.10.21补充: 在 v2ray 不能很好的解决DNS泄漏,以及代理节点转向clash verge后,换用clash verge作为代理软件。在Linux上,Clash需要开启TUN模式,会接管DNS系统。我们学校的一些内网域名需要向VPN软件设立的DNS服务器(198.18.0.1)查询ip地址,而TUN模式的DNS查询不会自动转发到我们自己设立的虚拟机的网路中,因此导致这类网址只能在虚拟机中访问。

尝试过在clash中配置单独的域名解析地位,将这类域名DNS解析服务器指定为198.18.0.1​,并将clash的fake ip域名范围修改为198.19.0.1/16​(默认为198.18.0.1/16​,和VPN的网段冲突)。但目前的clash verge版本中,配置nameserver-policy:​不生效,因此,此方案还没有结果。

目前没有其他解决方式,但这种情况不需要在Linux宿主机上解决,直接在虚拟机上访问即可。本文的初衷是在Linux中的终端访问服务器,或者vscode连接服务器工作,因此只需要能够正常通过ip连接内网服务器即可。

2024.11.4补充: 本文只能代理 10.0.0.0/8​ 的网段,如果希望通过访问内网域名的形式访问内网资源,则还应当配置 DNS 服务器。   ‍

本文标题:Linux(Manjaro)宿主机通过virtualBox虚拟机win11连接vpn访问内网
文章作者:Lyndra
发布时间:2023-10-12
总访问量
总访客数人次
Copyright 2025
站点地图