如果您由我们托管,您的站点已经预先配置好此功能。本指南适用于自行托管 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 配置。