为啥 STUN 服务器需要两个不同的公共 IP 地址

Posted

技术标签:

【中文标题】为啥 STUN 服务器需要两个不同的公共 IP 地址【英文标题】:Why a STUN Server Needs Two Different Public IP addresses为什么 STUN 服务器需要两个不同的公共 IP 地址 【发布时间】:2011-11-27 12:09:57 【问题描述】:

我查看了openfire 中的 STUN 服务器设置,并从那里获得了以下声明:

“为了充当 STUN 服务器,需要同一台机器上的两个不同的公共 IP 地址,以及每个 IP 的两个不同的端口号。”

我在google上研究过,一般stun服务器需要两个公网IP,这是什么原因?

【问题讨论】:

【参考方案1】:

为了尝试建立 P2P 连接,STUN 绑定请求和对/来自 STUN 服务的主地址(IP 和端口)的响应是真正重要的。此请求的响应正文中返回的映射地址被传递(通过 XMPP 或其他服务)到本地客户端尝试与之建立直接通信的远程节点。

STUN 服务侦听的第二个 IP 和端口对于确定 NAT 端口映射行为和 NAT 过滤行为很有用。

通过向服务上的备用 IP:port 发出绑定请求,客户端可以发现其 NAT 是否具有与本地端口一致的映射语义。如果他为每个测试获得不同的端口映射值,客户端可以断定它位于“对称 NAT”后面——这是 P2P 最难穿越的。

通过发送带有“更改请求”属性的绑定请求,要求服务从其他 IP 或端口响应,客户端可以检测他的 NAT 是否仅根据 IP 和端口过滤来自远程主机的数据报,或者允许对于来自主机上备用端口的数据报,它已将出站数据报发送到。

映射行为和过滤测试只为后续的 P2P 连接提供有限的信息。在确定主机和 Internet 之间存在对称 NAT 的情况下,一些实现可能会观察到 NAT 在每个绑定响应中具有一致的端口值增量值。 (例如 STUN 服务观察到的外部端口加一)。因此,客户端可以为远程客户端提供 IP 和猜测的端口号,以尝试发送到而不是从第一个绑定请求映射回来的端口号。或者客户端可以使用此行为/过滤测试进行日志记录。或者在对称 NAT 的情况下自动分配中继。

【讨论】:

这个解释对我帮助很大。如果我理解正确,这意味着只有当客户端的 STUN 请求指示使用它时,才会使用 STUN 服务器上的第二个 IP。我一直在关注 WebRTC 方面的 STUN,并且(通过 wireshark)我似乎从来没有看到任何来自 STUN 服务器的辅助 IP 可以联系到我。我的理论是,这是因为第二个 IP 将确认的所有内容都是 UDP 打孔成功,而在 WebRTC 中,如果它不成功,那么这些候选者无论如何都会失败,因此额外的检查没有任何后果。我的理解正确吗? @Ternary - 第二个 IP 仅用于确定 NAT 类型(即诊断和调试),而不用于实际打孔。客户端可以向服务器发送“绑定请求”以请求其 IP/端口映射。这些绑定请求可以指示响应可以来自服务器的备用 IP 和/或备用端口。对 stun.stunprotocol.org 的 99% 的客户端请求是对主 IP 和端口 3478 的简单绑定请求。少数客户端使用端口重定向属性。有一些 SIP 电话想要同时使用这两个端口。【参考方案2】:

因为在极少数情况下,NAT 转换的行为是目标 IP 地址的函数。这意味着,您必须“ping”两个不同的 IP 地址才能找到 NAT 的精确行为(它是否取决于目标 IP 地址?)

如果您使用两个不同的端口对同一台服务器“ping”两次,则无法正确覆盖这种情况(即,您不会覆盖所有基础)。

P.S.:这两个 IP 地址不需要在同一台服务器上,可以是不同的服务器。

【讨论】:

唉,经典的 stund 实现 does not support 两台服务器上的两个 IP 地址。这两个 IP 可能在同一个 NIC 上,但 stund 尝试绑定到两者,因此它们必须在同一台服务器上。【参考方案3】:

我猜测需要识别正在执行的 NAT 的类型 - 一些 NAT 将使用相同的源 IP 地址并通过端口号对会话 ID 进行编码(我认为它称为锥形 NAT,但不确定),一些 NAT 将使用源 IP 和端口的组合来对会话 ID 进行编码。 STUN 服务器需要给客户端的答案因 NAT 类型而异。

【讨论】:

以上是关于为啥 STUN 服务器需要两个不同的公共 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Stun 和 ice4j 接收公共 IP 和端口

需要帮助设置用于 p2p 数据传输的 udp 打孔。无法让 STUN 工作

webrtc stun服务器必须是公网ip吗

了解 Stun 工作

以编程方式发现公共 IP

无法使用 STUN 执行 TCP 打孔