使用 STUN 打孔

Hole punching using STUN

我目前正在尝试通过 Internet 发送 UDP 消息,并且必须为端点 A 和 B(都在 NAT 后面)设置防火墙。为此,我想使用 STUN 服务器进行打孔。

当 A 创建对 STUN 服务器的请求时(例如,private:85.1.1.12:6000 和 public:173.194.78.127:19302),我得到 85.1.1.12:6000 作为响应。如果我要从同源配置(用于 STUN 请求的同源 IP 和端口)发送数据包到任何其他目标地址(目标端口保持不变),那么我的 NAT 将更改 public 端口(从 6000 到其他任何端口)。我通过对两个不同的 STUN 服务器请求使用相同的地址端口配置(两个请求都使用端口 19302)发现了这一点。

像这样,当向B发送数据包时,我不可能知道我的NAT在哪个端口进行转换(B无法接收任何东西,因为它的防火墙没有设置)。

这是因为我的 NAT 类型不兼容打孔还是我理解错了?

谢谢!

85.1.1.12:6000 不是您的私有 IP 地址。它是您的 NAT public/external IP:Port。私有 IP 是您 PC/Device 的接口地址。

根据你的情况,我猜你有一个对称的 NAT。在对称 NAT 中,每次将一些数据包发送到不同的目的地时,NAT 的 public 端口都会发生变化。如果您的目的地保持不变,那么 NAT 的 public IP:Port 也保持不变。

对于其他类型的 NAT,如果您的私有 IP 没有改变,那么您将数据包发送到哪里并不重要,您的 NAT public IP:port(在您的情况下为 85.1.1.12: 6000) 将保持不变。

如果一侧有 **对称 NAT 而另一侧有 Symmetric/PRC NAT,则无法打孔。

**我所说的对称 NAT 是指提供随机端口分配的对称 NAT。

打孔 如果双方都有对称 NAT,从技术上讲并非不可能(尽管遍历过程可能太不可靠,不值得这么麻烦)。请阅读我的论文:

https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing

或者它引用的其中一篇论文:

  1. http://tools.ietf.org/id/draft-takeda-symmetric-nat-traversal-00.txt

  2. https://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf

  3. http://journals.sfu.ca/apan/index.php/apan/article/view/75/pdf_31