NAT穿越实验?

NAT Traversal experiment?

我一直在阅读有关 WebRTC 以及它如何实现 peer to peer 通信的内容。所以,我做了一个 NAT 遍历的实验。

实验objective是为了测试NAT中的打孔。我有两个系统都是 运行 Ubuntu 16.04。我将这些系统称为 system Asystem B

两个系统都连接到托管在 Amazon Web Services 上的服务器。系统 A 使用命令 nc -p 1234 -u IP_ADDRESS_OF_SERVER PORT_NUMBER_OF_SERVER,系统 B 使用命令 nc -p 1235 -u IP_ADDRESS_OF_SERVER PORT_NUMBER_OF_SERVER。系统A和系统B都连接到同一个WiFi路由器。

连接上服务器后,我们对两个系统的了解public socket。之后,我尝试使用我们在几秒钟内从服务器获得的 public 套接字信息相互连接。

系统 A 断开与服务器的连接,并使用命令 nc -u -p 1234 PUBLIC_IP_OF_SYS_B PUBLIC_PORT_OF_SYS_B 连接到系统 B,系统 B 也断开与服务器的连接,并使用命令 nc -u -p 1235 PUBLIC_IP_OF_SYS_A PUBLIC_PORT_OF_SYS_A 连接到系统 A。

我这样做是为了在我们的 NAT 中打一个洞。之后系统A取消上面的nc命令,使用nc -l -u -p 1234监听它的端口。但不幸的是,我无法在系统 A 中接收到系统 B 中键入的任何消息。

谁能帮我完成这项工作?

所以,我自己弄明白了。我试图做的事情叫做 Hairpin Translation 并且发夹翻译在现有 NAT 中仍然不太常见(与打孔翻译相比)。

这两个系统恰好位于同一个 NAT 后面,因此位于同一个私有 IP 地址领域。 System A 已与服务器 S 建立 UDP 会话,公共 NAT 已为其分配了自己的 public 端口号(例如 x)。 System BS 建立了类似的会话,NAT 已为其分配了 public 端口号(例如 y)。

假设system A使用打洞技术与B建立UDP会话,使用服务器S作为介绍人。 System A 向 S 发送请求连接到 B 的消息。S 用 B 的 public 和私有端点响应 A,并将 A 的 public 和私有端点转发给 B。然后两个客户端都尝试在这些端点中的每一个端点上直接相互发送 UDP 数据报。定向到 public 端点的消息将无法到达目的地,因为我们的 NAT 不支持发夹转换。

任何人都可以在 here 上阅读有关发夹的信息。