我最近在我的家庭网络上设置了一个 OpenVPN 服务器,它允许我从家庭网络外部通过隧道进入我的家庭网络。
当我使用手机的蜂窝网络并打开 OpenVPN 客户端接入我家的网络时,一切都按预期工作。
例如,192.168.0.1
将我引导至我家的网络路由器。我可以使用本地 IP 地址等通过 SSH 连接到我家的所有设备。据我所知,我作为客户端连接到我的家庭网络,这是预期的行为。
然而,当我在朋友家,打开笔记本电脑上的 OpenVPN 客户端,使用家里的 Wifi 访问我的家庭网络时,遇到了问题。
例如,192.168.0.1
将我定向到我朋友的路由器。我无法使用本地 IP 通过 SSH 连接到我家的任何本地设备。就好像我根本没有连接到我的家庭网络一样。但是,当我检查“我的 IP 是什么”时,它正确显示了我家庭网络的公共 IP,确认我确实连接到了我的家庭网络。
有人能解释一下发生了什么以及如何解决这个问题吗?
需要说明的是,我在手机 (iOS) 和笔记本电脑 (MacOS) 上使用最新的官方 OpenVPN 客户端。我在两台设备上使用完全相同的 OpenVPN 配置文件。OpenVPN Access Server 是 2.4.7 版本,运行在 Ubuntu 20.10 服务器上。
答案1
正如我们所讨论的,问题是当您在朋友家时,您的本地网络(朋友)和远程网络(您家里的 LAN)使用相同的 IP 网络(192.168.0.0/24)。
VPN隧道并不是魔术。从最基本的角度看,它们由包含加密有效负载的数据包组成,该有效负载是通过“隧道”传输的数据包。如果从多个层次来看,“隧道”一词可能会有点误导。从高级(逻辑)角度来看,它是一个“隧道”,你只需将数据包放入其中,它们就会从另一端出来。但是,当你查看较低层时,VPN 电路只是数据包中的数据包,它们在物理网络上移动。
我在这里要强调的是,VPN 隧道仍然需要您的终端连接的底层本地网络。它必须有一个 LAN IP,并且知道默认网关用来访问其他网络。这是一个常见的混淆,因为 VPN 产品营销是为了保护咖啡店里的手机和笔记本电脑用户。他们将连接描述为一个虫洞,您可以将流量转储到与咖啡店网络分开的虫洞中,但事实是加密可以保证您的安全,而不是某种程度上与 LAN 的分离。您的数据包仍在穿越 LAN,并从商店的路由器进入其 ISP 网络。
有很多种VPN(包括许多我认为不符合定义的),但我们谈论的是OpenVPN,一种使用虚拟网络适配器的相当传统的类型。
系统使用一种称为路由表,它告诉系统如何到达其他网络。所有能够上网的机器都有一个默认网关,这是一条指向目的地 0.0.0.0(即所有未指定的网络)的特殊路由。这样,您的系统就不需要专门到 google.com 网络的路由,它只需要知道将所有没有更具体路径的流量发送到哪里。路由由目的地和掩码、网关(本地网络上路由器上能够到达远程目的地的 IP)、流量到达该网关应退出的网卡以及通常某种加权指标组成,当有多个到目的地的路由时,该指标可以帮助一条路由胜过另一条路由。
当 VPN 适配器激活并连接时,系统的默认网关路由将更改为将流量从 VPN 虚拟适配器(对于 OpenVPN 通常称为 tun0)发送出去。这会导致所有到未知网络的流量都通过隧道。
虚拟适配器仍然依赖于物理适配器及其路由,因此它可以将组成隧道的流量发送到 LAN 网关并发送到互联网。
就您而言,您有一个默认网关路由到 0.0.0.0,该路由通过 tun0 退出,但您还有一个路由到 192.168.0.0/24,该路由通过物理适配器退出。由于 192.168.0.0/24 中有一个更“具体”的目的地路由,您希望发送到家庭 LAN 的流量实际上并没有被路由到隧道中,而是被路由到您的物理适配器上,进入您朋友的 LAN。
如果您将网络更改为不同的、不太常见的网络,那么发往家庭 LAN 的流量将进入隧道,并按预期从另一端出来(除非您恰好在使用相同寻址布局的罕见网络上)。避免使用(192.168 中的)网络。
- .0.0
- .1.0
- .254.0
因为这些是您在家庭/SOHO 网络实施中能发现的最常见的地址。
如果我不指出这一点,那我就太疏忽了。VPN 的主要目的是将两个网络连接在一起。您所描述的是客户端到网络的场景,其中单个远程设备连接到远程网络。这一直是我们讨论的重点。但是,VPN 的另一个常见用途是将多个物理上不相邻的网络连接在一起。这是网络到网络的场景。例如,您可以将您的网络连接到您的朋友,从您的路由器连接到他们的路由器,或者您可以在网络内部安装某种 VPN 端点服务器,并使用它将往返于其他网络的流量路由到 LAN。在网络到网络场景中,很明显所有涉及的网络在它们之间都有一个唯一的地址空间。