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

以您连接到VPN的示例为例。您向一个网站发出请求,然后该网站进入网络堆栈,到达第3层。

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

唯一的事情我可以想到的是,在第3层(IP层),标头的目标地址更改为VPS的ip地址,然后将原始目标地址附加到数据包的有效负载上了吗?

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

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

似乎会有很高的延迟时间?

也许我缺少一些技术方面的知识这行得通,其他人可以解释一下吗?

#1 楼

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

如您所见,原始数据包被封装到另一个IP数据包中。
假设有两个网络/路由器(A和B,一个路由器可以是一个VPS )通过VPN(站点到站点)彼此连接。
如果网络A上的主机要访问网络B上的FTP服务器,则网络A上的主机将发送一个数据包,其中目标地址是FTP服务器的IP地址,源地址是它自己的IP地址。
然后原始数据包到达VPN-Gateway(可能是他的路由器),VPN-Gateway将原始数据包封装为例如IPv4 -packet,目标地址是VPN网关(网络B),源地址是它自己的地址。这样,数据包可以通过Internet传输到另一个VPN网关(网络B)。在这里,原始协议/报头或数据包类型无关紧要,因为它将与IPv4报头封装在一起以通过Internet传输,其他路由器也不会在意原始协议/报头,因为它们只会看到“新”字样IPv4标头。
必须为“新”数据包计算一个新的校验和,该校验和将被附加,否则它将无法通过Internet传输(例如PPP有时用于Internet上的点之间,用于计算校验和)。因此,整个数据包中必须有两个校验和。
使用IPsec(几乎始终用于VPN连接)时,原始数据包被加密(主要通过AES)和纯文本标头(“新”标头)以通过互联网旅行)被添加。它必须是纯文本,以便可以正确路由。为此,还必须计算一个新的校验和(因为原始校验和已加密)。
当它到达另一个VPN网关(网络B)时,将VPN-Header拆开并将原始数据包发送到网络(到FTP服务器)。

评论


因此,您是说路由器负责封装数据包,而不是设备?

– cg14
18年6月15日在17:38

@ cg14好问题! VPN有两种类型,分别是站点到站点VPN(从VPN网关到VPN网关(主要是路由器到路由器))和端到端VPN(终端设备通过VPN连接到VPN网关)。使用站点到站点,路由器负责封装数据包。通过端到端,设备本身会创建“原始数据包”,该原始数据包将由安装在其上的VPN客户端进行封装。封装后,设备将发送该数据包。

– watchme
18 Jun 15'在17:40



那很有意思。对于端到端VPN,原始数据包封装在哪一层?从理论上讲,如果我想说,要在ip之外传输一些标识符,例如VPN客户端的设备ID,那么有一种方法可以将该信息附加到有效负载上,从而使有效负载可以是|。 IP标头| GRE标头|注入的信息+原始数据包|。并且,根据将自定义数据注入封装数据包的位置,将确定您是否需要重新计算我假设的gre数据包的校验和和长度。

– cg14
18 Jun 15'在17:54



不知道你到底是什么意思。但是,我将稍微解释一下IPsec来回答您的“在哪一层”问题。当客户端发送原始数据包(例如TCP,IP,以太网)时,它将被完全加密。这是新的“有效负载”。那么,您可以通过互联网发送正常的有效载荷吗?可能不会。您将需要一些信息。然后,此信息由VPN客户端添加-因此第4、3和2层信息!

– watchme
18 Jun 15'在18:02



@ cg14一切对您都清楚吗? :) ...(哦,我刚刚意识到我没有在回答“在哪一层”的问题中给您打上标记,对不起)

– watchme
18年6月15日在18:27



#2 楼

因此,对您的问题的简短回答是封装。意味着在要发送到网站的数据包周围放置了另一组数据包标头,该数据包标头由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服务器返回给您。

第三个问题。由于您实际上是在外面放置一个额外的数据包,因此长度和校验和是根据结果数据包计算的。是的,有两个长度和两个校验和。至于说使用此MTU的VPS完成的最大长度,还是像通常一样通过MTU发现来完成的最大长度。

关于延迟。你不能打破物理学。您将考虑进入VPS并通过其网络堆栈运行的开销。尽管似乎会有很高的延迟,但有时情况并非如此。如果您的VPS在拓扑上与数据包已经到达的位置一致,则可能会增加最少的开销。例如,如果您在西雅图,而VPS在纽约,而您尝试与之交谈的网站在伦敦。但是,如果您要从西雅图回到纽约,再回到西雅图的网站,那么整个美国旅行都会有更多的延迟。

#3 楼

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

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

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

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

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

当回复返回时,也会发生相同的过程。数据包进入,NAT过程被逆转,它通过虚拟接口传递回VPN软件,被封装并发送回客户端上的VPN软件,后者对该数据包进行解封装并将其传递回网络堆栈,以便它可以依赖于客户端应用程序。

评论


好的,那可能是比我更好的解释!

– watchme
18年6月15日在18:29