为 NAT 后面的客户端创建 Tcp 连接

Posted

技术标签:

【中文标题】为 NAT 后面的客户端创建 Tcp 连接【英文标题】:Create Tcp connection for clients behind NAT 【发布时间】:2015-11-04 09:55:25 【问题描述】:

针对 Linux、Windows 操作系统的此类任务存在哪些软件库?

在 RFC 中是否存在一些人们应该如何做的信息?

我很感兴趣如何为我的 C++ 项目创建功能,就像在该软件中介绍的那样:https://secure.logmein.com/ru/products/hamachi/download.aspx

【问题讨论】:

从客户端或服务器的角度来看,通过 NAT 的 TCP 连接与没有 NAT 的连接没有什么不同。路由器将是一个重写源 IP。此外,这似乎要求提供软件推荐,这不适合 ***。 嗯,从我的角度来看,“TCP 连接建立”在客户端位于 NAT 之后时会有所不同。他们可能没有自己的公共IP。当 NAT 后面的客户端可能是您需要第三个人进行初始连接时。问题是关于文章、软件库或 rfc,或者关于它的东西......“客户端如何连接它,它们在 NAT 后面” "请求软件库推荐" - 我不知道这样的限制 我现在了解到您想要创建一个到 NAT 后面的系统的 INBOUND tcp 连接。出站 TCP 连接没有任何不同,但如果没有适当的端口转发,则到 NAT 客户端的入站 TCP 连接会很痛苦。 UltraVNC 使用公共 IP 上的“中继器”克服了这一问题,该 IP 将成为“第三人”。由于它是开源的,您可以查看它的代码以重新实现类似的东西 您可以阅读帮助中心的"on topic",了解有关问题限制的更多信息。它针对第 4 点说:要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。 【参考方案1】:

如果你想通过 TURN 中继服务器建立连接,没有太大区别。唯一的区别是 TCP 和 UDP 如何创建连接,仅此而已。

如果要进行 P2P 连接,有一些很大的不同

如果您在同一个网络中(在同一个 NAT 后面): 在 UDP 中,您向您的对等候选人发送一个 stun 绑定请求,然后如果您收到回复,那么您就知道您已连接。在 TCP 中相同,您必须在一侧创建一个活动套接字,在另一侧创建一个被动套接字。然后从主动套接字发送 syn 并从被动套接字接收它,然后将 syn ack 发送到主动套接字。然后active socket发送一个ack,连接就建立了。

如果你在不同的网络(在不同的 NAT 后面):你必须使用 TCP 打孔技术来建立连接。因为如果之前没有数据包发送到 syn 来自的地址,您的 NAT 将不允许 TCP syn 数据包通过。

TCP 打孔详解:

您必须使用 TCP 同时打开的套接字。此套接字在主动和被动模式下都起作用。两端需要知道彼此的私有和公共IP:端口。 TCP 同时打开的情况如下:

    Peer A 不断向 Peer B 发送 SYN Peer B 不断向 Peer A 发送 SYN

    当 NAT-a 接收到来自 Peer A 的传出 SYN 时,它会在其状态机中创建一个映射。 当 NAT-b 接收到来自 Peer B 的传出 SYN 时,它会在其状态机中创建一个映射。

    两个 SYN 都在网络路径的某处交叉,然后:

    来自 Peer A 的 SYN 到达 NAT-b,来自 Peer B 的 SYN 到达 NAT-a 根据这些事件的时间(SYN 在网络中的交叉位置), 至少有一个 NAT 会让传入的 SYN 通过,并将其映射到内部目标对等体

    在收到 SYN 后,对端发回 SYN+ACK 并建立连接。

来自WIKI。

还可以了解从here 读取的 TCP 同时打开连接。要了解 NAT 过滤行为,请参阅answer。

【讨论】:

从技术的角度来看:当我创建 tcp/ip 连接时,我应该知道一对 - “ip address”。然后我可以创建ARP请求来接收mac地址,然后我应该创建TCP套接字,我还需要ip地址来发送SYN ....所以我真的需要ip地址。 更准确地说,假设 NAT 隐藏具有 1 个公共 IP 地址的本地专用网络。并且 NAT 支持正确处理“输入和输出数据包”,但是这种机制在结果连接的上下文中运行....但是监听部分也在 NAT 后面 我只了解一个 - 你需要第三个人与公共 ip 建立初始连接,然后你应该更正 tcp/ip 数据包,这样数据流将没有第三方。是否存在此技术的名称? 附注我对“如果您在不同的网络(在不同的 NAT 之后)”案例很感兴趣 谢谢,我不知道。我认为这样的语义有“上三角”

以上是关于为 NAT 后面的客户端创建 Tcp 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 NAT 的情况下连接路由器或防火墙后面的客户端 tcp 端口

NAT 后面的 UDP P2P 连接

UDP、NAT 和设置“连接”

使用 YARN 集群模式的 NAT 后面的 Spark 应用程序

如何在不需要任何重定向配置的情况下使 TCP 服务器在路由器 (NAT) 后面工作

如何在 2 个 nat 后面执行 p2p?