3

关于NAT,ICE,STUN,TURN

这些是开发人员必须非常了解的重要概念,才能使用WebRTC。这是下面有些问题将被解决:

  1. 什么是NAT?
  2. 什么是NAT穿透?
  3. 什么是ICE?
  4. 什么是STUN?
  5. 什么是TURN?
  6. 如何安装Coturn?
  7. 如何测试我的STUN / TURN服务器?
  8. 如何配置STUN / TURN?
  9. WebRTC故障排除
  10. 高级知识:NAT类型和NAT遍历

什么时候需要STUN和TURN?

NAT后面的每个WebRTC参与者都需要 STUN(可能还有 TURN)。尝试从 NAT后面进行连接的所有对等方都需要“打开 ”自己的端口,这一过程称为 NAT遍历。这可以通过使用部署在NAT外部的 STUN服务器来实现。

STUN服务器配置为使用一系列UDP和TCP端口。在服务器的网络配置或安全组中,所有这些端口也应向所有流量开放。

如果要在NAT环境中安装Kurento(例如,如果服务器位于NAT防火墙后面),则还需要在/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini中配置外部STUN服务器。同样,位于NAT后面的所有浏览器客户端都需要使用RTCPeerConnection构造函数的iceServers字段配置STUN服务器详细信息。

比如:

Kurento Media Server及其应用程序服务器在云计算机中运行,对传入连接没有任何NAT或端口限制,而浏览器客户端从可能受限制的NAT网络运行,该网络禁止在未“打开”任何端口的端口上进行传入连接提前

浏览器客户端可以出于信令目的与Application Server通信,但是最终,大部分音频/视频通信是在浏览器的WebRTC引擎和KMS之间完成的。

faqstun1.png

在这种情况下,客户端能够将数据发送到KMS,因为其NAT将允许传出数据包。但是,KMS 无法将数据发送到客户端,因为客户端的NAT已关闭,无法接收传入的数据包。这可以通过配置客户端使用STUN服务器来解决。客户端的浏览器将使用此服务器打开NAT中的相应端口。完成此操作后,客户端现在可以从KMS接收音频/视频流:

faqstun2.png

此过程由客户端浏览器的ICE实现完成。

请注意,只要KMS本身也配置为使用STUN服务器,您也可以在NAT防火墙后部署KMS。

如何安装coturn

Coturn是STUN服务器和TURN中继,支持ICE协议所需的所有功能,并允许从NAT后面建立WebRTC连接。

Coturn可以直接从Ubuntu软件包存储库安装:

sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
    coturn

要为WebRTC配置它,请按照下列步骤操作:

  1. 编辑/etc/turnserver.conf。

此示例配置是很好的第一步;它将与Coturn和Kurento Media Server一起用于WebRTC流时有效。但是,您可能需要根据需要进行更改:

# This server's external/public address, if Coturn is behind a NAT.
# It must be an IP address, not a domain name.
external-ip=<CoturnIp>

# STUN listener port for UDP and TCP.
# Default: 3478.
#listening-port=<CoturnPort>

# TURN lower and upper bounds of the UDP relay ports.
# Default: 49152, 65535.
#min-port=49152
#max-port=65535

# Uncomment to run server in 'normal' 'moderate' verbose mode.
# Default: verbose mode OFF.
#verbose

# Use fingerprints in the TURN messages.
fingerprint

# Use long-term credential mechanism.
lt-cred-mech

# Realm used for the long-term credentials mechanism.
realm=kurento.org

# 'Static' user accounts for long-term credentials mechanism.
user=<TurnUser>:<TurnPassword>

# Set the log file name.
# The log file can be reset sending a SIGHUP signal to the turnserver process.
log-file=/var/log/turnserver/turnserver.log

# Disable log file rollover and use log file name as-is.
simple-log

注意:

  • external-ip:是服务器的公网ip.(是ip不是域名!)
  • WebRTC还需要需要填:Fingerprint,lt-cred-mech和realm
  • user是授权使用的最基本的形式TURN中继功能。写下您想要的用户名和密码的字段<TurnUser>和<TurnPassword>
  • 其他参数可以根据需要进行调整。有关更多信息,请查看Coturn帮助页面:
https://github.com/coturn/coturn/wiki/turnserver
https://github.com/coturn/coturn/wiki/CoturnConfig
完整注释的示例配置文件:https://raw.githubusercontent.com/coturn/coturn/master/examples/etc/turnserver.conf
  1. 编辑文件/etc/default/coturn并设置

<pre>TURNSERVER_ENABLED=1
</pre>

因此,服务器将作为系统服务守护程序自动启动。

如何测试STUN/TURN服务器

要测试您的STUN / TURN服务器是否正常运行,请打开Trickle ICE测试页面。在该页面中,请按照下列步骤操作:

  1. 删除默认情况下可能已填写的所有服务器。
  2. 填写您的STUN / TURN服务器详细信息。

仅测试STUN服务器(将不测试TURN中继):

stun:<StunServerIp>:<StunServerPort>

要同时测试STUN服务器和TURN中继:

turn:<TurnServerIp>:<TurnServerPort>

并同时填写TURN用户名和TURN密码。

  1. 单击添加服务器。列表中应该只有一个条目以及服务器详细信息。
  2. 单击“ 收集候选人”。如果您正在测试STUN ,请验证您是否获得该类型的候选人srflx。同样,如果要测试TURN ,则应获得类型srflx 和类型的候选relay。

如果缺少任何预期的候选类型,则您的STUN / TURN服务器运行不正常,WebRTC将失败。检查您的服务器配置以及您的云提供商的网络设置。

kurernto如何设置STUN/TURN

`vim /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini`
stunServerAddress=(StunServerIp)
stunServerPort=(StunServerPort)

turnURL=myuser:mypassword@198.51.100.1:3478

以下端口应在防火墙或云计算机的安全组中打开

CoturnPort(默认值:3478)UDP和TCP。
49152-65535 UDP和TCP:按照RFC 5766,这些是TURN中继将用于交换媒体的端口。可以使用Coturnmin-port和max-port参数更改这些端口。

端口范围必须在Coturn和Kurento Media Server之间匹配。检查文件/etc/turnserver.conf和/etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini,以验证这两个文件将使用同一组端口。

重启Coturn和Kurento服务器:

sudo service coturn restart
sudo service kurento-media-server restart

接下来,公网上访问就不会出现远程的访问不到情况了。关于NET/ICE/STUN/TURN/COTURN有一篇很好理解的文章在这里:https://blog.yasking.org/a/we...

最后欢迎加入我们:
qq群:

openvidu群:
image.png

webrtc-jitsi群:
image.png

openvidu钉钉群:
21919158

openvidu中文学习码云:
http://openvidu_cn.gitee.io/openvidu_docs_cn/docs/home/


crawler
327 声望79 粉丝

专注技术多年,曾任职京东,汉得等公司主研