为 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 端口
使用 YARN 集群模式的 NAT 后面的 Spark 应用程序