gpt4 book ai didi

linux - 通过 TCP 连接创建 VPN

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:13 24 4
gpt4 key购买 nike

我需要通过 TCP 连接创建一个虚拟 IP 网络。宿主系统是Linux,有TUN/TAP内核驱动,很容易接收和重新注入(inject)虚拟网络的IP数据包。

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

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

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

对于我的问题还有其他更简单的解决方案吗?还是我只是走错了方向?我洗耳恭听。

====更新====

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

最佳答案

首先,您不想通过 TCP 创建 VPN,因为您最终会使用 tcp-over-tcp。主要问题是您的内部 TCP 和外部 TCP 的计时器可能有很大差异,这会对您的 TCP session 可靠性产生负面影响。你可以找到更长一点的解释 here .

UDP protocol doesn't support retransmission/reordering, just like IP. So, if one UDP packet is sent for every received virtual IP packet, the kernel TCP/IP protocol stack would still see virtual IP packet loss/duplication/reordering(those are required for TCP/IP to work well, if those "features" are missing, the TCP connection speed on the virtual network would suffer). If IP packets are transmitted over TCP all required "features" will be missing, unless they are simulated some how.

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

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

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

关于linux - 通过 TCP 连接创建 VPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27836843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com