webrtc入门系列(三)云服务器coturn环境搭建

news2025/1/13 10:08:12

《webrtc入门系列(一)easy_webrtc_server 入门环境搭建》
《webrtc入门系列(二)easy_webrtc_server 入门example测试》
《webrtc入门系列(三)云服务器coturn环境搭建》
《webrtc入门系列(四) zlmediakit webrtc sdp交互详细解读》


一、背景

这几天零碎的搜索,已经大概摸清楚了ipc想要接入webrtc的一些流程,其中打洞服务器必不可少,我们选择coturn来做为服务器。
好早就想云服务器切换成Ubuntu,乘机一起迁移切换了系统,忙了一个周末,还触发了腾讯云的bug,补偿了50代金券。

安装coturn环境,搜索一搜一大把,但没有谁的例子是完整可用的,最后还是相信了默认配置文件的注释、turnserver命令注释,逐个修改可疑配置的定义,再结合网友的各种教程,配合一个正常的coturn服务器对比,开了三个浏览器edge、Firefox、chrom,一共六个窗口,把可疑配置项逐一增删,最后完成部署。

二、环境

云服务器:Ubuntu 20.04
toturn版本:Ubuntu 20.04源默认版本
公网IP:106.66.66.66
内网IP: 172.16.0.13

暂时不配置域名和证书,不用加密认证。

三、安装和配置

//更新源
sudo apt-get update
//安装coturn服务器
sudo apt-get install coturn

然后,安装就完成了,结束?
这么简单就不会水一篇博客了。
继续
全部配置如下:

//默认监听端口
listening-port=3478

//默认监听IP
listening-ip=172.16.0.13

//公网IP
external-ip=106.66.66.66

//通信端口范围
min-port=49152
max-port=65535

//增加安全选项,允许交换秘钥指纹,防止中间人攻击,非必需
/*
如果您取消注释以在TURN消息中使用指纹,这意味着客户端和服务器之间交换的消息将包括共享密钥的加密指纹。这个指纹用于确保消息的完整性和真实性,并防止中间人攻击。

默认情况下,此选项被关闭,这意味着客户端和服务器之间交换的消息将不包括指纹。然而,如果安全是一个问题,建议打开此选项,为通信添加额外的安全层。
*/
fingerprint

//打开鉴权,可以是证书或者用户名密码
/*
如果您取消注释以使用长期凭据机制,这意味着TURN服务器将使用凭据机制来验证客户端的身份。这个机制需要客户端提供一个凭据(如用户名和密码),以便TURN服务器可以验证客户端是否有权限使用服务。默认情况下,没有使用凭据机制,这意味着任何用户都可以使用TURN服务器。

如果您启用了凭据机制,则只有那些提供正确凭据的用户才能访问TURN服务器。这将增加通信的安全性和保护机密信息不被未经授权的访问。
*/
lt-cred-mech

//用户名密码配置,暂使用明文,后续可以把密码MD5或者hash等,用命令生成
user=hayson:hayson

//系统日志默认是打开的
syslog

//禁止回环和广播,安全相关应该是默认关闭的,非必需配置
/*
allow-loopback-peers是一个标志,用于允许来自回环地址(127.x.x.x和::1)的对等体连接TURN服务器。这是一项额外的安全措施。

在测试环境中,可以允许回环地址访问TURN服务器,但在生产环境中不建议使用这个选项,因为这可能会增加安全漏洞。如果要使用这个选项,请确保同时设置了cli-password来提高安全性。

通过启用此选项,您可以允许来自本地回环地址的客户端连接TURN服务器,这对于开发和测试环境非常有用。但请注意,在生产环境中,允许来自回环地址的客户端连接可能会增加安全风险,因此应该谨慎使用。
*/
no-loopback-peers
no-multicast-peers

//禁止turnserver命令行交换,安全配置,非必需
/*
这段代码是用于关闭TURN服务器的命令行界面(CLI)支持的。默认情况下,CLI支持总是打开的。可以使用这个选项关闭CLI支持,以增强TURN服务器的安全性。

CLI是一种交互式界面,允许用户通过命令行界面与TURN服务器进行交互。通过启用CLI支持,用户可以使用命令行界面来管理和控制TURN服务器,例如添加或删除用户,查看日志文件等。但是,由于CLI支持需要在TURN服务器上暴露命令行接口,因此它可能会增加安全风险。

如果您认为不需要CLI支持或希望提高TURN服务器的安全性,请使用这个选项关闭CLI支持。请注意,关闭CLI支持可能会对TURN服务器的管理和控制造成一定的不便。
*/
no-cli

核心配置
turnserver.conf 文件备份后修改为如下内容

//默认监听端口
listening-port=3478

//默认监听IP
listening-ip=172.16.0.13

//公网IP
external-ip=106.66.66.66

//通信端口范围
min-port=49152
max-port=65535

//加密
fingerprint
lt-cred-mech
user=hayson:hayson

重启服务器

sudo systemcrtl restart coturn.service

四、云服务器网络端口放行

  • 3478端口(TCP&&UDP)

  • 49152-65535端口(TCP&&UDP)

五、测试

google ICE测试

在这里插入图片描述

  • remove server 先把默认的服务器清空

  • 添加测试服务器

TURN URL:turn:106.66.66.66:3478
TURN username:hayson
TURN password:hayson

  • 点击添加服务器
  • 点击Gather candidates
    在这里插入图片描述

这里我们看两个结果东西,srflx和relay
srflx:是表示反射地址,即我们自己的出口IP,如果用stun就只需要查看有反射就行了。
relay:表示中转地址。

host:收集的到浏览器电脑本机地址

js测试

测试网页如下,记得修改服务器地址信息

<!DOCTYPE html>
<html>
<button id="btn1">Test TURN SERVER</button>
<script type="text/javascript">
	var btn1 = document.getElementById('btn1');
	btn1.addEventListener('click', testtrun);
	btn1.disabled = false;

            function checkTURNServer(turnConfig, timeout) {
                return new Promise(function(resolve, reject) {

                    setTimeout(function() {
                        if (promiseResolved) return;
                        resolve(false);
                        promiseResolved = true;
                    }, timeout || 5000);

                    var promiseResolved = false,
                        myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection //compatibility for firefox and chrome
                        ,
                        pc = new myPeerConnection(turnConfig),
                        noop = function() {};
                    pc.createDataChannel(""); //create a bogus data channel
                    pc.createOffer(function(sdp) {
                        console.log(Math.random()+"createOffer:"+JSON.stringify(sdp))
                        if (sdp.sdp.indexOf('typ relay') > -1) { // sometimes sdp contains the ice candidates...
                            promiseResolved = true;
                            resolve(true);
                        }
                        pc.setLocalDescription(sdp, noop, noop);
                    }, noop); // create offer and set local description
                    pc.onicecandidate = function(ice) { //listen for candidate events
                    console.log("onicecandidate:"+ice.candidate.candidate)
                        if (promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf(
                                'typ relay') > -1)) return;
                        promiseResolved = true;
                        resolve(true);
                    };
                });

            }


            function testtrun() {
                checkTURNServer({
                    'iceServers': [
                    {
                        'urls': 'stun:106.66.66.66:3478'
                    }, 
                    {
                        'urls': 'turn:106.66.66.66:3478',
                        'credential': "hayson",
                        'username': "hayson"
                    }
                    ]
                }).then(function(bool) {
                    var resTxt = bool ? 'yes' : 'no';
                    //document.getElementById('spRes1').innerHTML = resTxt;
                    console.log('is my TURN server active? ', resTxt);
                }).catch(console.error.bind(console));
            }
        </script>
</html>

F12 查看结果
在这里插入图片描述

参考

《WebRTC之ICE服务器coturn安装及部署》
《Coturn服务器搭建步骤》
《测试coturn服务器是否可用(Webrtc)》
《自建 AppRTC》
《stun server、turn server、coturn server安装与使用》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试题目气死人

服了差不多每一题都要错几个案例我真的服了wok&#xff0c;什么鬼东西&#xff01;&#xff01;&#xff01; lx学长的羊圈 Description lx学长是一个养羊大户&#xff0c;有成千上百个羊圈。可是却一次也没来羊圈帮过忙&#xff0c;今天他被叫来羊圈给羊羊们施展成双成对大法…

力扣算法系统刷题题解记录

力扣算法系统刷题题解记录 文章目录力扣算法系统刷题题解记录前言一、数组704二分查找示意图&#xff1a;解题思路代码27.移除元素示意图解题思路代码前言 参考顺序和资料&#xff1a;《代码随想录》 二刷要认真做笔记啦&#xff0c;加油&#xff01; 一、数组 704二分查找 …

2023-04-12 面试中常见的数组题目

数组中的问题其实最常见 通过基础问题&#xff0c;掌握写出正确算法的“秘诀”巧妙使用双索引技术&#xff0c;解决复杂问题对撞指针- 滑动窗口 1 从二分查找法看如何写出正确的程序 本节学习重点&#xff1a;处理边界问题&#xff01; 1.确定边界范围方法&#xff0c;先用区…

13、Qt生成dll-QLibrary方式使用

Qt创建dll&#xff0c;使用QLibrary类方式调用dll 一、创建项目 1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名&#xff0c;选择项目位置&#xff0c;下一步 3、选择MinGW&#xff0c;下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff…

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况&#xff0c;目前有三个任务A、B、C&#xff0c;分别需要在3点钟&#xff0c;4点钟和9点钟执行&#xff0c;可以把时间想象成一个钟表。 如上图中所示&#xff0c;我只需要把任务放到它需要被执行的时刻&#xff0c;然后等着时针转到这个…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;组成 &#xff08;3&#xff09;分类 &#xff08;4&#xff09;子网掩码 三、路由选择 IP协议是网络层的协议&#xff0c;它主要完成两个方面的任务&#xf…

4.16--设计模式之创建型之代理模式(总复习版本)---脚踏实地,一步一个脚印

1.代理对象 定义&#xff1a;代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对原对象的引用&#xff0c;从而实现对真实对象的操作。 通俗的来讲代理模式就是我们生活中常见的中介。 在代理模式中&#xff0c;代理对象主要起到一个中介的作用&#xff0c;…

初识Docker并在linux完成安装

文章目录一、 初识Docker1.1 简介1.2 Docker和虚拟机的异同1.3 Docker架构二、 DockerHub三、Docker的安装一、 初识Docker 1.1 简介 Docker是一种开源的容器化平台&#xff0c;可以让开发者在容器中打包、发布、运行和管理应用程序。它使用轻量级的容器来隔离应用程序和它们的…

Scrapy爬虫基本使用与股票数据Scrapy爬虫

Scrapy爬虫的常用命令 scrapy命令行格式 红色是常用的三种命令 为什么Scrapy采用命令行创建和运行爬虫&#xff1f; 命令行&#xff08;不是图形界面&#xff09;更容易自动化&#xff0c;适合脚本控制 本质上&#xff0c;Scrapy是给程序员用的&#xff0c;功能&#xff08…

vue打包之后,可以进行修改配置后端地址、端口等信息方法

前言 用vue-cli构建的项目通常是采用前后端分离的开发模式&#xff0c;也就是前端与后台完全分离&#xff0c;此时就需要将后台接口地址打包进项目中&#xff0c;但是&#xff0c;难道我们只是改个接口地址也要重新打包吗&#xff1f;当然不行了&#xff0c;那就太麻烦了&#…

支付宝沙箱环境+SpringBoot+内网穿透整合开发

目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号 首先什么是沙箱账号&#xff1f; 沙箱账号是指在支付宝沙箱环境中创建的测试账户&#xff0c;用于模拟真实的支付流程…

The 2022 ICPC Asia Xian Regional Contest

题目顺序大致按照难度排序。 F. Hotel 现在酒店中有单人间和双人间&#xff0c;价格分别是c1&#xff0c;c2&#xff0c;现在有n个队&#xff0c;每队三个人&#xff0c;性别分别用字母表示&#xff0c;当两个人性别相同且在同一个队时&#xff0c;他们可以住在双人间中。求最…

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo写在前面环境配置创建虚拟环境安装库项目运行写在前面 相信很多朋友跟我一样在github等平台上偷代码 (读书人的事怎么能叫偷呢) 的时候会发现伟大且无私的作者虽然开源了代码但是readme文件该写的没写&#x…

2023TYUT移动应用软件开发程序设计和填空

目录 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件 程序设计2&#xff1a;根据要求,补充Activity.java文件 程序填空 说明&#xff1a; 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件…

【C++初阶】第十篇:list模拟实现

文章目录一、list的模拟实现三个类及其成员函数接口总览结点类的模拟实现迭代器类的模拟实现迭代器类的模板参数说明迭代器operator->的重载迭代器模拟实现代码list的模拟实现无参构造函数带参构造拷贝构造函数赋值运算符重载函数析构函数begin和endinserteraselist的迭代器…

WordPress添加阿里云OSS对象云储存配置教程

背景&#xff1a;随着页面文章增多&#xff0c;内置图片存储拖连网站响应速度&#xff0c;这里对我来说主要是想提升速度 目的&#xff1a;使用第三方云存储作为图片外存储(图床)&#xff0c;这样处理可以为服务器节省很多磁盘空间&#xff0c;在网站搬家的时候减少文件迁移的工…

【数据结构】堆(笔记总结)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

MySQL--数据库基础--0406

目录 1.什么是数据库&#xff1f; 2. 基本使用 2.1 连接服务器 2.2 数据库的操作在Linux中的体现 2.3 使用案例 3.服务器&#xff0c;数据库&#xff0c;表关系 4.数据逻辑存储 5.SQL的分类 6.存储引擎 1.什么是数据库&#xff1f; 数据库和文件 文件或者数据库&…

OK-MX93开发板-实现Web页面无线点灯

上篇文章&#xff1a;i.MX9352——介绍一款多核异构开发板&#xff0c;介绍了OK-MX9352开发板的基础硬件功能。 本篇来使用OK-MX9352开发板&#xff0c;通过Web界面进行点灯测试&#xff0c;最终的效果如下&#xff1a; 在进行代码编写之前&#xff0c;先在Ubuntu虚拟机上把这…

对比损失Contrastive Loss(CVPR 2006)原理解析

paper&#xff1a;http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf 本文提出的对比损失contrastive loss被广泛应用于自监督模型中&#xff0c;但最初对比损失是作为一个特征降维方法而提出的。 摘要 降维是学习一种映射关系&#xff0c;通过这种映射关…