为 Discourse Voice 配置自定义 STUN 和 TURN 服务器

:warning: 如果您由我们托管,您的站点已经预先配置好此功能。本指南适用于自行托管 Discourse 的管理员。

Discourse Voice 使用 WebRTC 进行语音和视频通话。它自带公共 STUN 服务器,以帮助参与者建立直接连接。管理员可以替换这些服务器并添加 TURN,以支持在直接连接失败的网络环境。

对于专属于您社区的服务器,我们推荐使用带有共享密钥(shared-secret)认证的 TURN,并将 STUN 设置留空。 这可以提供公共地址发现和中继回退功能,而无需分发永久的 TURN 密码。

本指南适用于 Voice 的点对点通话。使用 LiveKit 的房间将使用 LiveKit 自己的 ICE/TURN 配置。了解 Voice 的 LiveKit 配置。

STUN 和 TURN 的作用是什么?

  • STUN 帮助浏览器发现其公共 IP 地址和端口,以便尝试建立直接连接。
  • TURN 在无法建立直接连接时中继媒体数据。

经过身份验证的 TURN 分配也会返回浏览器的公共地址。WebRTC 可以将此用作服务器反射候选(server-reflexive candidate),从而在不使用单独的 STUN 服务器的情况下提供 STUN 的地址发现优势。TURN 规范。

配置了共享密钥 TURN 后,即使 STUN 设置为空,Voice 也允许直接连接和中继连接。仅配置 TURN 服务器并不会强制所有通话都通过中继进行。 Voice 的 ICE 配置。

1. 准备 TURN 服务器

您可以使用支持 TURN REST API 共享密钥认证 的托管 TURN 服务,或者自行运行 coturn。

对于自行托管的设置,请准备:

  • 一台具有公共 IP 地址且带宽足以支持中继通话的服务器。
  • 一个直接指向该服务器的主机名,例如 turn.example.com。
  • 防火墙允许其 TURN 监听端口和 UDP 中继端口范围访问。
  • 如果通过 TLS 提供 TURN,则需要有效的证书。

参与者的浏览器将直接连接到 TURN。普通的 HTTP 反向代理或 CDN 代理无法承载 TURN 流量。

coturn 配置示例

生成一个随机密钥:

openssl rand -hex 32

请妥善保管此结果。您将在 coturn 和 Discourse 中输入相同的值。

在具有直接分配的公共 IP 的服务器上,使用以下内容作为 /etc/turnserver.conf 的起点:

listening-port=3478

fingerprint
realm=turn.example.com

use-auth-secret
static-auth-secret=REPLACE_WITH_YOUR_RANDOM_SECRET

# 禁用独立的 STUN 请求。
# 经过身份验证的 TURN 分配仍会返回客户端的公共地址。
no-stun

min-port=49152
max-port=65535

no-multicast-peers

# 此示例未启用 TLS。
no-tls
no-dtls

替换主机名和密钥,保护配置文件,并重启 coturn。删除任何冲突的 no-auth 或静态 user= 配置。Coturn 的共享密钥模式会启用其内部所需的认证机制。Coturn 配置参考。

允许入站流量访问:

端口 协议 用途
3478 UDP 和 TCP 浏览器连接到 TURN
49152–65535 UDP 中继媒体

也允许相应的出站流量。中继范围必须与 min-port 和 max-port 匹配。

如果服务器位于 NAT 之后,请配置 coturn 的 external-ip=PUBLIC_IP/PRIVATE_IP 映射并转发监听端口和中继端口。中继端口在通过 NAT 时必须保留其端口号。Coturn 部署选项。

为受限网络添加 TLS

通过 TLS 提供 TURN 为那些网络阻止 UDP 的参与者提供了另一种连接选项。

移除 no-tls 并配置:

tls-listening-port=5349
cert=/path/to/fullchain.pem
pkey=/path/to/privkey.pem

打开 5349/TCP,确保 coturn 可以读取证书和密钥,并在证书续期后重启它。

如果 TURN 服务器上的 443/TCP 端口可用,您也可以使用它。这可能在受限网络上有所帮助,尽管一些网络也会检查并阻止 443 端口上的非 HTTP 流量。当浏览器通过 TCP 或 TLS 连接到 TURN 时,仍然需要 UDP 中继范围。Coturn 服务器文档。

2. 配置 Discourse

在 管理员 → 设置 中,搜索以下 Voice 设置:

设置 值
voice_stun_servers 空 — 移除默认条目
voice_turn_secret 用于 coturn 的 static-auth-secret 的值
voice_turn_secret_servers 您的 TURN URI,用 | 分隔
voice_turn_servers 空
voice_turn_username 空
voice_turn_credential 空

对于上述配置,在 voice_turn_secret_servers 中输入:

turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp

如果您启用了 TLS,请添加其端点:

turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp|turns:turn.example.com:5349?transport=tcp

使用 turn: 和 turns: URI,不要包含 //。仅列出您的服务器实际支持的端点。

voice_turn_secret_servers 列表使用从共享密钥生成的凭据。单独的 voice_turn_servers 列表使用固定的用户名和密码。Voice 设置定义。

保存设置后,让参与者退出并重新加入通话以获取新配置。

3. 验证设置

使用两个位于不同网络的参与者进行测试,例如家庭宽带和移动数据。确认双向音频正常工作,然后测试视频和屏幕共享。

在 Chromium 浏览器中,加入前打开 chrome://webrtc-internals:

  • srflx 候选代表发现的公共地址。

  • relay 候选代表可用的 TURN 中继。

  • 选定的候选对显示实际承载媒体的连接。

成功的直接通话并不能证明中继功能正常工作。 还请从需要 TURN 的网络进行测试,或使用具有 iceTransportPolicy: "relay" 和临时凭据的 WebRTC 测试客户端。

检查 coturn 的日志以确认成功的经过身份验证的分配。没有有效凭据的请求不应获得中继分配。初始的 401 身份验证挑战是正常的;反复的身份验证失败需要调查。

保持服务器专用于您的社区

共享密钥保留在 Discourse 和 TURN 服务器上。参与者收到的是临时凭据。Voice 目前生成有效期为 12 小时的凭据,用于创建分配;已建立的分配在刷新期间可以继续。Voice 的凭据生成。

这可以防止出现匿名的开放中继,但 TURN 凭据并未绑定到浏览器源:参与者可以复制并重新使用其临时凭据。为了限制滥用:

  • 将 Voice 访问权限限制在预期的组。
  • 监控中继带宽和分配数量。
  • 为 coturn 设置适合您社区的分配配额和带宽限制。
  • 阻止从 TURN 主机可访问的私有、链路本地和其他内部目标的中继访问。
  • 保持 coturn 更新,如果共享密钥泄露则进行轮换。

为此 Discourse 部署使用专用的密钥。启用 no-stun 后,服务器还将停止提供匿名的独立 STUN 服务。Coturn 认证和访问控制。

替代方案

仅替换公共 STUN 服务器

将 voice_stun_servers 设置为您自己的 STUN URI,用 | 分隔:

stun:stun.example.com:3478

如果不需要中继,请将 TURN 设置留空。仅使用 STUN 无法使通话在所有网络上正常工作。配置了 no-stun 的 coturn 服务器无法提供此端点。

使用固定用户名和密码的 TURN

如果您的提供商不支持共享密钥认证,请配置 voice_turn_servers、voice_turn_username 和 voice_turn_credential。将共享密钥设置留空。

参与者将收到这些固定凭据,这使得它们更容易在您的站点之外被重新使用。此外,当配置了静态 TURN 服务器且 STUN 列表为空时,Voice 目前会强制使用中继连接。如果您的提供商支持,请优先使用共享密钥认证。Voice 的 ICE 配置。

2 个赞