Python 中的 UDP 打孔,在本地工作但不能通过 AWS

问题描述 投票:0回答:1

我正在尝试实施 UDP 打洞,这样我就可以将不在同一网络中的 2 个客户端连接在一起,而无需转发。我使用 this question 中的最佳答案作为我的基础,如果我在本地计算机上运行客户端和服务器(两个客户端都得到“你好”响应),它就可以工作。

现在我已经制作了一个运行服务器的 AWS 实例并打开了它的端口以便我的客户可以连接,但是当他们收到彼此的 ip + 端口时他们似乎无法到达(他们得到响应“ peer: x.x.x.x yyyy”,但不是“hello”响应)。为了让他们能够沟通,我缺少什么?即使两个客户端都在同一台机器上,它仍然无法工作,只有在客户端和服务器都使用本地主机(127.0.0.1)时,它才会给出正确的响应。

python udp hole-punching
1个回答
0
投票

“NAT”(网络地址转换)在数据包从内部路由到外部接口时将私有地址转换为公共地址,反之亦然,以允许双向通信。

首先简要总结一下当两个客户端都在自己的 NAT 后面时它是如何工作的:

  • 第 1 步:使用公共服务器,两个客户端必须交换地址并就未来 UDP 通信的端口号达成一致:IP1、端口 1、IP2、端口 2。请注意,这两个 IP 地址都是相应 NAT 路由器的公网地址。
  • 第二步:在通道可用之前,他们都必须向对方发送一个数据包,目的是在每个 NAT 路由器中创建一个 NAT 表条目。
  • 第 3 步:对等方现在可以交换 UDP 数据包。请注意,每个数据包都经过两个 NAT 路由器。

现在假设客户端 A 和 B 在同一个 NAT 后面的同一个专用网络上,而公共服务器在别处。在这种情况下:

  • 第一步:这里没有问题,但是IP1 == IP2 == 本地NAT路由器公网接口的IP
  • step 2:发往对方的数据包是发往本地NAT路由器的数据包。它不会转发到传出接口,即不需要 NAT,也不会创建任何条目。路由器可能使用无法访问的 ICMP 端口进行应答。
  • 第 3 步:如您所见,没有机会
© www.soinside.com 2019 - 2024. All rights reserved.