2011-09-29 415 views
11

我已经拍了一下在openfire到STUN服务器设置,并从那里本声明:为什么STUN服务器需要两个不同的公网IP地址

“为了充当STUN服务器,两个不同的公网IP地址需要在同一台机器上,并且每个IP都需要两个不同的端口号。“

我对google进行了研究,一般stun服务器需要两个公有IP地址,这是什么原因?

回答

6

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

如果您'ping'两次不同端口的同一台服务器,这不会适当地覆盖这种情况(即,你不会涵盖所有的基地)。

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

+2

唉,经典的stund实现[不支持](http://sourceforge.net/tracker/?func=detail&aid=1055306&group_id=47735&atid=450612)两个服务器上的两个IP地址。这两个IP可能位于同一个NIC上,但stund会尝试绑定到这两个IP,因此它们必须位于同一个服务器上。 –

1

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

13

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

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

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

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

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

+1

这个解释帮了我很多。如果我理解正确,这意味着STUN服务器上的第二个IP只有在客户端的STUN请求指示要使用它时才会使用。在WebRTC和(通过wireshark)方面,我一直在细化STUN,我从来没有看到任何来自STUN服务器的辅助IP接触到我。我的理论是,这是因为第二个IP会证实的是UDP hole punching正在成功,而在WebRTC中,如果它不成功,那些候选者将会失败,所以额外的检查是没有意义的。我的理解在这里正确吗? – Ternary

+2

@Ternary - 第二个IP只用于确定NAT类型(即诊断和调试),而不是实际的打孔。客户端可以向服务器发送“绑定请求”以请求其IP /端口映射。这些绑定请求可以指示响应可以来自服务器的备用IP和/或备用端口。 stun.stunprotocol.org的客户端请求中有99%是对主要IP和端口3478的简单绑定请求。少数客户端使用端口重定向属性。有几个SIP电话想要使用这两个端口。 – selbie