我有一台 VirtualBox VM(主机和客户机均为 Ubuntu Maverick)。我的 VPN 提供商使用 OpenVPN 设置 TUN。我希望进行设置,以便 VM 的流量仅通过 VPN,如果 VPN 发生故障(这种情况已经发生过),流量就会被丢弃。有什么建议吗?我的 iptables-fu 有点弱
我尝试过:使用 VirtualBox 的“仅主机网络”,它为您提供主机上到客户机的 vboxnet0 环回接口,但无法正确获取 iptables/routes。我想避免在 VM 上使用 NAT,因为我已经进行了双重 NAT(ISP 和家庭路由器),再增加一个级别就会让我头晕目眩。
其他可能性:切换到 TAP(如何?)并桥接至 VM。在 VM 内创建 VPN 并使用 iptables 过滤除 VPN 连接之外的所有 eth0 流量(但请参见下文)
加分项:如果您能告诉我如何在主机和客户机上使用不同的 VPN 出口点,而无需通过主机的 VPN 对来自客户机的流量进行双隧道传输。
答案1
还会有其他解决方案,但这是我的想法:
- 以桥接模式设置虚拟机。这将为您的虚拟机提供与主机位于同一网络中的 IP 地址。
- 在主机上设置 VPN,假设它是 tun0。
- 在主机上启用路由
echo 1 > /proc/sys/net/ipv4/ip_forward
- 使用主机 IP 地址将 VM 设置成默认 gw。
此时,主机已建立 VPN 连接,虚拟机会将所有流量路由到主机。剩下要做的就是限制主机,使其不允许客户机路由任何不会通过 tun0 设备的流量。您可以使用一组 iptables 规则来做到这一点,如下所示:
iptables -P FORWARD DROP
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
那应该工作。第一条规则设置默认策略以丢弃 FORWARD 链中的数据包。这只会影响主机将路由的数据包,而不会影响发往主机(输入)或来自主机(输出)的数据包。第二条规则允许任何路由出 tun0 的流量 - 如果需要,您可以使用 --source 来收紧它。最后一条规则应该让从 tun0 返回的回复路由回虚拟机。
您的 VPN 是否希望 tun 接口上的所有数据包都来自单个 IP?如果是这样,您还需要添加 NAT 规则。可能类似于:
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source {your host tun0 ip}