通过 VPN 路由虚拟机流量,但不路由主机流量

通过 VPN 路由虚拟机流量,但不路由主机流量

我有一个付费的 VPN 服务,我想通过它来路由(虚拟盒)虚拟机的流量,但不路由来自(Linux)主机的流量。

VPN 服务使用 openvpn。我有一堆配置文件可以让我连接到不同的服务器。我可以更改接口类型(tun/tap)。

从我读到的内容来看,似乎我需要在 tap0 和 vboxnet0(仅主机的虚拟盒接口)之间创建一个桥接。我为此尝试了几种解决方案,但似乎都没有奏效。我担心可能需要一些 iptables foo,但我甚至不知道从哪里开始。

任何帮助,甚至是正确方向的推动都将非常感激。

答案1

我假设你正在使用 OpenVPN路由配置(tun 设备不能用于桥接模式)。当 OpenVPN 处于桥接模式时,将 tap 设备连接到客户端的桥接器就足够了。

在路由模式下,您需要决定如何设置路由,您可以为虚拟机使用 NAT,然后通过 vpn 路由流量。要为所有接口启用转发:

sysctl net.ipv4.conf.all.forwarding=1

并配置相关的iptable规则以允许转发流量并使用MASQUERADE目标启用NAT:

iptables -A FORWARD -i vboxnet0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o vboxnet0 -j ACCEPT

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

最后你可以使用策略路由通过 VPN 路由所有来宾流量:

# name routing table as vguest
echo 100 vguest >> /etc/iproute2/rt_tables

# use vguest routing table for traffic from 10.0.0.0/24 (guest network) 
ip rule add from 10.0.0.0/24 table vguest

# default route via openvpn gateway
ip route add default via 10.8.0.1 dev tun0 table vguest

# flush route cache
ip route flush cache

或者,你可以设置另一个来宾来运行 openvpn,或者在单独的 Linux 中运行 openvpn网络命名空间. NAT 和转发可以使用与上述类似的步骤完成。

答案2

在虚拟机上安装 OpenVPN 客户端。

相关内容