Create Tcp connection for clients behind NAT
对于Linux,Windows OS,存在哪些软件库可用于此类任务?
RFC中是否存在一些信息,人们应该如何做?
我很有趣如何为该软件的此处显示的C ++项目创建功能:https://secure.logmein.com/ru/products/hamachi/download.aspx
-
从客户端或服务器的角度看,通过NAT的TCP连接与没有NAT的TCP连接没有什么不同。路由器将是一个重写源IP。另外,这似乎要求提供软件建议,该建议不适用于stackoverflow。
-
嗯,从我的角度来看," TCP连接建立"在客户端位于NAT之后时会有所不同。他们可能没有自己的公共IP。当NAT后面的客户端可能是您时,您需要第三个人进行初始连接。问题是关于文章,软件库或rfc,或其他有关问题……"客户端如何在NAT之后连接它们"
-
"请求软件库建议"-我不知道这种限制
-
现在,我知道您要创建到NAT后系统的INBOUND tcp连接。出站TCP连接没有任何不同,但是如果没有适当的端口转发,则指向NAT客户端的入站TCP连接很麻烦。 UltraVNC通过在公共IP上使用"中继器"(称为"第三者")来克服此问题。由于它是开源的,因此您可以查看它的代码以重新实现类似的功能
-
您可以阅读"主题"帮助中心,以了解有关问题上有哪些限制的更多信息。对于第4点,它说:要求我们推荐或找到书,工具,软件库,教程或其他非现场资源的问题对于Stack Overflow而言是不重要的,因为它们往往会吸引有思想的答案和垃圾邮件。相反,请描述问题以及到目前为止已解决的问题。
如果要通过TURN中继服务器建立连接,则没有太大区别。唯一的区别是TCP和UDP如何创建连接,仅此而已。
如果要建立P2P连接,会有一些大的不同。
如果您在同一个网络中(在同一个NAT之后):在UDP中,您向对等候选人发送眩晕绑定请求,然后,如果您收到响应,则表明您已连接。与TCP相同,您必须在一侧创建一个主动套接字,在另一侧创建一个被动套接字。然后从主动套接字发送syn并从被动套接字接收它,然后将syn ack发送到主动套接字。然后活动套接字发送一个ack并建立连接。
如果您位于不同的网络(位于不同的NAT之后):您必须使用TCP打孔技术进行连接。因为如果以前没有任何数据包发送到该Syn来源的地址,则您的NAT将不允许TCP syn数据包通过。
TCP打孔的详细信息:
您必须使用TCP同时打开套接字。此套接字在主动和被动模式下均起作用。两端都需要彼此了解私有和公共IP:Port。
TCP同时打开将发生以下情况:
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过滤行为,请参阅此答案。
-
从技术角度来看:当我创建tcp / ip连接时,我应该知道一对-" ip地址"。然后我可以创建ARP请求来接收mac地址,然后我应该创建TCP套接字,并且还需要ip addres来发送SYN ....所以我真的需要ip地址。
-
更确切地说,假设NAT隐藏具有1个公共IP地址的本地专用网络。 NAT支持正确处理"输入和输出数据包",但是这种机制在结果连接的上下文中运行...。但是NAT后面的侦听部分
-
我只了解一个-您需要第三方来建立与公共ip的初始连接,然后您应该更正tcp / ip数据包,以便数据流不会包含第三部分。它是否有此技术的名称?
-
从实际的角度来看:我应该使用什么。是否存在额外的posix库来执行此操作?
-
ps在"如果您位于不同的网络(位于不同的NAT之后)"案例中,我很有趣
-
您不需要知道用于NAT穿越目的的mac地址。两端都需要知道彼此的私有IP和公共IP:端口。您不需要库来进行TCP打孔。我已经用步骤更新了我的答案。还可以了解不同种类的NAT及其过滤和端口分配行为。
-
非常感谢您提供信息!我用星号标记了你的答案)
-
感谢有关TCP打孔的信息。但是您在这里对我的问题有何看法:"您需要第三方来建立与公共ip的初始连接,然后您应该更正tcp / ip数据包,这样数据流才不会包含第三部分。它是否存在此tecnique的名称?"这个想法是两台机器连接到公共服务器,而它们的NAT之间没有TCP连接...然后神奇的事情发生在数据流传输过程中!在此会话期间,更改整个tcp / ip堆栈上的源和目标地址。目标-将此第三部分作为代理从进一步的沟通中排除
-
我认为多数民众赞成在呼叫源伪造。但是您的帖子不会问这个问题。这应该是另一个问题,因为它是完全不同的技术。
-
我想这样做...但是我在这个问题上有很多缺点,现在我在stackoverflow上受阻。所以我会在可能的时候做到
-
好吧,在您的个人资料中,我看不到您接受人们为您的问题提供的任何答案。也许之后,您的区块将被删除。
-
我在这里发布了有关源伪造的问题stackoverflow.com/questions/32075505/
-
@bruziuz如果您认为这很好,请保持礼貌并接受答案。那就是绿色勾号的意思。一个示例stackoverflow.com/a/1511632/842860
-
谢谢,我不知道。我以为这样的语义有"上三角"