当您想使用代理时,您需要在客户端应用程序上设置代理服务器的套接字地址,以便它连接到服务器并传输数据。但是当使用 VPN 客户端时,它会自动通过隧道传输所有数据,而无需为每个应用程序设置服务器地址。
我想知道 VPN 如何做到这一点?如何通过隧道传输所有网络流量?是否可以使用我自己定义的协议创建一个简单的 VPN?
谢谢
答案1
这与路由假设您有一个发往 8.8.8.8 的数据包,而您的以太网地址是 192.168.1.1。如果您想联系 192.168.1.25,那就没问题了,它与您在同一个网络中(可能),并且您有它的物理地址,但 8.8.8.8 不是本地的。您怎么做?您将数据包发送到您的本地网关,相信它就会知道该做什么(然后它会将数据包发送到适当的网关)。
假设你有二网卡。您需要发送相同的数据包,通过哪个接口发送?路由表指定了从哪个接口可以访问哪些网络,其中一个这样的“网络”是默认网络,“其他地方”,0.0.0.0/0。
VPN 客户端只需取消注册旧的默认路由,然后将其重写为“所有到 0.0.0.0/0 的流量都必须通过新建的 VPN0 接口路由”。
然后,到您本地网络的流量仍然会超出 VPN 的范围,但现在“其他所有内容”都被委托给 VPN0,VPN0 会对其进行加密并将其发送到 VPN 服务器(通过老的界面)。
构建您自己的 VPN 系统
简而言之,复杂的通过上面的机制,很明显你需要:
- 网络接口驱动程序。您需要将自己作为具有特定功能和能力的网络接口卡呈现给系统。此驱动程序将接受来自系统的数据包。
- 加密模块,它将接收这些数据包并对其进行加密。这是最简单的部分,因为你只需要使用一个已建立的加密库(自己加密的黄金法则是“不要“)。
- 网络客户端模块,将以某种方式连接到 VPN 服务器,并处理连接(重新连接、错误、验证,从加密模块交换加密信息)
- 网络服务器模块,客户端的双重模块。
坦白说,我不知道该怎么做的是第一部分。但你可以找到源代码示例并从那里开始。事实上,要“打造自己的 VPN”,您可能只需要修改客户端/服务器部分,也许还需要修改加密模块以选择算法或调整功能。
如果你想使用 VPN 单一协议或端口,很遗憾你不能- 不在您的 VPN 软件中。请记住,这被视为网卡。您无法获得仅路由 TCP 的卡,因为该卡什么都不知道关于协议 - 它在 ISO/OSI 堆栈中处于较低位置。因此,您需要指示系统仅通过接口路由某些协议、地址和/或端口。在 Linux 中,您可以使用例如基于策略的路由,为您感兴趣的数据包添加标记,然后将这些数据包(单独)发送到 VPN 接口。