我有以下 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连接,下面是我所做的工作:
- B ping 通 D(10.8.1.1): 成功
- D ping B(10.0.10.100):失败
- D ping 通 B(10.0.51.100):OK
- B ping C 10.0.51.101/10.8.1.2:正常
- 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”。
您需要在服务器 D 上使用
client-config-dir
才能指定每个客户端的配置(因为 OpenVPN 决定使 iroutes 基于客户端,而无法指定网关 IP)。在服务器针对主机 C 的每个客户端配置文件中,添加选项
iroute 10.0.10.0 255.255.255.0
和iroute 10.0.51.0 255.255.255.0
。
这同样适用于所有第 3 层 VPN。(例如,WireGuard 用于AllowedIPs=
将目的地路由到同一接口上的不同客户端。)