coturn 是开源、轻量、高性能的 TURN/STUN 服务器,支持 UDP/TCP 中继,完美适配 4G 网络下 RV1106 的 WebRTC NAT 穿透需求(解决对称型 NAT 无法直连问题)。以下是 从服务器部署到 RV1106 配置 的全流程,包含实战踩坑指南:
一、准备工作
1. 服务器要求
- 硬件:云服务器(如阿里云 ECS、腾讯云 CVM),最低配置 1 核 1G(支持 10-20 路 720P 视频流中继)。
- 网络:必须有 公网 IP(如 123.45.67.89),开放端口:
- UDP/TCP 3478(coturn 默认端口)
- UDP 49152-65535(中继端口范围,用于转发视频流)
- 系统:Ubuntu 18.04/20.04(推荐,兼容性最好)。
2. 本地工具(可选)
- 用于测试 TURN 服务器:
turnutils(coturn 自带)、stunclient。
二、coturn 服务器部署(Ubuntu 系统)
步骤 1:安装 coturn
通过 apt 直接安装(推荐,版本稳定):
bash
# 更新源
sudo apt update && sudo apt upgrade -y
# 安装 coturn
sudo apt install coturn -y
# 验证安装(查看版本)
turnserver --version
# 输出示例:turnserver 4.5.1.1 (Ubuntu),说明安装成功
步骤 2:配置 coturn(核心)
coturn 配置文件路径:/etc/turnserver.conf(默认可能为空,需手动编辑)。
1. 基础配置(必选)
bash
# 编辑配置文件
sudo vim /etc/turnserver.conf
粘贴以下配置(根据实际环境修改标注 [ ] 的内容):
ini
# 1. 监听地址与端口
listening-ip=0.0.0.0 # 监听所有网卡(支持 IPv4)
listening-port=3478 # 默认 TURN/STUN 端口
tls-listening-port=5349 # TLS 端口(可选,用于加密传输)
# 2. 中继地址(关键!填服务器内网 IP,如阿里云 ECS 内网 IP 172.17.0.2)
relay-ip=[服务器内网 IP]
# 若服务器有多个网卡,可指定绑定的公网 IP(可选)
external-ip=[服务器公网 IP]/[服务器内网 IP] # 格式:公网IP/内网IP
# 3. 认证配置(RV1106 和客户端需用此账号密码连接)
user=rv1106:123456 # 账号:rv1106,密码:123456(可自定义,建议复杂密码)
realm=turn.rv1106.com # 域名(任意填写,需与客户端配置一致)
lt-cred-mech # 启用长期凭证机制(必须开启,否则认证失败)
fingerprint # 启用 DTLS 指纹验证(提高安全性)
# 4. 中继端口范围(用于转发视频流,建议保留默认)
min-port=49152
max-port=65535
# 5. 日志配置(便于调试)
log-file=/var/log/turnserver.log # 日志保存路径
verbose # 启用详细日志(调试时开启,生产环境可关闭)
# 6. 权限控制(可选,限制仅指定 IP 访问)
# allow=192.168.0.0/24 # 允许内网 IP 段访问
# deny=0.0.0.0/0 # 拒绝其他所有 IP(需放在 allow 后面)
2. 配置说明
- relay-ip:必须填服务器内网 IP(通过
ifconfig或ip addr查看,如eth0网卡的inet地址),否则中继失败。 - external-ip:格式为
公网IP/内网IP,用于告诉 coturn 对外暴露的公网地址(4G 设备需通过公网 IP 访问 TURN 服务器)。 - user:认证账号密码,RV1106 的 libdatachannel 和浏览器客户端必须配置相同的账号密码,否则无法连接。
步骤 3:启动 coturn 服务
bash
# 启动服务
sudo systemctl start coturn
# 设置开机自启(避免服务器重启后失效)
sudo systemctl enable coturn
# 查看服务状态(验证是否启动成功)
sudo systemctl status coturn
- 成功状态:
active (running),说明服务正常运行。 - 失败排查:若启动失败,查看日志
cat /var/log/turnserver.log,根据错误信息修改配置(如端口被占用、IP 填写错误)。
步骤 4:开放服务器端口(关键!)
云服务器需在 安全组 中开放以下端口(以阿里云为例):
- 登录阿里云控制台 → 云服务器 ECS → 安全组 → 配置规则。
- 入方向添加规则:
- 端口范围:3478/3478,协议:UDP/TCP,授权对象:0.0.0.0/0(允许所有 IP 访问)。
- 端口范围:49152/65535,协议:UDP,授权对象:0.0.0.0/0。
- 保存规则(其他云厂商操作类似,如腾讯云、华为云)。
本地服务器(如局域网):需关闭防火墙或开放端口:
bash
# 关闭 Ubuntu 防火墙(临时测试用)
sudo ufw disable
# 或开放指定端口(推荐)
sudo ufw allow 3478/udp
sudo ufw allow 3478/tcp
sudo ufw allow 49152:65535/udp
三、测试 TURN 服务器可用性
方法 1:使用 coturn 自带工具 turnutils
在服务器本地执行以下命令,测试 TURN 中继是否正常:
bash
# 测试 UDP 中继(替换为自己的配置)
turnutils_uclient -u rv1106 -w 123456 [服务器公网 IP] 3478
成功输出示例:
plaintext
0: IPv4. Connected to server [123.45.67.89]:3478
0: STUN Binding Request sent to [123.45.67.89]:3478
0: STUN Binding Response received
0: Local address: [服务器内网 IP]:53210
0: Mapped address: [服务器公网 IP]:53210
0: Relay address: [服务器公网 IP]:49152 # 中继地址生成成功
0: Test succeeded
- 出现
Relay address和Test succeeded,说明 TURN 服务器正常。
方法 2:测试 STUN 功能(可选)
coturn 同时支持 STUN 服务,可测试是否能获取公网地址:
bash
# 安装 stunclient 工具
sudo apt install stun -y
# 测试 STUN(替换为自己的公网 IP)
stun [服务器公网 IP]:3478
成功输出示例:
plaintext
STUN client version 0.97
Primary: Nested STUN server
Return value is 0
XOR-Mapped-Address: [服务器公网 IP]:54321 # 成功返回公网 IP:端口
四、RV1106 端配置(对接 coturn 服务器)
在 RV1106 的 libdatachannel 代码中,配置 TURN 服务器信息,替代之前的公共 TURN 服务。
核心代码修改(WebRTC 初始化部分)
cpp
运行
#include <rtc/rtc.hpp>
// 初始化 WebRTC 配置(STUN + 自建 TURN)
void initWebRTC() {
rtc::Configuration config;
config.iceServers = {
// 1. STUN 服务器(优先尝试直连,可用自建 coturn 的 STUN 功能)
"stun:[服务器公网 IP]:3478", // 如 "stun:123.45.67.89:3478"
// 2. 自建 TURN 服务器(格式:turn:公网IP:端口?username=账号&password=密码)
"turn:[服务器公网 IP]:3478?username=rv1106&password=123456"
};
// 限制传输方式为 UDP(实时性更好,4G 网络推荐)
config.iceTransports = rtc::IceTransportPolicy::All;
// 创建 PeerConnection 实例
peerConnection = rtc::make_unique<rtc::PeerConnection>(config);
// 后续逻辑(创建视频轨道、SDP 协商等)...
}
关键说明
- TURN 地址格式必须严格遵循:
turn:公网IP:端口?username=账号&password=密码,与 coturn 配置的user一致。 - 优先使用自建 coturn 的 STUN 功能(
stun:公网IP:3478),比公共 STUN 服务器延迟更低、更稳定。
五、浏览器客户端配置(对接 coturn)
在浏览器的 WebRTC 代码中,同步配置自建 TURN 服务器,确保 ICE 协商一致:
javascript
运行
// 浏览器端 JS 代码
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:123.45.67.89:3478" }, // 自建 STUN
{
urls: "turn:123.45.67.89:3478", // 自建 TURN
username: "rv1106", // 与 coturn 配置一致
credential: "123456" // 与 coturn 配置一致
}
]
});
// 后续逻辑(接收视频流、播放等)...
六、常见问题排查(实战踩坑)
1. TURN 中继失败(RV1106 无法连接 TURN 服务器)
- 排查步骤:
- 查看 coturn 日志:
cat /var/log/turnserver.log,搜索error或reject。 - 检查服务器安全组端口是否开放(重点:3478 UDP/TCP、49152-65535 UDP)。
- 验证 TURN 账号密码是否正确(coturn 配置的
user与 RV1106 代码必须一致)。
- 查看 coturn 日志:
- 常见错误:
ERROR: Cannot find relay address:未配置relay-ip或填写错误(需填服务器内网 IP)。ERROR: Auth failed:账号密码错误,或未开启lt-cred-mech配置。
2. 视频卡顿、延迟高
- 优化方案:
- 降低 RV1106 视频码率(如 500kbps~1Mbps,H.264 编码),避免带宽溢出。
- TURN 服务器就近部署(如客户端在国内,选择阿里云上海 / 广州节点)。
- 关闭 coturn 日志的
verbose模式(减少服务器 CPU 占用)。
3. 4G 网络下 TURN 连接不稳定
- 解决方案:
- 在 RV1106 代码中启用 ICE 续活:
peerConnection->setKeepAliveInterval(30);(30 秒发送一次心跳,维持 NAT 映射)。 - 配置 coturn 超时时间(在
turnserver.conf中添加user-quota-timeout=3600,用户无活动 1 小时后释放资源)。
- 在 RV1106 代码中启用 ICE 续活:
七、coturn 进阶配置(可选)
1. 配置多个认证账号
在 turnserver.conf 中添加多个 user 条目,支持多设备同时连接:
ini
user=rv1106_1:123456
user=rv1106_2:654321
2. 启用 TLS 加密传输(提高安全性)
- 申请 SSL 证书(如 Let's Encrypt 免费证书)。
- 在
turnserver.conf中添加:
ini
cert=/etc/letsencrypt/live/turn.rv1106.com/cert.pem # 证书路径
pkey=/etc/letsencrypt/live/turn.rv1106.com/privkey.pem # 私钥路径
- RV1106 端 TURN 地址改为:
turns:公网IP:5349?username=rv1106&password=123456(turns表示 TLS 加密)。
3. 限制并发连接数(防止滥用)
在 turnserver.conf 中添加:
ini
max-bps=10240000 # 服务器总带宽限制(10Mbps)
per-user-bps=1024000 # 单用户带宽限制(1Mbps)
max-users=20 # 最大并发用户数(20 路)
总结
自建 coturn 服务器是解决 RV1106 4G 网络 WebRTC NAT 穿透的可靠方案,核心步骤:
- 云服务器部署 coturn,配置公网 IP、认证账号、开放端口。
- 测试 TURN 中继功能,确保
turnutils_uclient测试成功。 - 在 RV1106 和浏览器客户端中配置 TURN 服务器信息。
- 优化超时时间和带宽限制,提升稳定性。
通过以上配置,可实现 4G 对称型 NAT 环境下 99% 以上的连接成功率,延迟控制在 300ms 以内,满足嵌入式实时视频传输需求。
1390

被折叠的 条评论
为什么被折叠?



