我们在云服务器上建立了两个开放的VPN实例:
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
inet 10.230.0.1 peer 10.230.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
8: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
inet 10.30.0.1 peer 10.30.0.2/32 scope global tun1
valid_lft forever preferred_lft forever
tun0
用作“服务 VPN”。
tun1
用作“客户端 VPN”。
我们不想client-to-client
在两个 VPN 实例中使用。
为此,我们设置了 IP 表规则,以便数据包可以从服务 VPN 转发到客户端 VPN:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.230.0.0/24 anywhere
我们可以从服务 VPN ping 任何客户端 IP:
traceroute to 10.30.0.10 (10.30.0.10), 30 hops max, 60 byte packets
1 10.230.0.1 (10.230.0.1) 22.226 ms 22.152 ms 22.135 ms
2 10.30.0.10 (10.30.0.10) 42.465 ms 42.473 ms 42.462 ms
客户端 VPN 后面还有其他本地网络:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.0.10/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
inet 10.30.0.10 peer 10.30.0.9/32 scope global tun0
valid_lft forever preferred_lft forever
我们希望将此网络路由到通过服务 VPN 连接的机器。在此示例中,网络应为 192.168.0.0/24。但是,我们需要确保来自不同客户端 VPN 的多个相同本地网络可以同时路由到不同的服务 VPN。
我们尝试使用 iptables 来解决这个问题:
iptables -t nat -A PREROUTING -s 10.230.0.10 -i tun0 -d 192.168.0.0/24 -j DNAT --to 10.30.0.10
但是,现在所有流量都重定向到客户端 VPN。但是,我们需要转发到其后面的 LAN。
我们有另外两种方法来解决这个问题:
- 使用
tap
而不是tun
。我们不想这样做,因为我们希望 VPN 分离。 - 反向 VPN 客户端 VPN 设备上的另一个 VPN 服务器。这可以提供第二个 OpenVPN 实例作为服务器。这将是“隧道中的隧道”,可以通过云服务器进行路由。