Turn/Coturn服务器安装

Kurento Media Server 与任何 WebRTC 端点一样,可以单独运行,适用于 LAN 连接或分配有公共 IP 地址的服务器。但是,迟早您会希望让您的应用程序在具有 NAT 防火墙的云环境中工作,并允许 KMS 连接到远程客户端。同时,远程客户端可能也希望从自己的 NAT 路由器后面进行连接,因此您的应用程序需要准备好在两侧 执行NAT遍历。 这可以通过设置STUN 服务器 或者TURN 中继, 并在 KMS 和客户端浏览器中对其进行配置来完成。

如何安装 Coturn

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

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

sudo apt-get update ; sudo apt-get install --no-install-recommends coturn

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

  1. 编辑 /etc/turnserver.conf。
# The external IP address of this server, 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=3478

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

# Uncomment to enable moderately verbose logs.
# Default: verbose mode OFF.
#verbose

# TURN fingerprints in messages.
fingerprint

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

# TURN static user account for long-term credential mechanism.
user=<TurnUser>:<TurnPassword>

# TURN realm used for the long-term credential mechanism.
realm=kurento.org

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

# Disable log file rollover and use log file name as-is.
simple-log
  • 在使用内部 NAT 的云提供商(例如 AWS(Amazon EC2))中, external-ip是必需的。取消注释此行并在字段 <CoturnIp>中写入机器的公共 IP 地址。 它必须是 IP 地址,而不是域名
  • 如果您只希望 Coturn 充当 STUN 服务器,请注释掉(或删除)所有 TURN 参数。
  • 创建目标日志文件,否则 Coturn 将无权自行创建该文件:
sudo install -o turnserver -g turnserver -m 644 /dev/null  var/log/turn.log
  1. 编辑文件 /etc/default/coturn 并取消注释或添加以下行:
TURNSERVER_ENABLED=1
  1. 启动Coturn系统服务:
sudo service coturn restart
  1. 您的防火墙/NAT/云提供商的安全组中应打开以下端口 :
  • 监听端口(默认值:3478)UDP 和 TCP。如果您在 Coturn 中禁用 UDP 或 TCP(例如,使用 no-tcp),则可以跳过打开其中一种协议。
  • 从最小端口最大端口的所有范围  (默认值:49152 到 65535)。根据 RFC 8656, 这是 Coturn 默认用于 TURN 中继的端口范围。同样,您可以禁用 TCP 或 UDP(例如,使用 no-tcp-relay)。

注意:

Coturn 和 Kurento Media Server 之间的端口范围不需要匹配

如果您恰好在同一台机器上部署 Coturn 和 KMS,我们建议它们的端口范围不要重叠。

  1. 向 Kurento Media Server 和所有 WebRTC 客户端(如 Web 浏览器)提供您的 STUN 或 TURN 服务器设置。查看 STUN/TURN服务器配置了解在 Kurento 中配置此服务器的方法。
  1. 检查您的 Coturn 服务器是否正常工作。为此,请按照下一节中给出的步骤进行操作。

如何测试我的 STUN/TURN 服务器

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

  1. 删除任何可能已默认填写的服务器。
  2. 填写您的 STUN/TURN 服务器详细信息。
  • 仅测试 STUN(不测试 TURN 中继):
stun:<StunServerIp>:<StunServerPort>
  • 要测试 STUN 和 TURN:
turn:<TurnServerIp>:<TurnServerPort>

…并填写 TURN 用户名 和 TURN 密码

  1. 点击 添加服务器。 列表中应该只有一个条目,其中包含您的服务器详细信息。
  1. 单击 “收集候选”。 如果您正在测试 STUN,请验证 您是否获得了 srflx类型的候选 。同样,如果您正在测试 TURN,则应该获得 srflx类型 和中继 类型 的候选。 如果您缺少任何预期的候选类型, 则您的 STUN/TURN 服务器无法正常工作 ,WebRTC 将失败。检查您的服务器配置和云提供商的网络设置。

如何配置 Kurento 媒体服务器

Kurento 中的大多数(但不是全部,见下文)设置都可以在配置文件中静态设置:

  • /etc/kurento/kurento.conf.json

主配置文件。提供 Kurento Media Server 本身行为的设置。

  • /etc/kurento/modules/kurento/MediaElement.conf.ini

所有类型的 MediaElement 的通用参数。

  • /etc/kurento/modules/kurento/SdpEndpoint.conf.ini

SdpEndpoints(即 WebRtcEndpoint 和 RtpEndpoint)的音频/视频参数。

  • /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini

WebRtcEndpoint 的特定参数。

  • /etc/kurento/modules/kurento/HttpEndpoint.conf.ini

HttpEndpoint 的特定参数。

  • /etc/default/kurento-media-server

此文件由系统的服务初始化文件加载。定义一些环境变量,这些变量会影响诸如调试日志记录或崩溃时生成的核心转储文件等功能。

对于配置文件中不能直接使用的其他设置,请务必阅读客户端 API SDK 文档,其中记录了所有公开的方法:

Kurento Docker 镜像还接受一些环境变量,这些变量直接映射到上述文件中的设置。如果这还不够灵活,您可以随时使用 绑定挂载 or  with a 并在 /etc/kurento 中使用不同的配置文件集。有关这些技术的一些提示,请转到 Docker中的Kurento

STUN/TURN服务器

阅读 何时需要STUN and TURN? 了解何时可能需要使用它们,并阅读 STUN/TURN 服务器安装 以获取有关如何安装您自己的 STUN/TURN 服务器的指导。

本地安装

  • 在 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini 中设置值stunServerAddress 和stunServerPort 以使用 STUN 服务器,或设置 turnURL 以使用 TURN 服务器。

Docker

  • 为 STUN 传递环境变量 KMS_STUN_IP 和 KMS_STUN_PORT,或为 TURN 传递环境变量 KMS_TURN_URL。

客户端API

  • Java:为 STUN 设置 setStunServerAddress 和 setStunServerPort,或为 TURN 设置 setTurnUrl。
  • JavaScript:STUN 的 setStunServerAddress 和 setStunServerPort,或 TURN 的 setTurnUrl。
网络接口

指定 KMS 应使用来与其运行环境(物理机、虚拟机、Docker 容器等)进行通信的网络接口名称

本地安装

  • 在 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.in 中设置 networkInterfaces值 。

Docker

  • 传递环境变量 KMS_NETWORK_INTERFACES

客户端API

RTP端口

这两个参数定义了 Kurento Media Server 将绑定(监听)以接收远程 RTP 数据包的最小和最大端口。这会影响 RtpEndpoint 和 WebRtcEndpoint 的操作。

普通 RTP (RtpEndpoint) 需要为每种媒体类型提供 2 个端口:偶数端口用于 RTP,下一个奇数端口用于 RTCP。WebRTC (WebRtcEndpoint) 尽可能使用 RTCP 多路复用 (rtcp-mux),因此它为每种媒体类型仅使用 1 个端口。

本地安装

  • 在 /etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini 中设置值 minPort、maxPort。

Docker

  • 传递环境变量KMS_MIN_PORT、KMS_MAX_PORT。
WebRTC 比特率

WebRtcEndpoint 的默认 MaxVideoSendBandwidth 范围非常保守,导致最大视频质量较低。大多数应用程序可能希望将其增加到更高的值,例如 2000 kbps (2 mbps):  JavaJavaScript.

有几种方法可以覆盖可变比特率和网络带宽估计的默认设置:

高级设置

这些设置仅供高级用户使用,他们知道自己在做什么以及为什么需要这些设置。在大多数情况下,默认值对大多数用户来说已经足够好了。

ICE协议

如果您有一个众所周知的场景,并且您 100% 确定 UDP 可以正常工作,那么禁用 TCP 可以在建立 WebRTC 会话时提供稍快的速度。即,禁用 ICE-TCP 后,加入通话和实际观看视频之间的时间会更短。

当然,如果您不能保证 UDP 在您的网络中可以正常工作,那么 您应该保留此设置(默认设置)。否则,UDP 可能会失败,并且 WebRTC 无法使用 TCP 回退。

本地安装

  • 在 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini 中将 iceTcp 的值设置为 1 (开启) 或 0 (关闭)。

Docker

  • 将环境变量 KMS_ICE_TCP 设置为 1(开启)或 0(关闭)。

客户端API

外部 IP 地址

使用此功能时,所有 Kurento IPv4 和/或 IPv6 ICE 候选都会被修改以包含给定的地址。这可以在外部或公共 IP 已经众所周知的情况下加快 WebRTC 连接的建立速度,同时还有一个好处,即媒体服务器不需要 STUN 。

本地安装

  • 在 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini 中设置值 externalIPv4、externalIPv6。

Docker

  • 传递环境变量 KMS_EXTERNAL_IPV4、KMS_EXTERNAL_IPV6。
  • 如果使用特殊值 auto  ,则容器将通过对一些知名提供商(OpenDNS、Google、Cloudflare)执行 DNS 查询来自动发现其自己的公共 IP 地址。您可以在此处查看脚本:  getmyip.sh. 如果无法访问这些服务,则外部 IP 参数将保持未设置状态。

客户端 API

最大传输单元

MTU 是出站数据包大小的硬性限制。对于某些用户来说,降低数据包大小以防止碎片化非常重要。

对于绝大多数用例来说,最好使用默认 MTU 值 1200 字节,这也是大多数流行的 WebRTC 实现中的默认值 (请参阅浏览器 MTU).

本地安装

  • 在 /etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini 中设置 mtu 值。

Docker

  • 传递环境变量 KMS_MTU。

客户端 API

WebRTC DTLS 证书

默认情况下,Kurento 为每个 WebRtcEndpoint 使用不同的自签名证书(请参阅 媒体平面安全性 (DTLS))。如果您想要或需要对每个端点使用相同的证书,请首先使用以下命令加入您的证书(链)文件和私钥:

# 制作一个与 Kurento Media Server 一起使用的单个文件。
cat cert.pem key.pem >cert+key.pem

然后,配置cert+key.pem的路径:

本地安装

  • 使用 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini 中的证书文件路径设置 pemCertificateRSA 或 pemCertificateECDSA。

Docker

  • 将环境变量 KMS_PEM_CERTIFICATE_RSA 或 KMS_PEM_CERTIFICATE_ECDSA 与容器内的路径一起传递 。另外,确保文件确实位于该路径中;通常,您可以使用绑定挂载、Docker 卷或自定义 Docker 镜像来执行此操作。有关更多信息和示例,请查看 Docker 中的Kurento.