关于NAT,ICE,STUN,TURN
这些是开发人员必须非常了解的重要概念,才能使用WebRTC。这是下面有些问题将被解决:
- 什么是NAT?
- 什么是NAT穿透?
- 什么是ICE?
- 什么是STUN?
- 什么是TURN?
- 如何安装Coturn?
- 如何测试我的STUN / TURN服务器?
- 如何配置STUN / TURN?
- WebRTC故障排除
- 高级知识: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之间完成的。
在这种情况下,客户端能够将数据发送到KMS,因为其NAT将允许传出数据包。但是,KMS 无法将数据发送到客户端,因为客户端的NAT已关闭,无法接收传入的数据包。这可以通过配置客户端使用STUN服务器来解决。客户端的浏览器将使用此服务器打开NAT中的相应端口。完成此操作后,客户端现在可以从KMS接收音频/视频流:
此过程由客户端浏览器的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配置它,请按照下列步骤操作:
- 编辑/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=
# STUN listener port for UDP and TCP.
# Default: 3478.
#listening-port=
# 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=:
# 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中继功能。写下您想要的用户名和密码的字段
和 - 其他参数可以根据需要进行调整。有关更多信息,请查看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
- 编辑文件/etc/default/coturn并设置
TURNSERVER_ENABLED=1
因此,服务器将作为系统服务守护程序自动启动。
如何测试STUN/TURN服务器
要测试您的STUN / TURN服务器是否正常运行,请打开Trickle ICE测试页面。在该页面中,请按照下列步骤操作:
- 删除默认情况下可能已填写的所有服务器。
- 填写您的STUN / TURN服务器详细信息。
仅测试STUN服务器(将不测试TURN中继):
stun:
要同时测试STUN服务器和TURN中继:
turn:
并同时填写TURN用户名和TURN密码。
- 单击添加服务器。列表中应该只有一个条目以及服务器详细信息。
- 单击“ 收集候选人”。如果您正在测试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:[email protected]: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...