如何通过只能在虚拟机内访问的 VPN(无需桥接适配器)路由流量?

如何通过只能在虚拟机内访问的 VPN(无需桥接适配器)路由流量?

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

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

我相信我应该能够使用虚拟机上的两个网络适配器来完成此操作,一个具有 NAT,另一个作为仅主机连接,但我不确定如何设置路由以便我可以在我的网络上发送流量主机通过 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

访客接口(连接到 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

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

sudo sysctl net.ipv4.conf.all.forwarding=1
sudo sysctl net.ipv6.conf.all.forwarding=1
sudo iptables -A FORWARD -i enp0s8 -o tun0 -j ACCEPT
sudo iptables -A FORWARD -i tun0 -o enp0s8 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

在主机上,我可以用192.168.56.1(仅主机虚拟机适配器)替换默认路由,但显然根本没有数据可以出去。由于虚拟机无法自己访问互联网,因此我需要有一些流量通过主机进出互联网,但随后我想强制尽可能多的流量通过虚拟机的 VPN 连接。感觉我已经很接近了,这应该是可能的,但我不确定缺少的部分是什么。

顺便说一句,我想我可以通过对虚拟机进行 SSH SOCKS 代理来使其适用于某些应用程序,也许?如果可能的话,我想通过 VPN 路由所有流量。

编辑:

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

所需的网络图

答案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 服务器更新您的 DNS。

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

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

答案2

这看起来是旅行路由器的一个很好的用例。您可以将其放在计算机和网络之间并将其用作本地 DHCP 服务器。像这样的东西会很好用GL-iNet GL-AR750S“石板”。然后您就可以在任何地方使用桥接模式设置。即使您所在的地方不喜欢“恶意无线接入点”,您也可以只使用以太网端口。

像这样的设备还有很多其他很好的用途。它们还兼作移动电源和小型文件服务器。 StackExchange 的创始人杰夫·阿特伍德 (Jeff Atwood) 在这里写下了他对第一批运行良好的旅行路由器之一的个人使用情况:https://blog.codinghorror.com/your-own-personal-wifi-storage/

相关内容