如何通过只能在 VM 内访问的 VPN 路由流量(没有桥接适配器)?

jat*_*255 5 routing virtual-machine vpn virtualbox

我有一个有趣的情况,我有一个公司 VPN,它只能使用供应商提供的客户端通过特定(过时)版本的 Ubuntu(和/或 Windows)连接,该客户端tun0在成功验证后创建 VPN 接口。我在我的个人 Linux 机器上使用不同的发行版,由于库问题,VPN 客户端将无法在该发行版上运行。

作为一种解决方法,当虚拟机配置为桥接模式时,我或多或少地想出了如何将 Ubuntu 虚拟机(在 VirtualBox 上)配置为用作路由器。不幸的是,这适用于某些网络(例如我的家庭网络),因为我可以为桥接 VM 获得另一个 IP 没问题,但是在许多公共网络上,这不起作用。

我相信我应该能够使用 VM 上的两个网络适配器来做到这一点,一个使用 NAT,一个作为 Host-Only 连接,但我不确定如何设置路由以便我可以在我的计算机上发送流量主机通过 VPN 隧道。

这是到目前为止的设置:

[host]$ VBoxManage list hostonlyifs 

Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.56.1
NetworkMask:     255.255.255.0
IPV6Address:     fe80::800:27ff:fe00:0
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
Run Code Online (Sandbox Code Playgroud)

来宾接口(连接到 vpn 后 -enp0s3是 NAT 适配器,enp0s8是仅主机适配器):

[guest]$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:b2:d9:c2 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
       valid_lft 83176sec preferred_lft 83176sec
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:3c:81:82 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s8
4: tun0: <POINTOPOINT,UP,LOWER_UP> mtu 1384 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet XXX.XXX.XXX.XXX peer 1.1.1.1/32 scope global tun0
Run Code Online (Sandbox Code Playgroud)

在来宾上,我使用以下命令启用仅主机适配器和 VPN 隧道之间的转换:

[host]$ VBoxManage list hostonlyifs 

Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.56.1
NetworkMask:     255.255.255.0
IPV6Address:     fe80::800:27ff:fe00:0
IPV6NetworkMaskPrefixLength: 64
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
Run Code Online (Sandbox Code Playgroud)

在主机上,我可以用192.168.56.1(仅限主机的 VM 适配器)替换默认路由,但显然根本无法输出任何数据。由于 VM 无法自行访问 Internet,因此我需要通过主机将一些流量传入/传出 Internet,但随后我想强制尽可能多地通过 VM 的 VPN 连接. 感觉就像我很接近,这应该是可能的,但我不确定丢失的部分是什么。

附带说明一下,我认为我可以通过对 VM 执行 SSH SOCKS 代理来使其适用于某些应用程序,也许?如果可能,我想通过 VPN 路由所有流量。

编辑:

这是一张图表或多或少地显示了我在说什么,希望它能让它更清楚。我的困惑是源自tun0VM的流量必须通过桥接适配器才能访问 Internet。我不确定是否可以设置路由,使流量不会通过虚线,而是完全通过 VM 并以这种方式流出。如果我通过 VM 发送所有流量(将默认路由更改为仅主机适配器),那么它会进入循环或其他什么,并且根本没有流量可以到达互联网:

所需网络图

小智 1

在我看来,你有两个选择:

  1. 为特定范围的(公司)主机添加非默认路由,这些主机在没有 VPN 的情况下无法访问。例如,假设您尝试访问10.0.0.0/8公司子网,那么您可以简单地添加一条带有以下内容的路由:ip route add 10.0.0.0/8 via 192.168.56.101,其中192.168.56.101是仅主机适配器 ( vboxnet0/ enp0s8) 上来宾的 IP 地址。当然,您还应该更新您的/etc/resolv.conf公司 DNS 服务器。

    • 优点:无需桥接适配器即可工作。事实上,我经常将此配置与 NAT 适配器一起使用。
    • 缺点:只有公司流量通过 VPN 路由。这实际上可能是一个很好的副作用,但根据你的问题,这是不可取的。
  2. 使用设备直通,以便来宾能够完全访问专用适配器,从而无需桥接适配器(例如wlp2so)。例如,您可以使用 USB Wi-Fi 适配器。

    • 优点:所有流量都可以通过 VPN 路由。
    • 缺点:您需要为客人配备专用设备。