VPN的网络流量如何转发?(第 3 层)

网络工程 ip 虚拟专用网 包路径
2021-07-11 20:11:42

我正在寻找有关 VPN(虚拟专用网络)如何通过其 VPS(虚拟专用服务器)转发网络流量的信息。

以您连接到 VPN 为例。您向网站发出请求,然后该网站沿着网络堆栈向下到达第 3 层。

我们有一个 IP 数据包 - 它有它的标头,包括它的目标地址和一个有效载荷。

如果将IP数据包的目的地址改为VPS的IP地址,服务器如何将请求转发到原来的目的地址?

我唯一能想到的是,在第3层(IP层),将header的目的地址改为VPS的ip地址,然后将原来的目的地址附加到数据包的payload中?

这是否意味着需要重新计算数据包的长度和数据包的校验和头并再次修改 IP 数据包?

然后 VPS 对数据包进行逆映射,组装并在服务器上发出原始请求。

这似乎会有与之相关的高延迟时间?

也许我错过了它如何工作的一些技术方面,其他人能解释一下吗?

3个回答

以 GRE-Header 为例(GRE 是一种用于实现 VPN 的协议 - 它不经常使用,因为它在任何方面都不安全,但封装的概念在每个 VPN 连接中几乎相同(例如 IPsec 也是如此) ):

在此处输入图片说明

如您所见,原始数据包被封装到另一个 IP 数据包中。

假设有两个网络/路由器(A 和 B,路由器可以是 VPS)通过 VPN(站点到站点)相互连接。

如果网络 A 上的主机要访问网络 B 上的 FTP 服务器,网络 A 中的主机将发送一个数据包,其中目的地址是 FTP 服务器的 IP 地址,源地址是它自己的地址。

然后原始数据包到达 VPN 网关(可能是他的路由器),它将原始数据包封装到例如 IPv4 数据包中,其中目标地址是 VPN 网关(网络 B),源地址是它自己的地址。这样,数据包就可以通过互联网传输到另一个 VPN 网关(网络 B)。在这里,原始协议/标头或数据包类型无关紧要,因为它将用 IPv4 标头封装以通过 Internet 传输,而其他路由器不会关心原始协议/标头,因为它们只会看到“新” IPv4 标头。

必须计算“新”数据包的新校验和并将其附加,否则它将无法通过互联网传播(例如,有时在互联网中的点之间使用 PPP,它计算校验和)。所以整个数据包中肯定有两个校验和。

使用 IPsec(几乎总是用于 VPN 连接),原始数据包被加密(主要通过 AES)并添加纯文本标头(通过互联网传输的“新”标头)。它必须是明文,以便可以正确路由。为此,还必须计算新的校验和(因为原始校验和已加密)。

当它到达另一个 VPN 网关(网络 B)时,VPN 报头被拆开,原始数据包被发送到网络(到 FTP 服务器)。

所以你的问题的简短答案是封装。这意味着在您发送到 VPN 端点删除的网站的数据包周围还有另一组数据包标头。

可以这样想:

-----------------------------------------------
| src_ip=2.2.2.2, dest_ip=3.3.3.3             |
|---------------------------------------------|
|| src_ip=10.10.10.10, dest_ip=5.5.5.5       ||
|| Data goes here. This could be a HTTP GET  ||
|| or pretty much anything.                  ||
|---------------------------------------------|
-----------------------------------------------

您在本地机器上运行的 VPN 客户端将为您提供一个新的 IP 地址 (10.10.10.10) 并更改您的路由表,以便默认路由沿着创建的隧道前进。然后它将流量发送到 VPN 服务器或在您的示例中发送到 VPS (3.3.3.3)。通常,您的数据包在解封装时会应用 NAT,因此到您的目标服务器 (5.5.5.5) 时,它会显示流量来自封装流量的目标 IP (3.3.3.3) 这就是流量首先通过 VPN 服务器返回给您。

关于你的第三个问题。由于您基本上在长度的外部放置了一个额外的数据包,并且校验和是在生成的数据包上计算的。所以是的,有两个长度和两个校验和。至于最大长度,要么由 VPS 说使用此 MTU 完成,要么像正常一样通过 MTU 发现完成。

至于延迟。你不能打破物理学。您将考虑进入 VPS 并运行其网络堆栈的开销。虽然看起来会有很高的延迟,但有时情况并非如此。如果您的 VPS 在拓扑上与数据包已经到达的位置一致,则可能会增加最小的开销。例如,如果您在西雅图,而您的 VPS 在纽约,而您尝试与之交谈的网站在伦敦。但是,如果您要从西雅图前往纽约返回西雅图的网站,那么穿越美国的旅程会产生额外的延迟。

数据包由传输层创建并向下传递到网络层。主机查看其路由表并将其发送到由 VPN 软件创建的虚拟接口。

VPN 软件从虚拟接口获取数据包。它可能会对其进行加密或添加自己的标头,然后将其作为有效负载传回网络堆栈。根据特定的 VPN 实现,它可以将此有效负载传递到传输层,也可以绕过传输层并直接到达网络层。

然后将另一层网络层标头添加到以 VPN 服务器为目标的数据包中。然后在路由表中再次查找数据包并将其发送到 Internet(如果 VPN 是“全覆盖”的,则 VPN 软件必须注意设置路由表,使 VPN 流量流出真正的面向互联网的界面,而不是回到 VPN 软件)。

当封装的数据包到达 VPN 服务器时,它会被传递回 VPN 软件。“外部”标头被删除,数据包通过虚拟接口传回网络堆栈。

之后,取决于 VPN 服务器上的网络堆栈如何处理它。对于用于 Internet 访问的 VPN,VPN 服务器上的网络堆栈可能会被配置为充当 NAT 路由器,因此它会修改数据包的源并将其发送回 Internet。

当回复回来时,会发生几乎相同的过程。数据包进来,NAT 过程被逆转,它通过虚拟接口传递回 VPN 软件,它被封装并发送回客户端上的 VPN 软件,后者解封装它并将其传递回网络堆栈,因此它可以交付给客户端应用程序。