如果您使用的是我们的托管服务,这些设置已在您的站点上预先配置好。本指南面向自行托管 Discourse 的管理员。
Discourse Live 使用 WebRTC 进行语音和视频通话。它自带公共 STUN 服务器,以帮助参与者建立直接连接。管理员可以替换这些服务器并添加 TURN,以支持那些无法建立直接连接的网络。
对于专为您社区使用的服务器,我们建议运行 coturn 作为您的 STUN 和 TURN 服务器,并使用共享密钥身份验证用于 TURN。 这提供了公共地址发现和中继回退功能,而无需分发永久的 TURN 密码或依赖第三方 STUN 服务器。
本指南适用于 Live 的点对点通话。使用 LiveKit 的房间则使用 LiveKit 自己的 ICE/TURN 配置。了解有关 Live 的 LiveKit 配置。
STUN 和 TURN 的作用是什么?
- STUN 帮助浏览器发现其公共 IP 地址和端口,以便尝试建立直接连接。
- TURN 在无法建立直接连接时中继媒体流量。
获知其公共地址的浏览器可以将其作为 server-reflexive (srflx) 候选地址 提供,这使得通过家庭和办公 NAT 的直接连接成为可能。如果没有候选地址,大多数通话将回退到 TURN 中继,从而增加延迟和中继带宽。
即使您运行 TURN,STUN 也必须保持开放。 TURN 分配响应中也包含浏览器的公共地址,但只有部分浏览器(如 Firefox)将其用作候选地址。基于 Chromium 的浏览器和 Safari 仅通过单独的 STUN Binding 请求获知其公共地址,且浏览器不会在 Binding 请求中附加凭据。如果服务器禁用 STUN(no-stun)或要求对其身份验证(secure-stun),这些浏览器将无法获得 srflx 候选地址,导致它们加入的所有通话都通过中继。
配置共享密钥 TURN 后,Live 允许直接连接和中继连接。配置 TURN 并不会强制所有通话都通过中继。 Live 的 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
# 不要添加 no-stun 或 secure-stun:浏览器发送不带凭据的 STUN Binding 请求,
# 许多浏览器依赖这些请求来发现其公共地址。
min-port=49152
max-port=65535
no-multicast-peers
# 此示例开始时未启用 TLS。
no-tls
no-dtls
替换主机名和密钥,保护配置文件,并重启 coturn。移除任何冲突的 no-auth 或静态 user= 配置。Coturn 的共享密钥模式会在内部启用所需的身份验证机制。Coturn 配置参考。
匿名 STUN 仅向客户端报告其自身的地址;它无法中继流量,因此不会使您的服务器变成开放中继。最近版本的 coturn 默认关闭可选的 RFC 5780 和 MAPPED-ADDRESS 响应属性,这使 Binding 响应接近请求大小,并限制了其用于反射攻击的实用性。请保持 rfc5780 和 stun-backward-compatibility 处于禁用状态。
允许入站流量通过:
| 端口 | 协议 | 用途 |
|---|---|---|
3478 |
UDP | STUN 和 TURN |
3478 |
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
在 管理员 → 设置 中,搜索这些 Live 设置:
| 设置 | 值 |
|---|---|
live_stun_servers |
您的 coturn 服务器的 STUN URI — 替换默认条目 |
live_turn_secret |
用于 coturn 的 static-auth-secret 的值 |
live_turn_secret_servers |
您的 TURN URI,用 | 分隔 |
live_turn_servers |
空 |
live_turn_username |
空 |
live_turn_credential |
空 |
对于上述配置,在 live_stun_servers 中输入以下内容:
stun:turn.example.com:3478
并在 live_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
使用 stun:、turn: 和 turns: URI,不带 //。仅列出您的服务器实际支持的端点。
基于 Chromium 的浏览器也会向您列出的 TURN 服务器发送 STUN 请求,因此只要 coturn 应答匿名 STUN,空的 live_stun_servers 也可以工作。显式列出 STUN URI 使设置更清晰,涵盖其他浏览器,并允许 Live 的连接诊断独立测试它。
live_turn_secret_servers 列表使用从共享密钥生成的凭据。单独的 live_turn_servers 列表使用固定的用户名和密码。Live 设置定义。
保存设置,然后让参与者退出并重新加入通话以获取新配置。
3. 验证设置
测试来自不同网络的两个参与者,例如家庭宽带和移动数据,并在多个浏览器中测试 — 至少一个基于 Chromium 的浏览器和 Firefox。确认双向音频正常工作,然后测试视频和屏幕共享。
在点对点房间内,打开房间的 ⋮ 菜单并选择连接诊断:
- 在 STUN/TURN 服务器 下,每个服务器应显示 可达。TURN 服务器应列出 中继地址,UDP 服务器应列出 公共地址。“公共地址:无”表示 STUN 请求未得到应答 — 请检查
no-stun/secure-stun以及3478/UDP是否开放。 - 在 对等方 下,路由显示每个连接如何传输媒体:直接(同一网络)、直接(通过 STUN 穿越 NAT) 或 通过 TURN 中继。大多数普通家庭网络中的参与者应直接连接。
- 复制报告 生成一份文本报告,您可以与 troubleshooting 人员分享。该报告包含参与者的 IP 地址,请私下分享。
在 Chromium 浏览器中,chrome://webrtc-internals 以更低级别显示相同细节:
srflx候选地址代表已发现的公共地址。relay候选地址代表可用的 TURN 中继。- 选定的候选地址对显示实际传输媒体的连接。
成功的直接通话并不能证明中继功能正常。 还请从需要 TURN 的网络进行测试,或使用具有 iceTransportPolicy: "relay" 和临时凭据的 WebRTC 测试客户端。
检查 coturn 日志中的成功已验证分配。无效凭据的请求不得获得中继分配。初始的 401 身份验证质询是正常的;重复的身份验证失败需要调查。
保持服务器专用于您的社区
共享密钥保留在 Discourse 和 TURN 服务器上。参与者接收临时凭据。Live 目前生成有效期为 12 小时的凭据以创建分配;已建立的分配可以在刷新时继续。Live 的凭据生成。
这防止了匿名开放中继,但 TURN 凭据不与浏览器来源绑定:参与者可以复制并重复使用其临时凭据。为了限制滥用:
- 将 Live 访问限制在预期组内。
- 监控中继带宽和分配计数。
- 设置适合您社区的 coturn 分配配额和带宽限制。
- 阻止从中继访问从 TURN 主机可达的私有、链路本地和其他内部目标。
- 保持 coturn 更新,如果共享密钥泄露,请轮换它。
为此 Discourse 部署使用专用密钥。您的服务器还将应答来自任何人的匿名 STUN 请求;这是预期的,使用很少带宽,且不授予中继访问权限。Coturn 身份验证和访问控制。
替代方案
仅替换公共 STUN 服务器
将 live_stun_servers 设置为您自己的 STUN URI,用 | 分隔:
stun:stun.example.com:3478
如果您不需要中继,请保持 TURN 设置为空。仅 STUN 无法在所有网络上使通话工作。
使用固定用户名和密码的 TURN
如果您的提供商不支持共享密钥身份验证,请配置 live_turn_servers、live_turn_username 和 live_turn_credential。保持共享密钥设置为空。
参与者接收这些固定凭据,这使得它们更容易在您站点之外重复使用。此外,当配置了静态 TURN 服务器且 STUN 列表为空时,Live 目前会强制中继连接。如果您的提供商支持,请优先使用共享密钥身份验证。Live 的 ICE 配置。