一、简介
本文通过在服务器上安装coturn这个软件,实现搭建STUN服务器和TURN服务器。
coturn 简介:是一个免费的开源的 TURN/STUN 服务器。coturn 服务器完整的实现了 STUN/TURN/ICE 协议,支持 P2P 穿透防火墙。
STUN 服务器用于检测NAT类型。
TURN 服务器是在点对点失败后用于通信中继。
coturn的Github源码:
https://github.com/coturn/coturn
coturn的wiki使用说明:
https://github.com/coturn/coturn/wiki
Q:
stun服务器和turn服务器在部署步骤上,有什么区别?
A:
因为TURN是STUN的扩展,所以TURN服务器可以当作STUN服务器来用。
在软件配置上没有区别。
在硬件配置上,stun服务器需要1台服务器上有2个公网IP,turn服务器只需要有1个公网IP。
所以,如果你想:
只配置stun服务器:按照本文步骤来,还需要有1台用2个公网IP的服务器。
只配置turn服务器:按照本文步骤来。
1台服务器同时配置stun和turn服务器:按照本文步骤来,还需要有1台用2个公网IP的服务器。
二、安装
安装过程分为2部分
- 镜像不带有coturn的源,此处以ubuntu14.04 LTS 64位为例
- 镜像自带有coturn的源(推荐使用,这个比较方便),此处以ubuntu16.04 LTS 64位为例
1. 镜像不带有coturn的源,此处以ubuntu14.04 LTS 64位为例
1.安装相关环境
sudo apt-get install libssl-dev
sudo apt-get install libevent-dev
sudo apt-get install libpq-dev
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install libhiredis-dev
sudo apt-get install git
sudo apt-get install make
2.下载并安装相关代码
git clone https://github.com/coturn/coturn
cd coturn/
./configure
make
sudo make install
看到下图,就说明已经安装好了,这个是一些说明事项,如果想要将其设置成守护进程,可以看看
2. 镜像带有coturn的源,此处以ubuntu16.04 LTS 64位为例
输入apt-get install coturn
三、配置与运行
stun服务器和turn服务器的默认端口都是3478。
stun服务器需要一台服务器,并且服务器上绑定有2个公网IP(如果只有1个公网IP,会出现NAT类型检测不准确的情况!)。
turn服务器需要一台服务器,并且服务器上绑定有1个公网IP。
stun服务器搭建:
stun服务器需要一台服务器,并且服务器上绑定有2个公网IP。
性能要求应该不高,毕竟一个用户创建一个通话请求,只需要与stun服务器沟通一次,此后不再沟通,而沟通一次只需要发几个数据包验证能否通信。
现在有2种解决方案:
1.用别人现成的stun服务器(推荐使用)
2.自己搭一个stun服务器(2个公网IP的资金花销太大,而换来的只是一个NAT类型检测的功能,性价比不高,不推荐使用)
1.用别人现成的stun服务器
以下三个亲测可用:
stun.ekiga.net
stun.schlund.de
stun.voxgratia.org
怎么测试是否可用呢?
搜索NAT类型检测工具,然后下载
再找几个可用的服务器
框框里填入服务器地址
这个是可用的
这个是用不了的
2.自己搭一个stun服务器
硬件方面,腾讯云和阿里云有个叫弹性网卡的技术可以让一台服务器绑定2个ip,如果服务器只有1个IP,会出现NAT类型检测不准确的情况!
软件方面,服务器安装了coturn后,既是stun服务器,也是turn服务器,所以stun服务器的配置步骤与turn服务器的配置步骤是一样的。
turn服务器搭建:
coturn 支持三种配置:命令行、conf文件和数据库(据网上说是有数据库这种方式,但所有的例子都是前两种,所以我也不知道怎么用数据库去配置)。
数据库支持sqlite,mysql,postgresql,MongoDB,redis。这里的数据库指的应该是存用户信息的数据库,而不是配置coturn用的数据库。
STUN 定义了两种验证方式:Long-Term Credential 和 Short-Term Credential 。但是对于 WebRTC 而言,仅支持 Long-Term Credential 。
本文以命令行举例:
turnserver -o -v -f -a -m 2 --max-bps=100000 --min-port=32355 --max-port=65535 --user=phz:1 -r phzled.cn -L your.ip
部分参数说明:
-o 以守护进程模式运行(后台运行)
-v 日志会以“适度详细”的程度来记录
-f 增加指纹机制。
-a 长期验证机制
-m 以x个进程来处理中继请求
--max-bps 带宽
--min-port 起始用的最小端口
--max-port 最大端口号
--user=帐号:密码
-r 领域(随便写啥都行)。如果turn服务器没有使用任何数据库/命令行/conf文件进行配置,就需要加这个选项,并且要配合long-term credentials(-a选项)使用
-L 监听IP(turn服务器的ip)这个ip是你ifconfig查到的ip,不是你的公网ip
注意:turn服务器是需要有用户验证机制的,由账户,密码,领域三部分构成一个完整的账户。
看上图,如果想要在代码中使用turn服务器,需要输入正确的账户和密码,才可以正常使用turn服务器,而领域是给turn服务器使用的,不需要输入。
所以,如果想以命令行的方式配置turn服务器,--user -r -a 这三个选项必不可少。
如果想更详细的了解,请自行查阅wiki使用说明:
https://github.com/coturn/coturn/wiki
或是使用man手册查看:
man turnserver
命令行运行后会有以下信息,信息很多,大部分用不到,记住日志文件的位置信息就好,一般会放在/var/log下,以turn+进程号+日期命名。
四、运行检测
检测网址
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
如果想检测stun服务器,只用填写你的公网IP
如果想检测turn服务器,就填写你的公网IP,还有当时配置时填写的用户名和密码,因为turn是需要认证的,(--user选项填的那个信息)
填好相关信息后,点击按钮,进行验证
如果想要设置成开机自启动
写一个脚本,将你的脚本复制到 /etc/init.d目录下
脚本开头要加这几行字
### BEGIN INIT INFO
# Provides: scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
就像这样
然后设置脚本文件的权限(这里假设脚本名字为test)
sudo chmod 755 /etc/init.d/test
将脚本设置为启动脚本
sudo update-rc.d test defaults 95
注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。
卸载启动脚本的方法:
sudo update-rc.d -f test remove
五、答疑环节
Q1:
我的服务器成功运行后,在检测用的网址上检测不到。
A1:
可以看看是不是因为这2个原因:
1.-L选项的ip地址填的是ifconfig查到的ip地址
2.检查服务器的安全策略,如果是腾讯云或者阿里云,查看一下安全组的端口是否开放
stun服务器和turn服务器的默认端口都是3478。
以腾讯云为例,把端口打开