如何让 VirtualBox 来宾共享主机的 VPN 连接?

Pro*_*ter 68 vpn networking routing tunnel router

当我在充当路由器的 ubuntu 台式计算机上启动 VPN 时,连接的子网失去了 Internet 连接,但仍然可以访问(LAN)。理想情况下,我想知道如何在 VPN 处于活动状态时通过 VPN 隧道路由来启用连接的子网以重新获得 Internet 访问。

语境

我有以下网络布局:

eth0 上的子网 172.16.0.0/20 用于我的 VirtualBox 虚拟机。

eth0:0 上的子网 192.168.0.0/24 连接到可以访问互联网的网关 192.168.0.1。

这显示在 /etc/network/interfaces 文件中:

auto lo
iface lo inet loopback

# This is the subnet dedicated to VB
auto eth0
iface eth0 inet static
    address 172.16.0.1
    netmask 255.255.0.0
    gateway 192.168.0.164
    dns-nameservers 8.8.8.8

# normal DHCP internet
auto eth0:0
iface eth0:0 inet static
    address 192.168.0.164
    netmask 255.255.255.0
    dns-nameservers 8.8.8.8
    gateway 192.168.0.1
Run Code Online (Sandbox Code Playgroud)

eth0 上的数据包通过 eth0:0 转发,并伪装成正常的互联网连接。但是,当我在此路由器上启动 VPN 隧道时,eth0 子网上的虚拟机的 Internet 连接丢失(但路由器仍保持连接)。

以下是隧道处于活动状态时ifconfig输出

eth0      Link encap:Ethernet  HWaddr 00:1f:bc:01:c3:ab  
          inet addr:172.16.0.1  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::21f:bcff:fe01:c3ab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:165426 errors:0 dropped:0 overruns:0 frame:0
          TX packets:182601 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:208264321 (208.2 MB)  TX bytes:16660945 (16.6 MB)
          Interrupt:16 

eth0:0    Link encap:Ethernet  HWaddr 00:1f:bc:01:c3:ab  
          inet addr:192.168.0.164  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:16 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:381963 errors:0 dropped:0 overruns:0 frame:0
          TX packets:381963 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:22755054 (22.7 MB)  TX bytes:22755054 (22.7 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Run Code Online (Sandbox Code Playgroud)

我怀疑该解决方案与路由表有关当隧道处于活动状态时,它显示以下内容:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.8.0.9        128.0.0.0       UG    0      0        0 tun0
default         192.168.0.1     0.0.0.0         UG    100    0        0 eth0
10.8.0.0        10.8.0.9        255.255.255.0   UG    0      0        0 tun0
10.8.0.9        *               255.255.255.255 UH    0      0        0 tun0
37.139.23.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
128.0.0.0       10.8.0.9        128.0.0.0       UG    0      0        0 tun0
link-local      *               255.255.0.0     U     1000   0        0 eth0
172.16.0.0      *               255.255.0.0     U     0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

以及隧道不活动时的以下内容:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    100    0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
172.16.0.0      *               255.255.0.0     U     0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

Vms 的 Virtualbox 配置:

在此处输入图片说明

虚拟机/etc/network/interfaces文件之一:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 172.16.0.3
        netmask 255.255.0.0
        network 172.16.0.0
        broadcast 172.16.255.255
        gateway 172.16.0.1
        dns-nameservers 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

小智 55

对于带有 Windows 主机和 linux(mint) 来宾的 VirtualBox,转到“网络 UI”选项卡并设置“适配器”=>“附加到:NAT”和“适配器类型:半虚拟化网络”。之后启动您的虚拟机,您应该能够使用 VPN 网络。

  • 这对我很有用,谢谢!使用 Ubuntu 16.04LTS 作为我的来宾和 Windows 10 主机,以及 Virtual Box 5.0.24。 (3认同)
  • @MichaelGoldshteyn 这不是公认的答案,因为 OP 不想等待两年半的时间(a)答案和(b)2014 年 2 月还不存在的 VirtualBox 功能。我会更新我的回答提到,实验性功能已作为“半虚拟化网络适配器”提供。 (3认同)
  • 需要澄清的是,必须先关闭虚拟机,然后才能选择“高级”部分下的“半虚拟化网络” (3认同)
  • 杰出的!这适用于我的 Windows 10 主机和 VirtualBox (5.0.26) CentOS 7 来宾。 (2认同)
  • 惊人的!应该是公认的答案。多年来一直在寻找这个解决方案。非常感谢! (2认同)
  • 最佳答案在这里! (2认同)

zwe*_*ets 38

这在桥接网络设置中不起作用。从VirtualBox 文档

桥接网络

这适用于更高级的网络需求,例如网络模拟和在来宾中运行服务器。启用后,VirtualBox 连接到您安装的网卡之一并直接交换网络数据包,绕过主机操作系统的网络堆栈。

由于您的虚拟机eth0直接使用,它们不知道tun0运行在它上面的隧道的接口。您将需要使用不同的虚拟网络配置。

您有(除其他外)以下选项:

  • 网络地址转换 (NAT)是迄今为止最简单的解决方案。VirtualBox 将通过主机可用的任何 Internet 连接对 VM 进行 NAT。这对 VM 是完全透明的。然而,这排除了从主机到 VM 的连接或 VM 之间的连接。

  • 使用Host-only Networking创建包含 VM 和主机的适当子网。这将不需要更改您现在在 VM 中的接口配置,但您需要将主机设置为网关和路由器,使其通过 NAT 将 VM 连接到外部(无论是通过其eth0还是tun0)。

  • 结合以上内容:为每个 VM 提供两个接口,一个连接到外部世界(通过 VirtualBox 的NAT),另一个连接到Host-Only LAN

  • 尝试 VirtualBox 的实验性NAT 网络配置。 2019 年更新:此功能已经成熟:附加到主机的 NAT 并选择半虚拟化网络 (virtio-net)适配器类型。


小智 11

在到处寻找这个解决方案之后,我终于找到了一个不需要大量配置更改并且非常简单的工作解决方案。使用默认的 NAT 网络并在终端中输入:

VBoxManage modifyvm "VM name" --natdnsproxy1 on
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.virtualbox.org/ticket/13993


Ram*_*ast 5

有同样的问题。这是我解决它的方法:

  1. 将访客系统的网络类型更改为“仅主机”
  2. 将Guest的默认网关指向Host的ipifconfig vboxnet0即可找到。

最后一步是将来自 vboxnet0 的数据包路由到您的 VPN。

如果您通过 VPN 路由所有流量:

iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5
Run Code Online (Sandbox Code Playgroud)

10.8.0.5你的 tun0 网关在哪里,192.168.5.0/24你的 vboxnet0 网络范围在哪里。

如果您仅通过 VPN 路由某些流量:

iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o wlan0 -j SNAT --to-source 192.168.43.95
Run Code Online (Sandbox Code Playgroud)

哪里10.8.0.5是你的TUN0网关192.168.43.95是你wlan0的网关和192.168.5.0/24你vboxnet0网络的覆盖范围。

注意:此解决方案允许以与处理主机 OS 相同的方式处理来宾 OS。只有在主机操作系统中配置为通过 VPN 的 IP 才能在来宾中通过它。