在这里找到:https://forums.openvpn.net/viewtopic.php?t=9465
作者有 4 种方法,2 和 3 解决了我的用例,我把第 4 种省略了,因为它很长。
站点 A
本地网络为 192.168.0.0/255.255.255.0。
默认网关的 IP 为 192.168.0.1(通用配置)。
运行 OpenVPN 的主机的 IP 是 192.168.0.A,其中 A 可以是 2 到 254 之间的任何一个。
主机的 IP 为 192.168.0.x,其中 x 为 2 到 254,与 A(OpenVPN 主机的 IP)不同。
网站 B
本地网络为 192.168.1.0/255.255.255.0。
默认网关的 IP 为 192.168.1.1(通用配置)。
运行 OpenVPN 的主机的 IP 是 192.168.1.B,其中 B 可以是 2 到 254 之间的任何一个。
这些主机的 IP 地址为 192.168.1.x,其中 x 为 2 到 254,与 B(OpenVPN 主机的 IP)不同。
VPN IP 来自 10.8.0.0/255.255.255.0。
在讨论这个问题时,哪个站点是服务器或客户端,以及哪些 IP 获得 TAP 接口并不重要。要解决此路由问题,有 4 种方法:
方法一
很明显,将 OpenVPN 软件移至 LAN 的默认网关。由于在某些情况下这是不可能的(一个无法运行 OpenVPN 的简单路由器),这种方法是未来扩展的最佳选择,因为添加更多远程站点不会涉及返回路由问题。
方法二
将远程网络的静态路由添加到每个主机的路由表中。在每个主机上,我们必须添加这样的路由:
代码:全选
路由添加掩码gw
例如,在站点 A 的每台主机上,我们必须添加两条路由:
代码:全选
路由添加 192.168.1.0 掩码 255.255.255.0 gw 192.168.0.A
路由添加 10.8.0.0 掩码 255.255.255.0 gw 192.168.0.A
VPN网络10.8.0.0的路由可以省略,但不推荐。
与我们在站点 B 上添加路由的方式相同,以显示主机将数据包路由到远程站点的位置:
代码:全选
路由添加 192.168.0.0 掩码 255.255.255.0 gw 192.168.1.B
路由添加 10.8.0.0 掩码 255.255.255.0 gw 192.168.1.B
如果会有第三个站点,我们必须以同样的方式为新的远程网络添加另一个路由。
路由也必须添加到默认 LAN 的网关上。尽管如此,似乎许多路由器都能够在不为远程网络添加路由器的情况下返回响应。
方法三
此方法意味着仅在 LAN 的默认网关上添加与方法 2 中相同的路由。所以重定向将由路由器进行,我们不需要在每个主机上添加路由。当然,如果路由器允许修改路由表和 iptable,这是可能的。
与方法 2 一样,在默认路由器上,我们添加到远程站点的路由:
代码:全选
路由添加掩码gw
例如,在 IP 为 192.168.0.1 的站点 A 的默认网关上,我们必须添加两条路由:
代码:全选
路由添加 192.168.1.0 掩码 255.255.255.0 gw 192.168.0.A
路由添加 10.8.0.0 掩码 255.255.255.0 gw 192.168.0.A
但这只会显示网关将来自其自身的数据包发送到何处。我们还需要展示如何从本地主机为远程站点路由数据包。为此,我们必须向路由器 iptable 添加一条规则,该规则将告诉所有从 LAN 接口传入并具有远程站点网络目标的数据包必须重定向到 OpenVPN 主机。大多数处理更广泛定制的路由器都能够使用命令“iptables”之类的 unix。所以,我们像这样使用 iptables 规则:
代码:全选
iptables -A PREROUTING -t mangle -i -d / -j ROUTE --gw
例如,在站点 A 的默认路由器上,我们将添加:
代码:全选
iptables -A PREROUTING -t mangle -i -d 192.168.1.0/255.255.255.0 -j ROUTE --gw 192.168.0.A
iptables -A PREROUTING -t mangle -i -d 10.8.0.0/255.255.255.0 -j ROUTE --gw 192.168.0.A
与我们在站点 B 的默认路由器上添加规则的方式相同。
如果我们添加第三个站点,那么我们必须以相同的方式向其他站点添加到第三个站点网络的路由。