为 webRTC 使用特定端口

Use specific ports for webRTC

当使用 webRTC 创建点对点音频连接时,如果用户在路由器后面,我们使用的 STUN 服务器将 return public IP。现在在 ICE 对象中,我可以看到 rport 始终介于 50000 和更高之间。

有没有办法使用特定的端口,这样用户就不必打开所有这些端口?

除非您在自己的应用程序中使用 webrtc API,否则您不能以编程方式进行。浏览器将从本地范围内选择特定的本地端口;然后它会在 SDP 和 ICE 候选人信息中通知您有关它们的信息。

STUN 服务器仅帮助发现客户端是否在 NAT/firewall 之后;然后 ICE 使用此信息建立对等连接。

我听说某处可能有一种方法可以通过 Chrome 策略模板(企业用来限制 Chrome 设置)控制端口范围 - http://www.chromium.org/administrators/policy-templates。可能值得研究...

Is there a way to use a specific port so that the user does not have to open all those ports?

我觉得你理解错了。 STUN 和 ICE(包括其 WebRTC 衍生产品)的全部意义在于避免任何人不得不在其 NAT 上打开端口。相反,STUN 和 ICE 动态打开端口。

这是它的工作原理(非常简短的描述)。

  1. 客户端在随机端口(例如 50001)上打开套接字

  2. 使用该套接字联系 STUN 服务器以发现该套接字的外部 IP:port 映射。 (例如 192.168.1.2:50001 映射到 1.2.3.4:50001)。端口不一定必须在内部地址和外部地址之间匹配,但它们通常会匹配,所以我将在本示例中保持这一点。

  3. 通过外部机制(SIP、XMPP、Jingle、cups with strings),交换双方节点的候选地址列表。这包括收集到的所有已知内部和外部地址(例如 192.168.1.2:50001 和 1.2.3.4:50001)。

  4. 使用在步骤1中打开的同一个套接字,双方直接在彼此之间发送(STUN)消息(UDP数据包)。第一对消息可能被 router/firewall 屏蔽。但是由于一方向远程地址发起了一个出站数据包,因此允许来自该地址的后续数据包返回。这称为 "hole punching step"。因此,端口是动态打开的,不需要路由器进行任何特定配置。

希望对您有所帮助。