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

18

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

"为了作为STUN服务器,需要在同一台计算机上拥有两个不同的公共IP地址和每个IP的两个不同端口号。"

我在Google上进行了研究,一般情况下STUN服务器需要两个公共IP地址,这是什么原因呢?

3个回答

18

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

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

通过向服务的备用IP:端口发送绑定请求,客户端可以发现他的NAT是否具有一致的本地端口映射语义。如果他在每个测试中都获得不同的端口映射值,则客户端可以得出结论,它位于"对称NAT"后面-这是最难以穿越P2P的。

通过发送一个带有"更改请求"属性的绑定请求,请求服务从另一个IP或端口响应,客户端可以检测他的NAT是仅基于IP和端口过滤来自远程主机的数据报,还是允许来自已向其发送出站数据报的主机的替代端口的数据报。

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


1
这个解释对我帮助很大。如果我理解正确的话,这意味着只有在客户端的STUN请求指示要使用第二个IP时,STUN服务器上的第二个IP才会被使用。我一直在思考WebRTC中的STUN,并且(通过wireshark)似乎从STUN服务器中没有看到任何次要的IP地址。我的理论是,这是因为第二个IP地址所确认的仅仅是UDP打洞是否成功,在WebRTC中,如果它不成功,那么这些候选项将无法成功,因此额外的检查并没有什么影响。我的理解正确吗? - Ternary
4
@Ternary - 第二个IP仅用于确定NAT类型(即诊断和调试),而不是实际的打洞。客户端可以向服务器发送“绑定请求”以请求其IP / 端口映射。这些绑定请求可以指示响应可以来自服务器的备用IP和/或备用端口。99%的客户端请求stun.stunprotocol.org只是简单地使用主要IP和端口3478进行绑定请求。少数客户端使用端口重定向属性。有一些SIP电话想要同时使用两个端口。 - selbie

13

由于在一些罕见的情况下,NAT转换的行为是目标IP地址的一个函数。这意味着,您必须'ping'两个不同的IP地址,才能找到NAT的精确行为(是否取决于目标IP地址?)

如果您使用两个不同的端口向同一台服务器'ping'两次,则不能正确地覆盖此情况(即,您将没有涵盖所有情况)。

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


2
哎呀,经典的stund实现不支持在两个服务器上使用两个IP地址。这两个IP地址可能位于同一块网卡上,也可能不是,但stund尝试绑定到两个IP地址,因此它们必须在同一台服务器上。 - cato_minor

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接