基于coturn项目的stun/turn服务器搭建

2020-12-16 22:46:44

参考链接 webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

webrtc是google推出的基于浏览器的实时语音-视频通讯架构。其典型的应用场景为:浏览器之间端到端(p2p)实时视频对话,但由于网络环境的复杂性(比如:路由器/交换机/防火墙等),浏览器与浏览器很多时候无法建立p2p连接,只能通过公网上的中继服务器(也就是所谓的turn服务器)中转。示例图如下:

上图中的Relay server即为turn中继服务器,而STUN server的作用是通过收集NAT背后peer端(即:躲在路由器或交换机后的电脑)对外暴露出来的ip和端口,找到一条可穿透路由器的链路,俗称“打洞”。stun/turn服务器通常要部署在公网上,能被所有peer端访问到,coturn开源项目同时实现了stun和turn服务的功能,是webrtc应用的必备首选。

下面介绍coturn的搭建过程:

一、弄一台有公网ip的云主机

对于新手,推荐使用国内DaoCloud的"免费胶囊主机",可免费耍2小时,即不花钱,又搞了运行环境(就是干活时,手脚要麻利点),等基本概念熟悉了,再到阿里云或腾迅云上买一台可长期使用的主云机。

创建成功后,在主机详情里,可以看到公网及内网ip,包括ssh登录方法

 

二、安装coturn的依赖组件

daocloud提供的免费胶囊主机是ubuntu环境,上面啥都没有,必须先安装以下组件:

1
2
3
4
5
6
7
8
9
10
11
sudo su root #先切换到root
apt-get  install  build-essential #(可选),如果后面的./configure失败时,可先安装gcc
apt-get install openssl libssl-dev make
 
wget https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz
tar -zxvf libevent-2.1.10-stable.tar.gz
cd libevent-2.1.10-stable
./configure
make make install
apt-get install sqlite libsqlite3-dev
cd ~/

注:coturn的用户信息等,默认是持久化保存在sqlite中,如果想保存到mysql中,上面的sqlite安装选项,需要改成mysql相关的依赖项。

1 apt-get install mysql-server -y #可选(安装mysql)2 apt-get install mysql-client -y3 apt-get -y install libmysqlcppconn-dev libmysqlclient-dev libmysql++-dev

 

三、下载coturn源码并编译

1
2
3
4
5
wget https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz
tar -zxvf 4.5.1.1.tar.gz
cd coturn-4.5.1.1
./configure
make make install

tips: daoclound的免费主机下载github源码的速度并不快,如果本机网速够快,可以事先在本机下载好,然后用类似

1
scp ~/Downloads/4.5.1.1.tar.gz ubuntu@52.81.17.142:/home/ubuntu

直接上传,速度要快很多。

注意:一定要在./configure前,把sqlite或mysq依赖项安装好,否则./configure时无法识别出sqlite或mysql,最后make成功的版本,会显示xxx is not supported。sqlite\mysql正常的版本,启用时会有类似下面的显示: 

如果对sqlite里的表结构感兴趣,可以把turndb down到本机,用工具打开:

 

四、创建用户并配置coturn

turnadmin -a -u yjmyzz -p yjmyzz.cnblogs.com -r cnblogs

上面的命令,将创建用户yjmyzz,密码为yjmyzz.cnblogs.com,同时指定realm为cnblogs,大家根据实际情况修改 

1
cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf

上面的命令,将配置模式文件复制一份到/usr/local/etc/下

1
vim /usr/local/etc/turnserver.conf

修改下面几个关键项:

listening-port=3478 #监听端口
listening-device=eth0 #监听的网卡
external-ip=52.81.17.142 #公网ip
user=yjmyzz:yjmyzz.cnblogs.com #用户名:密码
realm=cnblogs #一般与turnadmin创建用户时指定的realm一致

注:如果机器上有多块网卡,注意listening-ip与listening-device要匹配,参考下图:

 

五、启用coturn并验证

1
turnserver -o -a -f -v -r cnblogs

最后的-r cnblogs意为指定realm,要与创建用户时指定的realm一致。可用lsof -i:3478校验下是否启动成功,如果看到类似下面的输出,说明3478监听正常。

webrtc-samples官网还提供了一个检测ice穿透的在线工具:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

参考下图,把stun和turn地址设置好,然后点击最下面的“Gather candidates”(收集候选链路)

如果看到最后的reply那一行,address里的ip与turn服务器的公网ip相同,说明中继成功。

 

参考文章:

https://www.kancloud.cn/vim26/v1/578933


  • 2019-08-19 15:50:17

    记录PHP的进程和线程理解

    线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。 解释一下:进程有两个特性:一是资源的所有权,一个是调度执行(指令集),线程是调度执行中的一部分,是指进程执行过程的路径,也叫程序执行流。线程有时候也叫轻量级进程。

  • 2019-08-20 08:51:52

    一台Linux服务器可以负载多少个连接?

    我们在压测一台目标服务器,想看下负载的连接数,当我们压到一定数量的时候,控制台突然报"too many open files",这是因为linux系统创建一个TCP连接的时候,都会创建一个socket句柄,每个socket句柄就是一个文件句柄。

  • 2019-08-20 08:56:42

    Linux下Http高并发参数优化之TCP参数

    Linux 内核参数考虑的是最通用场景,并不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数。其次,对 Nginx 的一些参数,也需要根据服务情况进行调整。

  • 2019-08-20 11:05:30

    php,nginx,线程和进程分析

    大多数的 Linux 程序都倾向于使用进程而不是线程,因为 Linux 下相对来说创建进程的开销比较小,而 Linux 的线程功能又不是很强大。

  • 2019-08-20 11:22:36

    Node.js 单线程与多进程比较

    进过上面两种方式的对比,结果很明显,多进程处理速度是单线程处理速度的 4 倍多。而且有条件的情况下,如果电脑 CPU 足够,进程数更多,那么速度也会更快。

  • 2019-08-22 13:35:27

    Generator函数的语法

    执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了是状态机还是一个遍历器对象生成函数。 返回遍历器对象,可以依次遍历Generator函数内部的每一个状态。

  • 2019-08-22 16:38:15

    理解JS原型对象与原型链(重要清晰)

    JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象对应拥有一个原型,对象以其原型为模板、从原型继承方法和属性。而同时原型也是对象,它也拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。