如何在NAT后面的两个节点之间通信?

时间:2018-06-23 19:09:37

标签: go p2p file-transfer nat upnp

我有一些节点。每个节点都属于其他网络。每个节点都具有 192.168.0.2 之类的专用IP,并且位于NAT之后。

节点之间是否有可能进行通信?实际上,我需要在这些独立的节点之间传输文件。

我尝试使用这个项目- https://github.com/libp2p/go-libp2p。但是 libp2p 有一些限制:

  1. 两个节点都有专用IP地址(同一网络)
  2. 其中至少有一个具有公共IP地址。

但是我有带有专用IP地址的节点,它们属于不同的网络。


更新。

有这样的解决方案:

3 个答案:

答案 0 :(得分:1)

这个想法是您有一个集合服务器,节点1和2连接到该服务器。为此,他们必须知道集合服务器的IP。

它如下: 1)1和2都将UDP数据包发送到RS。 N1(节点1的NAT框)和N2在转换表中创建一个条目,该条目将节点的IP映射到RS的IP /端口。 2)RS将(EIP1,EP1)传递到节点2。这是包含NAT框的公共IP和公共端口的Tulpe。 RS将(EIP2,EP2)发送到节点1。 3)节点1在转换表中创建一个映射:(IP1,EP1,EIP2,EP2)。 4)节点2执行相同的操作,但使用(IP2,EP2,EIP1,EP1)。

注意:发生步骤3和4,因为每个节点将UDP数据包发送到刚接收到的元组(IP,端口),因此NAT框添加了一个新条目。 在最坏的情况下,这些消息必须发送多次。

此技巧使两个节点都能拥有公共IP并具有正确的端口。

这提供了一种建立对等连接的好方法,例如Skype。

我希望这会有所帮助。

答案 1 :(得分:1)

Libp2p没有这样的限制。

您引用的聊天示例的编程方式使其无法支持NAT后的私有IP BUT Libp2p支持NAT穿越技术,例如打孔,STUN,TURN等协议以及使用会合点进行引导现在使用DHT。这就是您所需要的。

以下示例可能对您有用:

  1. 与朋友聊天:https://github.com/libp2p/go-libp2p-examples/tree/master/chat-with-rendezvous
  2. 与他人聊天:https://github.com/libp2p/go-libp2p-examples/pull/1

答案 2 :(得分:0)

最大,我回答你的问题。

您可以访问的哪些计算机是在网络上配置的,或者是无法访问的计算机,则不能被计算机上的软件覆盖。那将是一项安全漏洞,并且可能是地址冲突的原因,因为在不同的NAT区域中,可以使用相同的IP地址。

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

NAT的目的是拥有一个特殊的IP地址岛,而NAT部分之外没有人可以看到。这样,公司可以使用更少的唯一IP地址来拥有一个运行良好的网络。另一个目的是安全性。路由器还会在NAT区域内隐藏计算机的MAC地址。路由器可以隐藏很多东西。

NAT区域内的计算机可以启动与NAT以外的计算机的联系((如果允许),路由器将记住该计算机并对其进行地址转换),但是NAT之外的计算机无法寻址NAT内的计算机。它只能从内部答复计算机。通过回复路由器来完成此操作,路由器将知道NAT区域中将哪台计算机转发到该路由器。

Go不提供可以解决这些外部限制的库。忍受它。您无能为力。

正如JBuchel解释的那样,如果有一些额外的规定(例如开放的UDP端口和额外的服务器/计算机等),skype模型就可以工作。这实际上是对网络配置的重新安排,如果没有系统/网络管理员。

但是,如果在该级别上有支持,则解决方案就容易得多,只需将计算机从NAT中删除,然后为其提供一个对其他计算机可见的IP地址即可。