首先,我对网络的了解非常有限,所以如果我使用了错误的术语,我提前道歉。
情况
我正在尝试创建一个原型,使客户端能够与不同网络上的本地 Web 服务器进行通信。Web 服务器与 VPN 服务器托管在同一个网络上。到目前为止,我能够将客户端数据包(例如:SYN)路由到虚拟接口(tun)并将整个数据包发送到 VPN 服务器。在服务器端,我接收这些数据包,更改源 IP 和目标 IP,并重新计算标头内的校验和。
重申一下,流程如下:
- 用户尝试使用某个 IP 地址访问 Web 服务器。
- SYN 数据包被发送到虚拟接口,因为它与路由表中的路由匹配。
- VPN 客户端应用程序通过已建立的 websocket 连接将 SYN 数据包发送到 VPN 服务器(无论这是什么类型的连接)
- VPN 服务器接收数据包并修改源/目标 IP 地址以指向同一网络上托管的实际 Web 服务器。
- 我如何将这些数据包发送到 Web 服务器并接收来自 Web 服务器的响应?我希望客户端通过 VPN 服务器/已建立的 Web 套接字连接与 Web 服务器通信。我有哪些选择?
问题
我如何将这些数据包发送到 Web 服务器,并从 Web 服务器接收数据包并发送回客户端?我是否将数据包“注入”到正确的接口并确保我的应用程序将响应发送回客户端?我希望客户端通过 VPN 服务器/已建立的 Web 套接字连接与 Web 服务器通信。我有哪些选择?一般来说,当前的 VPN 服务器如何做到这一点?
我尝试过
我在服务器端尝试做的是创建一个虚拟接口 (tun),并将从客户端收到的数据包写入接口。但是,这些数据包不会发送到 Web 服务器。客户端和服务器正在 macOS 上运行,使用网络扩展(如果有用的话)。Web 服务器正在 上运行,我在写入接口之前192.168.1.95
将数据包的源 IP 修改为。100.64.0.77
tun
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
,则您的服务器也可以这样做。