首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过TCP连接创建VPN

问通过TCP连接创建VPN
EN

Stack Overflow用户
提问于 2015-01-08 09:33:27
回答 1查看 3.1K关注 0票数 1

我需要在TCP连接上创建一个虚拟IP网络。主机系统采用Linux,采用TUN/TAP内核驱动程序,很容易接收和重新注入虚拟网络的IP数据包。

困难的部分是将接收到的IP分组传送到另一个主机。由于一些非技术原因,我只能通过TCP协议传输数据包,而不能通过UDP传输.在UDP上传输IP数据包很容易,但是对于TCP来说,它变得很棘手,原因如下:

UDP协议不支持重传/重排序,就像IP一样。因此,如果为每个接收到的虚拟IP数据包发送一个UDP数据包,则内核TCP/IP协议栈仍然会看到虚拟IP数据包丢失/重复/重新排序(这些是TCP/IP正常工作所必需的,如果缺少这些“功能”,则虚拟网络上的TCP连接速度将受到影响)。如果IP数据包是通过TCP传输的,那么所有所需的“功能”都将丢失,除非它们被模拟为某种方式。

似乎我必须在TCP连接上伪造某种数据包复制/丢失/重新排序,或者修补内核TCP/IP协议栈。这两种选择都不容易。

对我的问题还有其他更简单的解决办法吗?还是我走错了方向?我在认真地听呢。

====更新====

我正在考虑使用原始IP套接字(它可以轻松地消除物理网络上所有TCP重传/重新排序的内容,同时仍然使用TCP数据包)来传输接收到的虚拟网络IP数据包。但是在接收主机上,如何只接收我感兴趣的数据包并将所有其他IP数据包返回到内核TCP/IP堆栈?

EN

回答 1

Stack Overflow用户

发布于 2015-01-13 11:14:19

首先,您不希望在TCP上建立VPN,因为最终您将使用tcp之上的tcp。主要问题是您的内部TCP和外部TCP的计时器可能会有很大的不同,这会对TCP会话的可靠性产生负面影响。您可以找到更长的解释这里。

UDP协议不支持重传/重排序,就像IP一样。因此,如果为每个接收到的虚拟IP数据包发送一个UDP数据包,则内核TCP/IP协议栈仍然会看到虚拟IP数据包丢失/重复/重新排序(这些是TCP/IP正常工作所必需的,如果缺少这些“功能”,则虚拟网络上的TCP连接速度将受到影响)。如果IP数据包是通过TCP传输的,那么所有所需的“功能”都将丢失,除非它们被模拟为某种方式。

这是没有意义的,如果您的外层使用TCP作为传输机制,没有什么可以阻止您的内部层仍然使用完整的ip/tcp堆栈,包括这些特性。它们可能会像我说的那样严重冲突,但这并不是说这个功能消失或完全崩溃。

似乎您实际上想要使用tcp只是为了拥有头而忽略实际的协议,这确实可以避免TCP通过tcp带来的问题。然而,这又是一个非常糟糕的想法。防火墙、NAT、DPI、tcp增强器的流处理变得越来越普遍,如果您伪造TCP数据包,您可能会增加这些框的压力,可能会再次分离您自己的连接。

因此,您应该问问自己,为什么不能使用UDP,如果没有其他协议(报头)是可以的,比如GRE或L2TP。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27836843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档