这是一个典型问题关于解决 VPN 客户端本地网络与通过 VPN 链路的网络之间的 IPv4 子网冲突。
通过 OpenVPN 连接到远程位置后,客户端会尝试访问位于子网(例如 192.0.2.0/24)上的网络服务器。但是,有时客户端 LAN 上的网络具有相同的子网地址:192.0.2.0/24。由于这种冲突,客户端无法通过输入其 IP 连接到远程服务器。它们甚至无法在连接到 VPN 时访问公共互联网。
问题是这个子网192.0.2.0/24需要通过VPN进行路由,但是也需要作为客户端的LAN进行路由。
有人知道如何缓解这个问题吗?我可以访问 OpenVPN 服务器。
答案1
可以使用 NAT 来解决这个问题;但是它不太优雅。
因此,假设您无法通过拥有内部网络(这些内部网络具有非常不常见的网络号以至于实际上永远不会发生冲突)来解决这个问题,那么原则如下:
由于本地子网和远程子网具有相同的网络号,来自客户端的流量永远不会意识到它必须通过隧道网关才能到达目的地。即使我们想象它可以,当远程主机即将发送答案时,情况也是如此。
所以请继续听我说,并假装到目前为止还没有任何副作用,正如我所写的,为了实现完全连接,您需要在隧道内对两端进行 NAT,以区分主机并允许路由。
在这里制作一些网:
- 您的办公室网络使用 192.0.2.0/24
- 您的远程办公室使用 192.0.2.0/24
- 您的办公室网络 VPN 网关将 192.0.2.0/24 主机隐藏在 NAT 网络号 198.51.100.0/24 后面
- 您的远程办公网络 VPN 网关将 192.0.2.0/24 主机隐藏在 NAT 网络号 203.0.113.0/24 后面
因此,在 VPN 隧道内,办公室主机现在是 198.51.100.x,远程办公室主机是 203.0.113.x。让我们进一步假设所有主机在其各自 VPN 网关的 NAT 中都进行了 1:1 映射。示例:
- 您的办公室网络主机 192.0.2.5/24 在办公室 vpn 网关 NAT 中静态映射为 198.51.100.5/24
- 您的远程办公室网络主机 192.0.2.5/24 在远程办公室 vpn 网关 NAT 中静态映射为 203.0.113.5/24
因此,当远程办公室中的主机 192.0.2.5/24 想要连接到办公室网络中具有相同 IP 的主机时,它需要使用地址 198.51.100.5/24 作为目的地。发生以下情况:
- 在远程办公室,主机 198.51.100.5 是通过 VPN 到达并路由到那里的远程目的地。
- 在远程办公室,当数据包通过 NAT 功能时,主机 192.0.2.5 被伪装成 203.0.113.5。
- 在办公室,当数据包通过 NAT 功能时,主机 198.51.100.5 被转换为 192.0.2.5。
- 在办公室,返回主机 203.0.113.5 的流量以相反方向经历相同的过程。
因此,虽然有一个解决方案,但为了在实践中发挥作用,必须解决许多问题:
- 远程连接必须使用伪装 IP;DNS 变得复杂。这是因为从连接主机的角度来看,端点必须具有唯一的 IP 地址。
- 作为 VPN 解决方案的一部分,必须在两端实现 NAT 功能。
- 静态映射主机对于从另一端实现可达性来说是必须的。
- 如果流量是单向的,则只有接收端需要对所有涉及的主机进行静态映射;如果需要,客户端可以进行动态 NAT。
- 如果流量是双向的,则两端都需要对所有涉及的主机进行静态映射。
- 无论是分离式 VPN 还是非分离式 VPN,互联网连接都不能受到影响。
- 如果不能进行一对一映射,情况就会变得混乱;仔细记账是必要的。
- 当然,使用重复的 NAT 地址也会带来风险 :-)
因此,解决这个问题需要精心设计。如果你的远程办公室真的由经常出差的人组成,那么你就会面临更多问题:
- 他们永远无法预先知道何时会到达重叠的网络 ID。
- 他们的笔记本电脑上需要实现远程办公室网关 NAT。
- 办公室网关需要两个 VPN,一个无 NAT,一个有 NAT,才能覆盖这两种情况。否则,如果有人选择你为 NAT 方法选择的子网之一,事情就不会起作用。
根据您的 VPN 客户端,您可能能够根据本地段的网络地址自动选择一个 VPN 或另一个 VPN。
请注意,本文中提到的所有 NAT 都表示 NAT 功能,可以说该功能发生在隧道视角内。从过程上讲,静态 NAT 映射必须在数据包“进入”隧道之前完成,即在数据包被封装到传输数据包中之前完成,传输数据包将通过互联网将其传送到另一个 VPN 网关。
这意味着,一定不要混淆 VPN 网关的公共 IP 地址(实际上也可能经过 NAT,但完全无法通过 VPN 传输到远程站点)与用作重复私有地址伪装的唯一私有地址。如果这种抽象难以想象,下面将说明如何为此目的将 NAT 与 VPN 网关物理分离:
在重叠网络中使用 NAT。
将同一幅图压缩为一台机器内的逻辑分离,能够执行 NAT 和 VPN 网关功能,这只是将同一示例更进一步,但确实更加强调了手头软件的功能。将其与例如 OpenVPN 和 iptables 结合起来并在此处发布解决方案将是一个值得的挑战。
从软件角度来说,这当然是可能的:
PIX/ASA 7.x 及更高版本:具有重叠网络的 LAN 到 LAN IPsec VPN 配置示例
和:
在具有重复 LAN 子网的路由器之间配置 IPSec 隧道
因此,实际实施取决于很多因素,其中涉及的操作系统、相关软件及其可能性也很重要。但这肯定是可行的。您需要思考和试验一下。
正如链接所示,我从思科那里了解到了这一点。
答案2
如果您需要对单个或少数已知服务器 IP 采取临时的解决方法,最简单的解决方案应该是静态客户端路由选项。
就我而言,我通过以下方式将所需的目标服务器(192.168.1.100)添加到我的 Linux 客户端上的路由表中:
route add 192.168.1.100 dev tun0
之后,使用route delete命令删除该静态路由。
答案3
Aydin K. 的答案适用于 Linux。如果您希望 Windows 也能使用相同的功能,您可以输入
route ADD 192.168.1.10 <IP of tunnel adapter>
或者
route ADD 192.168.1.10 IF <interface id>
您可以使用以下命令获取接口 ID:
route print
答案4
我在运行 El Capitan 的 Mac 上。虽然上述建议对我来说不起作用,但它们让我找到了一个可行的解决方案:
- 在启动VPN之前,执行
ifconfig
启动 VPN,然后执行
ifconfig
并注意哪个是新界面。在我的情况下是点对点0IP 地址为192.168.42.74ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 inet 192.168.42.74 --> 192.0.2.1 netmask 0xffffff00
输入:
sudo route add 192.168.1.79 192.168.42.74
我首先用 a 进行测试ping
,然后通过访问 git 服务器来证明它可以工作。
当我尝试使用开发ppp0对于上面提到的路线结束命令,它会抱怨。