我正在尝试通过 OpenVPN 网络路由发往公共互联网的流量,该流量将通过网络上的另一个客户端(恰好是 VirtualBox VM)退出 VPN。
为了解释拓扑结构,我将使用客户端 A 作为流量发起者,客户端 E 作为流量的期望出口/假定起点。客户端和服务器都是 Linux 机器。
客户端 A 和 E 都连接到 OpenVPN 服务器,并在服务器创建的子网上拥有本地地址;假设为 10.8.0.0/16,其中服务器有 10.8.0.1,客户端 A、E 有 ...2 和 ...3。客户端可以通过服务器相互访问。OpenVPN 服务器还具有一个在 OpenVPN 连接上运行的到客户端 E 的 GRE 隧道。
目前,抽象的拓扑/流程如下所示:
(A) ={OpenVPN}=> (OpenVPN Server) ={GRE in OpenVPN}=> (E) -> ...
我遇到的问题是,一旦流量到达客户端 E,它就不会通过 E 的默认网关发送至公共互联网。
客户端相关配置如下:
A:
default gateway is the OpenVPN server (10.8.0.1)
OpenVPN 服务器:
ip rule add from 10.8.0.2 lookup node
路由表“节点”具有以下路由:
default dev gre5 scope link
10.8.0.0/16 dev tun0 proto static scope link src 10.8.0.1
埃:
default gateway is the VirtualBox nat network (through which it has a working Internet connection)
net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -o eth0 -j MASQUERADE
The iptables policy for E's filter table is to accept everything.
使用 tcpdump 我可以看到来自 A 的数据包从 E 的 GRE 隧道接口出来,但它们似乎在 E 上丢失。我已经能够验证它们没有通过 E 的任何接口(环回、虚拟隧道或 VBox nat 网络接口;上面的 eth0)转发。
我是否缺少一些与 GRE 隧道有关的额外/特殊配置,或者与之相关的配置?这个问题是否与终端客户端是 VM 有关?
或者,有没有更好的方法将用于外部网络的流量通过 OpenVPN 网络引导到客户端?
如果需要,我很乐意提供进一步的详细信息。
E 的路由表,按照@MariusMatutiae 的要求
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
10.8.0.0 * 255.255.0.0 U 0 0 0 tun0
10.10.5.0 * 255.255.255.0 U 0 0 0 gre5
192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
其中 eth0 连接到 VBox nat 网络,eth1 连接到我用于 ssh 进入 VM 的仅主机网络,tun0 是 OpenVPN 接口,gre5 是 GRE 隧道的接口。