NAT 后面到 NAT 连接后面

Posted

技术标签:

【中文标题】NAT 后面到 NAT 连接后面【英文标题】:Behind NAT to behind NAT connection 【发布时间】:2011-07-01 22:53:00 【问题描述】:

我遇到了一个有趣的问题。基本上我有 2 部手机都在 NAT 之后。我想使用 UDP 在两台设备之间直接通信。

我知道如果我启动从手机到服务器的连接,那么我可以将数据从该连接向下推送到手机(即从接收消息的同一端口将其发送回与它相同的 ip 和端口从......收到)。因此,我可以通过将两部手机连接到服务器来轻松地在两部设备之间进行通信。然后将数据发送到服务器并将其重新路由回手机。这绕过了我可能遇到的任何 NAT 穿越问题。

但是,我宁愿只使用服务器将 2 个设备相互指向,然后让它们直接通信。我该怎么做呢?不使用像 uPnP 这样的东西可以吗?

任何帮助将不胜感激!

编辑:我找到了这个文档http://www.brynosaurus.com/pub/net/p2pnat/ 看起来我正在追求发夹式翻译,但它看起来并没有得到广泛的支持。我想知道移动 ISP 对 UPnP 的支持有多好?

【问题讨论】:

您的问题是“我想知道移动 ISP 对 UPnP 的支持有多好?”。所有问题都解释了什么打孔是,但没有一个回答有关当前支持的问题。哦,真有趣 :-) 感谢您提供指向 p2pnat 论文的链接。 近年来您找到解决方案了吗?我还有三个远程网络(都带有 LTE 调制解调器,没有 uPNP 的 ISP NAT),我想将它们连接在一起。现在我正在使用 Pritunl Open***,但我希望中介服务器只是作为中介,正如你所描述的,而不是通过它路由所有流量。 找到了 ZeroTier,它看起来就像工作的工具(无法编辑评论,因为 > 5 分钟)。 【参考方案1】:

您正在寻找的是 UDP 打孔,请参见例如http://en.wikipedia.org/wiki/UDP_hole_punching

基本思路很简单,告诉每个端点要使用的端口,然后它们开始发送 udp 数据包。 NAT'ing 设备在看到第一个传出数据包时会设置一条穿越规则,然后另一端的下一次尝试将匹配此穿越规则。

【讨论】:

如果每个路由器都具有我无法确定的外部可见性,那么打孔就很好了:(这个文档brynosaurus.com/pub/net/p2pnat对打孔和“发夹式翻译”有很好的解释这看起来更像我所追求的,但是,唉,没有得到很好的支持:(【参考方案2】:

您需要一个中介服务器,以便客户端知道他们在哪里。然后一个通过 uPNP 打开一个服务器,另一个连接到它。

【讨论】:

是的,如果我可以使用它,那就太理想了。但是,UPnP 不适用于多 NAT 层网络拓扑:( 多nat?在双方?这是中国吗?

以上是关于NAT 后面到 NAT 连接后面的主要内容,如果未能解决你的问题,请参考以下文章

NAT 后面的 UDP P2P 连接

如何在没有 NAT 的情况下连接路由器或防火墙后面的客户端 tcp 端口

为 NAT 后面的客户端创建 Tcp 连接

使用 nat 后面从服务器到客户端的数据获取 ECHO REPLY

使用 YARN 集群模式的 NAT 后面的 Spark 应用程序

UDP、NAT 和设置“连接”