解释NAT Tranversal C ++?

时间:2015-07-22 21:54:06

标签: firewall p2p nat dht kademlia

我创建了一个完全分散的P2P应用程序,并使用Kademlia算法来实现这一目标。这已经在本地网络上进行了测试,并且完全成功。

我听说过UDP打孔,但是打孔需要对手知道客户端IP,反之亦然,但正如设计所说,这是不可能的。因为它需要每个对等体继续向超级节点\服务器询问新到达并保持它们被分配,所以自然它不太可靠,特别是如果超级节点已关闭。

由于算法的设计1对等体不知道其他对等体的IP地址所以我需要1个对等体来完全打开一个端口,以便PUBLIC能够连接到,我该怎么做呢,在Windows中?也许有人也可能给我合适的链接,可能会给我一个方向?

如果他们使用c ++ \ c作为示例

,那将是更好的(但不是绝对的)

3 个答案:

答案 0 :(得分:0)

我认为你必须稍微改变你的架构。除非您将NAT配置为端口转发(我认为您不希望这样),否则没有其他方法可以进行NAT遍历。您可能需要实现三个层:

  • 下层1:它知道IP地址和端口,可以解决打孔或处理服务器等问题(可能会出现问题,但首先你没有选择,其次你可以为连接添加替代方案)。
  • 第2层:为您的解决方案实施特殊的命名,寻址和位置服务(而不是使用IP地址)。
  • 上层3:使用低层命名和定位服务实现您的p2p解决方案。

答案 1 :(得分:0)

首先,您需要检查您的设计。如果它需要所有节点之间100%连接(没有中继),它可能会在IPv4下失败,因为并非所有NAT都是可遍历的。由于状态防火墙,可能在IPv6下。

现在,对于nat遍历:DHT辅助NAT遍历的解决方案是NATed节点具有集合点节点。

要保持UDP NAT映射打开,必须定期ping该集合点节点。

此外,它必须宣布DHT上的会合点的地址,例如在hash("rendezvous" + node ID)下或仅在其可到达的邻居节点上。

集合点节点可以作为打孔的协调点。

这不需要任何特殊的“超级节点”,只需要网络中的其他(可能是多个,因此消除SPOF)节点,这些节点没有NAT并且可以提供帮助。

其他机制,如UPnP IGP,NAT-PMP,PCP,最终指示用户转发所需的端口,也有助于减少nat遍历的需要。

答案 2 :(得分:0)

  

由于算法的设计1对等体不知道其他对等体的IP地址所以我需要1个对等体来完全打开一个端口,以便PUBLIC能够连接到

首先,这只适用于Full cone NAT。对于其他类型的NAT,公共IP:您打开的端口仅适用于特定目的地。在你的情况下,你不知道目的地,所以它是不可能的。

如果是全锥形NAT,则将数据包发送到具有低TTL值的随机地址,以便数据包在中间丢弃并且不会到达该地址。如果达到该地址,则NAT可能会阻止您。如果你这样做,那么将打开一个端口供任何人发送一个数据包。您需要在一段短暂的间隔后继续发送数据包,以使该端口保持打开状态。这是一个问题,您无法选择在NAT中打开哪个端口。 NAT将为您自己分配一个空闲端口。

最后,如果对等方无法相互交换IP信息,我就不会发现上述任何一点。您应该使用SIP或XMPP等信令协议在对等体之间交换IP信息。

要了解有关NAT的更多信息,请阅读此answer.