webrtc的coturn服务搭建

前情回顾

前面我们已经将聊天的基本功能完成了,接下来来安装coturn服务,生成webrtc视频通信

coturn服务集成了stun和turn服务器


三个常用的概念

STUN = 告诉你自己是谁
TURN = 帮你转发数据
coturn = STUN/TURN 的服务器实现软件


image-20260212125500580

为什么需要 STUN / TURN?

因为现在大部分设备都在 NAT(内网)后面

  1. 手机/电脑 路由器(NAT) 公网

内网 IP(192.168.x.x)在公网是看不到的。

WebRTC / 视频通话 / P2P 通信 就必须解决:

👉 “我怎么让对方知道我的公网地址?”


STUN 是什么?

全称:

Session Traversal Utilities for NAT

作用:

👉 告诉客户端:你的公网 IP 和端口是多少

工作流程:

  1. 客户端 STUN服务器
  2. STUN服务器 告诉你:你在公网看到的地址是 1.2.3.4:5678

然后客户端把这个地址发给对方。


✅ 优点

  • 轻量
  • 免费
  • 不转发数据

❌ 缺点

  • 只能在 NAT 允许打洞的情况下成功
  • 对称 NAT 基本失败

TURN 是什么?

全称:

Traversal Using Relays around NAT

作用:

👉 当打洞失败时,帮你转发数据

工作模式:

  1. A TURN服务器 B

TURN 服务器相当于一个“中转站”。


✅ 优点

  • 几乎 100% 成功
  • 解决所有 NAT 问题

❌ 缺点

  • 服务器要承担带宽
  • 成本高

coturn 是什么?

👉 coturn 是一个 开源的 STUN + TURN 服务器软件

官网:
https://github.com/coturn/coturn

你部署 coturn 之后:

  • 可以当 STUN 服务器
  • 也可以当 TURN 服务器

三者关系图

  1. WebRTC 通信
  2. ┌───────────┴───────────┐
  3. 先尝试 STUN 如果失败 TURN
  4. 直接P2P通信 通过服务器转发
  5. coturn
  6. (实现STUNTURN的程序)

安装coturn

因为docker被限制,自己尝试安装了docker拉取coturn服务还是超时,所以果断选择本机安装。

本机安装有两种方式,一种源码方式,一种集成服务安装。

官方推荐集成服务安装,源码安装是为了制作自己的webrtc服务,修改源码才用到,这里我们不用。

  1. # 更新软件包
  2. sudo apt update
  3. # 安装 Coturn
  4. sudo apt install coturn -y
  5. # 查看版本
  6. turnserver --help | head -1

修改配置文件

先备份原来的配置文件

  1. sudo cp /etc/turnserver.conf /etc/turnserver.conf.bak

再修改配置文件

  1. sudo vim /etc/turnserver.conf

改为如下内容

  1. # 监听端口
  2. listening-ip = 0.0.0.0
  3. listening-port=3478
  4. tls-listening-port=5349
  5. # 外部 IP
  6. external-ip=81.68.86.146
  7. #relay-ip=81.68.86.146
  8. # 启用指纹
  9. fingerprint
  10. # 使用长期凭证机制
  11. lt-cred-mech
  12. # 用户认证
  13. user=webrtc:Kx9mP2qL8rY5tZ
  14. # Realm
  15. realm=turn.example.com
  16. # 日志
  17. log-file=/var/log/turnserver/turnserver.log
  18. verbose
  19. # 端口范围
  20. min-port=49152
  21. max-port=65535
  22. # 拒绝私有 IP
  23. no-multicast-peers
  24. denied-peer-ip=0.0.0.0-0.255.255.255
  25. denied-peer-ip=10.0.0.0-10.255.255.255
  26. denied-peer-ip=172.16.0.0-172.31.255.255
  27. denied-peer-ip=192.168.0.0-192.168.255.255

创建日志目录

  1. # 创建日志目录
  2. sudo mkdir -p /var/log/turnserver
  3. # 设置权限
  4. sudo chown turnserver:turnserver /var/log/turnserver

验证服务

  1. # 查看端口监听
  2. sudo netstat -tuln | grep 3478
  3. # 查看日志
  4. sudo tail -f /var/log/turnserver/turnserver.log
  5. # 或者
  6. sudo journalctl -u coturn -f

启用并启动服务

  1. # 启用 Coturn 服务
  2. sudo sed -i 's/#TURNSERVER_ENABLED=1/TURNSERVER_ENABLED=1/' /etc/default/coturn
  3. # 启动服务
  4. sudo systemctl enable coturn
  5. sudo systemctl start coturn
  6. # 查看状态
  7. sudo systemctl status coturn

如果出错,可以手动编辑设置启动 Coturn 服务

  1. # 编辑配置文件
  2. sudo vim /etc/default/coturn

找到这一行:

  1. #TURNSERVER_ENABLED=1

去掉注释符号 #,改为:

  1. TURNSERVER_ENABLED=1

保存并且退出

常用管理命令

  1. # 启动服务
  2. sudo systemctl start coturn
  3. # 停止服务
  4. sudo systemctl stop coturn
  5. # 重启服务
  6. sudo systemctl restart coturn
  7. # 查看状态
  8. sudo systemctl status coturn
  9. # 查看日志
  10. sudo journalctl -u coturn -n 100 -f
  11. # 查看配置文件
  12. sudo cat /etc/turnserver.conf

云服务器开启端口

必须开放的端口:

  • 3478 (UDP + TCP) - STUN/TURN 主端口
  • 49152-65535 (UDP) - TURN 数据中继端口范围

可选端口(如果使用 TLS):

  • 5349 (UDP + TCP) - TURN over TLS

腾讯云安全组配置步骤

1. 登录腾讯云控制台

访问:https://console.cloud.tencent.com/cvm/instance

2. 配置安全组

  1. 控制台 云服务器 实例列表 找到你的服务器 安全组 修改规则

3. 添加入站规则

类型 端口范围 协议 来源 策略
自定义 3478 UDP 0.0.0.0/0 允许
自定义 3478 TCP 0.0.0.0/0 允许
自定义 49152-65535 UDP 0.0.0.0/0 允许
自定义 5349 UDP 0.0.0.0/0 允许
自定义 5349 TCP 0.0.0.0/0 允许

image-20260211135234856

快速验证端口是否开放

在你的服务器上执行:

  1. # 查看 Coturn 是否监听端口
  2. sudo netstat -tuln | grep -E '3478|5349'
  3. # 应该看到类似输出:
  4. # udp 0 0 0.0.0.0:3478 0.0.0.0:*
  5. # tcp 0 0 0.0.0.0:3478 0.0.0.0:*

从外部测试(在你的本地电脑上):

  1. # 测试 UDP 端口(需要安装 nc)
  2. nc -u -v 81.68.86.146 3478
  3. # 测试 TCP 端口
  4. nc -v 81.68.86.146 3478

测试 TURN 服务

访问测试页面:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

填入:

  • TURN URI: turn:81.68.86.146:3478
  • Username: webrtc
  • Password: Kx9mP2qL8rY5tZ

点击 Gather candidates,如果看到 relay 类型的候选者,说明成功!

先添加,然后点击add server

image-20260211132631986

然后点击下方

image-20260211133328948


如果需要修改配置

  1. # 编辑配置文件
  2. sudo vim /etc/turnserver.conf
  3. # 保存后重启服务
  4. sudo systemctl restart coturn
  5. # 查看日志确认
  6. sudo journalctl -u coturn -f
热门评论

热门文章

  1. vscode搭建windows C++开发环境

    喜欢(596) 浏览(102638)
  2. 使用hexo搭建个人博客

    喜欢(533) 浏览(14716)
  3. Linux环境搭建和编码

    喜欢(594) 浏览(16370)
  4. MarkDown在线编辑器

    喜欢(514) 浏览(16776)
  5. 聊天项目(28) 分布式服务通知好友申请

    喜欢(507) 浏览(7564)

最新评论

  1. 解决博客回复区被脚本注入的问题 secondtonone1:走到现在我忽然明白一个道理,无论工作也好生活也罢,最重要的是开心,即使一份安稳的工作不能给我带来事业上的积累也要合理的舍弃,所以我还是想去做喜欢的方向。
  2. 处理网络粘包问题 zyouth: //消息的长度小于头部规定的长度,说明数据未收全,则先将部分消息放到接收节点里 if (bytes_transferred < data_len) { memcpy(_recv_msg_node->_data + _recv_msg_node->_cur_len, _data + copy_len, bytes_transferred); _recv_msg_node->_cur_len += bytes_transferred; ::memset(_data, 0, MAX_LENGTH); _socket.async_read_some(boost::asio::buffer(_data, MAX_LENGTH), std::bind(&CSession::HandleRead, this, std::placeholders::_1, std::placeholders::_2, shared_self)); //头部处理完成 _b_head_parse = true; return; } 把_b_head_parse = true;放在_socket.async_read_some前面是不是更好
  3. C++ 线程池原理和实现 mzx2023:两种方法解决,一种是改排序算法,就是当线程耗尽的时候,使用普通递归,另一种是当在线程池commit的时候,判断线程是否耗尽,耗尽的话就直接当前线程执行task
  4. 利用指针和容器实现文本查询 越今朝:应该添加一个过滤功能以解决部分单词无法被查询的问题: eg: "I am a teacher."中的teacher无法被查询,因为在示例代码中teacher.被解释为一个单词从而忽略了teacher本身。
  5. 无锁并发队列 TenThousandOne:_head  和 _tail  替换为原子变量。那里pop的逻辑,val = _data[h] 可以移到循环外面吗

个人公众号

个人微信