如何通过 NAT 通过公共 IP 发送 UDP 数据包?

Posted

技术标签:

【中文标题】如何通过 NAT 通过公共 IP 发送 UDP 数据包?【英文标题】:How to Send A UDP packet via public IP through NAT? 【发布时间】:2015-01-06 13:30:29 【问题描述】:

我有一个 UDP 服务器在我的专用网络上运行。我有一个超出 NAT 的设备,它通过公共 IP 将 UDP 数据包发送到我的服务器。我能够接收 UDP 数据包,解析它们,我可以查看有效负载、src 和 dest 端口。现在我需要向那个设备发送一个 ACK​​ 消息,所以我已经捕获了 ip 和端口号并向它发送一个 UDP 数据包。但我无法查看该设备中的任何 UDP 数据包。

我的问题是因为我的设备超出了 NAT,所以我得到的 IP 地址和端口号是 NAT 还是实际设备的?

如何通过 NAT 将 UDP 数据包发送到该设备?

【问题讨论】:

恕我直言,这里的问题是题外话。它更适合networkengineering.stackexchange.com en.wikipedia.org/wiki/UDP_hole_punching 【参考方案1】:

我的问题是因为我的设备超出了 NAT,所以我得到的 IP 地址和端口号是 NAT 还是实际设备的?

您从数据包中识别的 IP 和端口是 NAT 为客户端创建的映射。简单来说就是设备所连接的NAT的IP和端口。

如何通过 NAT 将 UDP 数据包发送到该设备?

您需要回复服务器从客户端收到的数据包中检测到的 IP 和端口。 更清楚的是,您需要实现 UDP Holepunching

我想您应该首先了解与在 NAT 下工作的设备的连接有关的网络问题。各种 RFC 可用于 NAT TraversalUDP Punching

这里有一些来源:

http://en.wikipedia.org/wiki/Network_address_translation

http://en.wikipedia.org/wiki/UDP_hole_punching

https://www.rfc-editor.org/rfc/rfc4787

https://www.rfc-editor.org/rfc/rfc5128

【讨论】:

以上是关于如何通过 NAT 通过公共 IP 发送 UDP 数据包?的主要内容,如果未能解决你的问题,请参考以下文章

两个经过 NAT 的 Skype 节点如何通信

如何在对称 NAT 下向客户端发送数据包

NAT 后面的 UDP 打孔

客户端和服务器公共 IP

如何通过 Cloudformation 将弹性 IP 附加到 Nat 网关

Java UDP STUN 打孔与 DatagramSocket