我有一个付费的 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 客户端。