![VPN 下的相同路由-如何解决?](https://linux22.com/image/640377/VPN%20%E4%B8%8B%E7%9A%84%E7%9B%B8%E5%90%8C%E8%B7%AF%E7%94%B1-%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%EF%BC%9F.png)
我对 VPN(主要是 OpenVPN)只有基本经验,而且大多是理论知识,但现在我想设置一些更复杂的东西,并且正在评估可能遇到的问题。我将尝试通过示例来表示假设情况。我们假设此设置使用 OpenVPN。
我有一台主服务器,它将运行 OpenVPN 客户端,不同的远程位置将有不同的 OpenVPN 服务器。我将同时从主服务器打开到这些远程位置的不同隧道。假设我将同时打开十个不同的隧道。
每个隧道都会为客户端分配一个本地 IP,例如:
10.0.0.2/24(隧道 A)
10.0.1.2/24(隧道 B)
10.0.2.2/24(隧道 C)
...
因此,例如,隧道 A 中的 OpenVPN 服务器将是10.0.0.1/24
。如果我想访问隧道 A 的 LAN 中的某些资源 - 例如,在 上运行的 Apache 172.16.0.50
,我只需在 VPN 客户端的计算机中输入 IP,然后就可以访问 Web 服务器(假设所有路由均正常)。
我主要关心的是同时拥有不同的隧道以及在同一个本地 IP 下运行多个服务。以上面的例子为例:
隧道 A:服务器 10.0.0.1/24,客户端 10.0.0.2/24,阿帕奇 172.16.0.50
隧道 B:服务器 10.0.1.1/24,客户端 10.0.1.2/24,阿帕奇 172.16.0.50
在这个特定的例子中,我们有两个 Apache 实例在不同的网络中运行但共享同一个本地 IP,因此当172.16.0.50
两个隧道处于活动状态时客户端输入时,我猜它会失败。
我不确定我的猜测是否正确,但我敢打赌这不是一个不典型的情况。有人能解释一下在这种情况下需要做什么吗?
编辑:如果我的表达不够清楚,我深感抱歉 - 让我用简单的步骤来简化这个问题:
- 两个 VPN 服务器(VPN1 和 VPN2)和一个 VPN 客户端
- VPN1 和 VPN2 共享相同的 LAN IP 用于其内部服务:172.16.0.0/24
- VPN1 和 VPN2 都在 172.16.0.50 下运行 Apache
- VPN 客户端连接到两个 VPN 服务器 (VPN1 和 VPN2)
- 问题 -> 两者都有相同的 LAN 编号 (172.16.0.0/24),并且 Apache 在完全相同的 IP 下运行
- 问题 -> 除了更改其中一个 VPN 服务器中的 LAN(以及 Apache 的 IP)之外,还有其他方法可以解决这个问题吗?
答案1
不,没有令人信服的、毫无麻烦的方法来做到这一点。
在第 3 层,一旦两个隧道都启动,客户端就完全没有办法区分172.16.0.50-通过-隧道-1从172.16.0.50-通过-隧道-2;IP 根本不支持这种决策(模源路由,这将非常痛苦并且支持不力)。
你可以使用一些卑鄙的黑客手段:你可以在客户端上使用 NAT,在两个相似的网络上覆盖两个不同的 RFC1918 范围,并使用基于策略的路由来使流量
但是随后您将必须重写所有引用重叠范围内的地址(基于它所经过的隧道)的内容。
老实说,重新设置两个目标网络之一的 IP 会更省事。这样做还有一个好处,就是你可以直接连接这两个网络 - 如果单个客户连接这两个网络符合业务需要,那么直接连接它们也只是时间问题。
编辑:在当前设置下,同样的问题会影响这种情况:任何给定地址在重叠范围内,客户端无法知道应该路由到哪个隧道。您可以通过以下方式解决这个问题仅有的172.16.0.50
通过隧道 1 和隧道 2提供到 的路由。172.16.0.51
但是,除非一个 LAN 中的所有相关主机都在 中172.16.0.0/25
,而另一个 LAN 中的所有相关主机都在 中172.16.0.128/25
,否则这种方法的可扩展性不是很好。在这种情况下,重新分配 IP 应该不会比到处更改网络掩码更麻烦。
答案2
如果可以的话,流量默认通过 VPN1 路由,并以 VPN2 作为备份,则将推送的路由在 VPN1 上分成 2 个 /25 范围,在 VPN2 上推送完整的 /24,这样可以解决这个问题。
如果 VPN1 发生故障并且 2 个 /25 路由被删除,它仍然具有 VPN2 的 /24,因此尽管没有负载平衡,您仍将获得高可用性。
因此,在VPN1上你可以执行以下操作:
push "route 172.16.0.0 255.255.255.128"
push "route 172.16.0.128 255.255.255.128"
在 VPN2 上你可以执行以下操作:
push "route 172.16.0.0 255.255.255.0"
由于最“窄”的路线优先,因此客户端会优先选择 VPN1 而不是 VPN2。
您也可以在客户端配置中指定不同的客户端route-metric
,例如在 VPN1 的客户端配置中:
route-metric 200
在 VPN2 中:
route-metric 201