OpenVPN 客户端站点网络路由

OpenVPN 客户端站点网络路由

我有以下 openvpn 设置,目标是使主机 D 可以连接到公司网络中的任何计算机(linux)来执行一些维护工作:

        corporate network                           remote vpn server
=============================================      =====================
    A                B          C(vpn client)      D(vpn server)
10.0.10.101 ---- 10.0.10.100                   |
                 10.0.51.100 ---- 10.0.51.101  |
                                  10.8.1.2  ---|-- 10.8.1.1
                                               |

主机B路由表:

10.8.1.0/24 via 10.0.51.101

主机C路由表:

10.0.10.0/24 via 10.0.51.100

主机D路由表:

10.0.10.0/24 via 10.8.1.2
10.0.51.0/24 via 10.8.1.2

正在使用子网拓扑设置 openvpn,它链接公司网络子网 10.0.51.0/24。

我的目的是让主机D可以和主机A连接,下面是我所做的工作:

  1. B ping 通 D(10.8.1.1): 成功
  2. D ping B(10.0.10.100):失败
  3. D ping 通 B(10.0.51.100):OK
  4. B ping C 10.0.51.101/10.8.1.2:正常
  5. C ping B(10.0.10.100/10.0.51.100): 成功

似乎在执行跟踪路由时,通过 10.8.1.2 的路由 10.0.10./24 被忽略。我该如何设置才能使子网 10.0.51.0/24 上的主机 D 链接到 10.0.10.0/24?

答案1

OpenVPN 的接口仅为第 3 层 - 它们不使用任何类似 MAC 地址的东西,并且通过它们发送的数据包没有第 2 层标头。

这意味着内核实际上无法选择在通过 tun 接口发送数据包时使用哪个网关,并且所有路由都via 10.8.1.x只是像dev tun0路由一样运行。

为了解决这个问题,VPN 服务器软件本身(即tun接口的接收端)需要有自己的内部路由表将目标地址映射到客户端,在OpenVPN中这被称为“iroute”。

  1. 您需要在服务器 D 上使用client-config-dir才能指定每个客户端的配置(因为 OpenVPN 决定使 iroutes 基于客户端,而无法指定网关 IP)。

  2. 在服务器针对主机 C 的每个客户端配置文件中,添加选项iroute 10.0.10.0 255.255.255.0iroute 10.0.51.0 255.255.255.0

这同样适用于所有第 3 层 VPN。(例如,WireGuard 用于AllowedIPs=将目的地路由到同一接口上的不同客户端。)

相关内容