OpenVPN/iptables:多客户端本地网络的路由

OpenVPN/iptables:多客户端本地网络的路由

我们在云服务器上建立了两个开放的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。

我们有另外两种方法来解决这个问题:

  1. 使用tap而不是tun。我们不想这样做,因为我们希望 VPN 分离。
  2. 反向 VPN 客户端 VPN 设备上的另一个 VPN 服务器。这可以提供第二个 OpenVPN 实例作为服务器。这将是“隧道中的隧道”,可以通过云服务器进行路由。

相关内容