VPN 服务器如何处理从 VPN 客户端接收的数据包?

VPN 服务器如何处理从 VPN 客户端接收的数据包?

首先,我对网络的了解非常有限,所以如果我使用了错误的术语,我提前道歉。

情况

我正在尝试创建一个原型,使客户端能够与不同网络上的本地 Web 服务器进行通信。Web 服务器与 VPN 服务器托管在同一个网络上。到目前为止,我能够将客户端数据包(例如:SYN)路由到虚拟接口(tun)并将整个数据包发送到 VPN 服务器。在服务器端,我接收这些数据包,更改源 IP 和目标 IP,并重新计算标头内的校验和。

重申一下,流程如下:

  1. 用户尝试使用某个 IP 地址访问 Web 服务器。
  2. SYN 数据包被发送到虚拟接口,因为它与路由表中的路由匹配。
  3. VPN 客户端应用程序通过已建立的 websocket 连接将 SYN 数据包发送到 VPN 服务器(无论这是什么类型的连接)
  4. VPN 服务器接收数据包并修改源/目标 IP 地址以指向同一网络上托管的实际 Web 服务器。
  5. 我如何将这些数据包发送到 Web 服务器并接收来自 Web 服务器的响应?我希望客户端通过 VPN 服务器/已建立的 Web 套接字连接与 Web 服务器通信。我有哪些选择?

问题

我如何将这些数据包发送到 Web 服务器,并从 Web 服务器接收数据包并发送回客户端?我是否将数据包“注入”到正确的接口并确保我的应用程序将响应发送回客户端?我希望客户端通过 VPN 服务器/已建立的 Web 套接字连接与 Web 服务器通信。我有哪些选择?一般来说,当前的 VPN 服务器如何做到这一点?

我尝试过

我在服务器端尝试做的是创建一个虚拟接口 (tun),并将从客户端收到的数据包写入接口。但是,这些数据包不会发送到 Web 服务器。客户端和服务器正在 macOS 上运行,使用网络扩展(如果有用的话)。Web 服务器正在 上运行,我在写入接口之前192.168.1.95将数据包的源 IP 修改为。100.64.0.77tun

Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.1.254      UGSc           en0       
default            link#10            UCSI         utun2       
100.64.0.77        100.64.0.77        UH           utun2       
127                127.0.0.1          UCS            lo0       
127.0.0.1          127.0.0.1          UH             lo0       
169.254            link#7             UCS            en0      !
192.168.1          link#7             UCS            en0      !
192.168.1          link#10            UCSI         utun2       
192.168.1.92/32    link#7             UCS            en0      !
192.168.1.99       8c:a9:82:2e:d6:2e  UHLWI          en0    986
192.168.1.254/32   link#7             UCS            en0      !
192.168.1.254      70:f1:96:86:e6:a0  UHLWIir        en0   1196
224.0.0/4          link#7             UmCS           en0      !
224.0.0/4          link#10            UmCSI        utun2       
224.0.0.251        1:0:5e:0:0:fb      UHmLWI         en0       
255.255.255.255/32 link#7             UCS            en0      !
255.255.255.255/32 link#10            UCSI         utun2   

`

答案1

VPN 服务器接收数据包并修改源/目标 IP 地址以指向同一网络上托管的实际 Web 服务器。

这根本不需要,因为客户端已经指定了他们想要的目标 IP 地址。(VPN封装将原始数据包放入另一个 IP 数据包中,而不会改变原始 IP 头,因此服务器只需要再次解封装它并按原样转发原始数据包即可。

NAT 可以实现(有时也会实现),但更多时候是操作系统防火墙的工作和系统管理员的决定——它不应该由 VPN 软件独自完成。一般来说,内部网络内的通信不应该需要NAT;使用它通常表明您的网络的基本路由设置不正确。

我如何将这些数据包发送到 Web 服务器并接收来自 Web 服务器的响应?我希望客户端通过 VPN 服务器/已建立的 Web 套接字连接与 Web 服务器通信。我有哪些选择?

通常,VPN 服务器将具有与 VPN 客户端完全相同的虚拟接口,并使用完全相同的机制来生成和接收数据包。(有些服务器将为每个客户端创建专用的虚拟接口,而有些服务器将为所有客户端提供单个接口。)如果您的客户端正在使用接口tun,则您的服务器也可以这样做。

相关内容