两个在NAT后面的节点如何进行通信?

7
我有一些节点。每个节点属于其他网络。每个节点都有私有IP地址,例如192.168.0.2,并且在NAT后面。
是否有可能在节点之间进行通信?实际上,我需要在这些独立节点之间传输文件。
我尝试使用此项目-https://github.com/libp2p/go-libp2p。但是libp2p有一些限制:
  1. 两个节点具有私有IP地址(相同网络)
  2. 至少有一个拥有公共IP地址。
但是我有私有IP地址的节点,它们属于不同的网络。

更新。

有以下解决方案:


这不是一个关于Go的问题,而是一个网络问题。Go无法覆盖计算机所处的网络环境设置的限制。 - Bert Verhees
@BertVerhees 我同意你的观点。但是我只是为了解释而使用了go标签,如果有人想给我一些GitHub库,那就更好了。 - Max
没有任何Go库可以解决由网络设置创建的限制。当没有到达IP地址的路由时,没有任何Go库可以让您连接到该计算机。这是一个TCP/IP路由问题,您需要与网络管理员一起解决。 - Bert Verhees
你需要另一个服务器,你知道它的IP/端口,这样你就可以在NAT盒子中交换端口和IP,从而建立P2P连接。 - jubueche
Skype模型是在Skype上下文中,服务器成为超级节点。仍需要P2P的计算机不会知道彼此在其NAT区域内拥有的IP地址。这些地址在NAT外部不可寻址,因此了解它们将是无用的。 Skype的技巧是在NAT后面需要P2P的计算机发起联系,当然大多数情况下是允许的,因为NAT路由器支持该连接方向。 - Bert Verhees
显示剩余3条评论
3个回答

4
这个想法是你有一个约会服务器,节点1和2连接到它。为此,它们必须知道约会服务器的IP地址。
具体步骤如下: 1)节点1和2都向RS发送UDP数据包。 N1(节点1的NAT盒)和N2创建一个转换表中的条目,将节点的IP映射到RS的IP /端口。 2)RS将(EIP1,EP1)传递给节点2。这是元组,其中包含NAT盒的公共IP和公共端口。 RS将(EIP2,EP2)发送给节点1。 3)节点1在转换表中创建映射:(IP1,EP1,EIP2,EP2)。 4)节点2执行相同的操作,但使用(IP2,EP2,EIP1,EP1)。
注意:步骤3和4之所以会发生是因为每个节点都会向刚接收到的元组(IP,端口)发送UDP数据包,因此NAT盒会添加新条目。在最坏的情况下,这些消息可能需要发送多次。
这种技巧使得两个节点都可以获取到公共IP并拥有正确的端口。
这为建立点对点连接(例如Skype)提供了良好的方法。
希望这能帮到你。

同样对于Skype,计算机内部会发起TCP/IP联系。如果路由器启用了UPnP,这个技巧可以实现。 - Bert Verhees
诀窍在于NAT内部的计算机被触发以启动到NAT外部的会话。这里有解释:https://www.theregister.co.uk/2003/10/08/how_does_skype_get_through/ 但是需要在路由器和防火墙上保留特殊设置以允许UDP。 - Bert Verhees
Jbuchel,Max还想知道用哪个go库可以解决这个问题。我认为这是不可能的,但也许你有其他信息。 - Bert Verhees
我不知道有任何库可以做到这一点,但是自己实现似乎并不太难。但或许需要一些时间... - jubueche
这是一个棘手的问题。对此我感到抱歉。您不需要使用任何库,Skype 的处理方式可以在标准网络功能内完成。问题在于所需的外部条款。 - Bert Verhees

2

0

Max,我回答你的问题。

在网络上配置的计算机或无法访问的计算机,不能被计算机上的软件覆盖。这将是一种安全漏洞,并且可能会导致地址冲突,因为在不同的NAT区域中,相同的IP地址可能正在使用。

因此,如果路由器使用NAT,则无法看到路由器后面的计算机。路由器不会广告这些地址。

NAT的目的是拥有一个特殊的IP地址岛,只有NAT部分内部的人才能看到。通过这种方式,公司可以使用较少的唯一IP地址来拥有良好的功能网络。另一个目的是安全性。路由器还隐藏了NAT区域内计算机的MAC地址。路由器可以隐藏很多东西。

NAT区域内的计算机可以启动与NAT外部计算机的联系(如果允许),路由器将记住计算机并保持地址转换,但是NAT外部计算机无法寻址NAT内部计算机。它只能回复来自内部的计算机。它通过回复路由器来完成这项工作,路由器将知道将回复转发给NAT区域内的哪台计算机。

Go没有提供可以解决这些外部限制的库。接受这个事实吧,你无能为力。

正如JBuchel所解释的那样,如果有一些额外的规定,比如开放UDP端口和额外的服务器/计算机等,Skype模型可以起作用。实际上,这是网络配置的重新排列,不能在没有系统/网络管理员的帮助下完成。

但是,如果在那个级别上有支持,解决方案就会变得更加容易,只需将计算机从NAT中移除,并为其分配一个对其他计算机可见的IP地址即可。


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