NAT穿越实验?
NAT Traversal experiment?
我一直在阅读有关 WebRTC
以及它如何实现 peer to peer
通信的内容。所以,我做了一个 NAT
遍历的实验。
实验objective是为了测试NAT
中的打孔。我有两个系统都是 运行 Ubuntu 16.04
。我将这些系统称为 system A
和 system 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 B
与 S
建立了类似的会话,NAT 已为其分配了 public 端口号(例如 y)。
假设system A
使用打洞技术与B
建立UDP会话,使用服务器S作为介绍人。 System A
向 S 发送请求连接到 B 的消息。S 用 B 的 public 和私有端点响应 A,并将 A 的 public 和私有端点转发给 B。然后两个客户端都尝试在这些端点中的每一个端点上直接相互发送 UDP 数据报。定向到 public 端点的消息将无法到达目的地,因为我们的 NAT 不支持发夹转换。
任何人都可以在 here 上阅读有关发夹的信息。
我一直在阅读有关 WebRTC
以及它如何实现 peer to peer
通信的内容。所以,我做了一个 NAT
遍历的实验。
实验objective是为了测试NAT
中的打孔。我有两个系统都是 运行 Ubuntu 16.04
。我将这些系统称为 system A
和 system 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 B
与 S
建立了类似的会话,NAT 已为其分配了 public 端口号(例如 y)。
假设system A
使用打洞技术与B
建立UDP会话,使用服务器S作为介绍人。 System A
向 S 发送请求连接到 B 的消息。S 用 B 的 public 和私有端点响应 A,并将 A 的 public 和私有端点转发给 B。然后两个客户端都尝试在这些端点中的每一个端点上直接相互发送 UDP 数据报。定向到 public 端点的消息将无法到达目的地,因为我们的 NAT 不支持发夹转换。
任何人都可以在 here 上阅读有关发夹的信息。