常见问题
关于NAT,ICE,STUN,TURN
什么是NAT?
网络地址转换(Network Address Translation,NAT)是一种对网络中机器的私有IP地址进行隐藏的机制。这种NAT机制通常存在于所有类型的网络设备中,从家庭路由器到成熟的公司防火墙。在所有情况下,效果都是一样的:NAT内的机器不能从外部自由访问。
NAT对WebRTC通信的影响是非常负面的:网络内的机器将能够向外部发送数据,但它们将无法从位于网络外的远程端点接收数据。为了满足这一需要,NAT设备通常允许配置NAT绑定以允许数据从网络外部进入;创建这些NAT绑定就是所谓的NAT遍历,也称为“打开端口”。
什么是ICE?
交互式连接建立(ICE)是一种用于NAT穿越的协议。它定义了一种技术,允许两个端点之间的通信,其中一个在NAT内部,另一个在NAT外部。ICE进程的净效果是,NAT将保留所有需要的端口以供通信,并且两个端点都将拥有有关IP地址和可以联系另一个端点的端口的完整信息。
ICE不能独立工作:它需要使用名为STUN的助手协议。
什么是STUN和TURN?
Session Traversal Utilities for NAT(STUN)是一个实现ICE的协议,用于解决NAT穿透问题。任何端点都可以使用它来确定NAT分配给它的IP地址和端口。它还可以用来检查两个端点之间的连接,并作为一个保持活动的协议来维护NAT绑定。STUN与许多现有的NAT一起工作,不需要任何特殊的行为。
Traversal Using Relays around NAT(TURN)是STUN的一个扩展,在NAT安全策略过于严格且无法成功创建所需的NAT绑定的情况下使用。在这些情况下,主机必须使用充当通信中继的中间节点的服务。
注意
Turn是Stun的扩展。这意味着,如果您已经在使用TURN服务器,则不需要配置STUN服务器。
什么时候需要STUN?
NAT后面的每个端点都需要STUN。所有使用NAT的对等方都需要打开自己的NAT端口,通过使用NAT之外的STUN服务器进行NAT穿透。
如果要在NAT环境中安装Kurento(例如,如果服务器位于NAT防火墙之后),则需要使用STUN或TURN服务器,并在/etc/Kurento/modules/Kurento/WebRtcEndpoint.conf.ini中适当配置KMS。除此之外,您还需要打开云提供商安全组中的所有UDP端口,因为STUN/TURN将使用整个0-65535范围内可用的任何端口。
类似地,NAT后面的所有能浏览的端点都需要配置STUN和/或TURN服务器详细信息在 RTCPeerConnection constructor的iceServers字段。
让我们用一个例子来看看:Kurento媒体服务器的典型安装场景是在应用服务器和客户机之间有一个严格的分隔。KMS和Application Server运行在云主机上,没有任何NAT或端口对传入连接的限制,而浏览器客户端运行在任何(可能是受限制的)网络上,该网络禁止任何未事先“打开”的端口上的传入连接。客户机可以与应用服务器通信以进行信令,但在一天结束时,大部分通信是在浏览器的WebRTC引擎和KMS之间完成的。
在这种情况下,客户端能够向KMS发送数据,因为它的NAT将允许传出数据包。但是,KMS将无法向客户端发送数据,因为客户端的NAT对于传入的数据包是关闭的。这可以通过配置客户端使用一些STUN服务器,然后使用STUN协议在NAT中打开适当的端口来解决。执行此操作后,客户端现在可以从KMS接收音频/视频流:
这个过程叫做ICE。
请注意,您也可以在NAT防火墙后面部署KMS,只要KMS本身也配置为按照相同的过程(同样,使用NAT之外的STUN服务器)打开自己的NAT端口。
注释:TURN是STUN的补充。这意味着,如果您已经在使用TURN服务器,则不需要配置STUN服务器。
How to install Coturn?
Coturn是一个STUN服务器和(可选)TURN中继,支持ICE协议所需的所有功能,并允许在位于NAT后面的主机之间建立WebRTC连接。
Coturn可以直接从Ubuntu包存储库安装
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
coturn
1、编辑文件 /etc/turnserver.conf 并根据需要配置服务器。
此基本配置是一个很好的第一步;它将用于将Coturn与Kurento Media Server一起用于WebRTC流,修改参考:
listening-device=enp216s0f0
listening-port=3478
listening-ip=192.168.1.12
relay-ip=192.168.1.12
relay-device=enp216s0f0
external-ip=210.22.120.139/192.168.1.12
Verbose
lt-cred-mech
realm=testrealm
user=gmt:avsgm
stale-nonce=600
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
log-file=/var/log/turnserver/turnserver.log
simple-log
no-loopback-peers
no-multicast-peers
pidfile="/var/run/turnserver.pid"
mobility
no-cli
- 在使用内部NATS的云提供商中,外部ip是必需的,比如Amazon EC2(AWS)。写入服务器的公共IPv4地址,如111.222.333.444。它必须是IP地址,而不是域名。
- WebRTC需要指纹、it-cred-mech和realm选项。
- 用户参数是使用TURN中继功能的最基本授权形式。在和字段中输入所需的用户名和密码。
- 其他参数可根据需要调整。有关详细信息,请查看Coturn帮助页:
- https://github.com/coturn/coturn/wiki/turnserver
- https://github.com/coturn/coturn/wiki/CoturnConfig
- A fully commented example configuration file: https://raw.githubusercontent.com/coturn/coturn/master/examples/etc/turnserver.conf
2、编辑 /etc/default/coturn 文件
TURNSERVER_ENABLED=1
所以服务器作为系统服务守护进程自动启动。
3、配置KMS并将其指向服务器正在侦听连接的位置。
编辑文件/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini并设置STUN或TURN参数:
stunServerAddress=<CoturnPublicIpAddress>
stunServerPort=3478
turnURL=<TurnUser>:<TurnPassword>@<CoturnPublicIpAddress>:3478
如果在KMS中只配置置STUN参数,那么Coturn的TURN中继能力将不会被使用。当然,如果您改为配置整个TURN URL,那么KMS将能够在需要时使用Coturn服务器作为TURN中继。注意,TURN是STUN的扩展,所以如果您配置TURN,则不需要也配置KMS中的STUN详细信息。
应在防火墙或云计算机的安全组中打开以下端口:
3478 TCP和UDP。
49152-65535 UDP:根据RFC 5766,这些是TURN服务器用来交换媒体的端口。可以使用Coturn的min port和max port参数更改这些端口。
注意
STUN协议不限制可能使用的端口范围,因此在默认配置下,您应该打开所有UDP端口。但是,可以编辑文件/etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini并限制kurento媒体服务器使用的端口范围。这样可以减少服务器中打开的端口集。
4、最好, start the Coturn server and the media server:
sudo service coturn start
sudo service kurento-media-server restart
5、务必使用下的链接检查你的安装是否成功:
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/