通过TCP连接创建VPN

时间:2015-01-08 09:33:28

标签: linux tcp vpn tun-tap

我需要通过TCP连接创建虚拟IP网络。托管系统是Linux,带有TUN / TAP内核驱动程序,它非常容易接收和使用。重新注入虚拟网络的IP数据包。

困难的部分是将收到的IP数据包传输到另一台主机。出于某些非技术原因,我只能通过TCP协议而不是UDP传输数据包。通过UDP传输IP数据包很容易,但使用TCP它变得棘手,原因如下:

UDP协议不支持重传/重新排序,就像IP一样。因此,如果为每个收到的虚拟IP数据包发送一个UDP数据包,内核TCP / IP协议栈仍会看到虚拟IP数据包丢失/重复/重新排序(这些是TCP / IP运行良好所必需的,如果那些&#34 ;功能"缺失,虚拟网络上的TCP连接速度将受到影响)。如果IP数据包是通过TCP传输的,那么所有需要的功能都是"将失踪,除非他们被模拟一些如何。

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

我的问题还有其他更简单的解决方案吗?还是我只是走向一个完全错误的方向?我全都耳朵。

====更新====

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

1 个答案:

答案 0 :(得分:3)

首先,您不希望通过TCP建立VPN,因为最终会最终使用tcp-over-tcp。主要问题是内部TCP和外部TCP的计时器可能显着不同,这会对TCP会话可靠性产生负面影响。您可以找到更长的解释here

  

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

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

看起来您实际上只想使用TCP来获取标头并忽略实际协议,这确实可以避免tcp over tcp的问题。然而,这又是一个非常糟糕的主意。防火墙,NAT,DPI,tcp助推器的流处理变得越来越普遍,如果你伪造TCP数据包可能会给这些盒子带来压力,可能会再次破坏你自己的连接。

所以你应该问问自己为什么你不能使用UDP,如果没有替代协议(标题)可以,比如GRE或L2TP。