为NAT后的客户端创建TCP连接

6

有哪些适用于Linux、Windows操作系统的软件库可以完成这样的任务?

是否有RFC中关于人们应如何执行此操作的相关信息?

我想知道如何为我的C++项目创建功能,就像这个软件中所展示的一样:https://secure.logmein.com/ru/products/hamachi/download.aspx


1
从客户端或服务器的角度来看,通过NAT的TCP连接与没有NAT的连接没有区别。路由器将重新编写源IP。此外,这似乎是要求软件建议,这不适用于stackoverflow。 - ThatOneDude
嗯,“TCP连接建立”在客户端位于NAT后面时有一些不同。他们可能没有自己的公共IP地址。当客户端位于NAT后面时,可能需要第三方进行初始连接。问题是关于文章、软件库、RFC或其他相关内容的:“如果客户端位于NAT后面,如何连接它们?” - Konstantin Burlachenko
请求软件库推荐。我不知道有这样的限制。 - Konstantin Burlachenko
我现在明白您想要创建一个针对NAT后面系统的入站TCP连接。出站TCP连接并没有什么不同,但是如果没有端口转发,那么针对NAT客户端的入站TCP连接就会很麻烦。UltraVNC通过在公共IP上使用“中继器”来解决这个问题,该中继器将成为“第三方”。由于它是开源的,您可以查看其代码以重新实现类似的功能。 - ThatOneDude
您可以阅读帮助中心的"论题"以获取有关问题限制的更多信息。它指出点4:询问我们推荐或查找书籍、工具、软件库、教程或其他网站资源的问题,因其往往会吸引充满个人观点的答案和垃圾邮件,所以在 Stack Overflow 上属于离题。相反,请描述问题以及已尝试解决问题的方法。 - ThatOneDude
1个回答

10

如果你想通过TURN中继服务器建立连接,则没有太大区别。唯一的区别在于TCP和UDP如何创建连接,其他方面都一样。

如果你想建立P2P连接,则有一些重要的区别。

如果你们在同一个网络中(在相同的NAT后面):在UDP中,你向你的对等候选者发送一个stun绑定请求,如果你收到回应,那么你就知道连接已经建立了。TCP同样需要在一侧创建一个主动套接字和另一侧创建一个被动套接字,然后从主动套接字发送SYN,在被动套接字上接收SYN,并向主动套接字发送SYN+ACK,最后主动套接字再发送一个ACK以建立连接。

如果你们在不同的网络中(在不同的NAT后面):你必须使用TCP打洞技术来建立连接。因为如果之前没有数据包从SYN地址发送过来,你的NAT就不会允许TCP SYN数据包通过。

TCP打洞的详细过程如下:

你需要使用TCP同时打开套接字,该套接字可以同时作为主动模式和被动模式。两端均需知道对方的私有和公共IP:端口。

  1. 对等方A不断向对等方B发送SYN,而对等方B不断向对等方A发送SYN。

  2. NAT-a收到来自对等方A的出站SYN时,会在其状态机中创建一个映射。 当NAT-b收到来自对等方B的出站SYN时,也会在其状态机中创建一个映射。

  3. 两个SYN在网络路径上相交时:

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

  4. 收到SYN后,对等方发送SYN+ACK,连接就建立了。

来自维基百科。如需了解TCP同时打开连接,请阅读这里。要了解NAT过滤行为,请查看此答案


1
我对“如果您在不同的网络(位于不同的NAT后面)”情况很感兴趣。 - Konstantin Burlachenko
我想做这件事...但是由于这个问题我收到了很多负面评价并且现在我在stackoverflow上被封禁了。所以我会在有可能时再去尝试。 - Konstantin Burlachenko
在您的个人资料中,我没有看到您接受任何人为您的问题提供的答案。也许在此之后,您的封锁将被解除。 - Tahlil
我在这里发布了一个关于源地址欺骗的问题:http://stackoverflow.com/questions/32075505/how-implement-source-faking-during-tcp-session - Konstantin Burlachenko
1
谢谢,我不知道这个。我以为这样的语义有“向上三角形”。 - Konstantin Burlachenko
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接