重点!
ps.完整官方demo apprtc项目部署见:https://blog.csdn.net/ts_dchs/article/details/97402024
作者: 花果山の香蕉
注:libevent是一个异步事件处理软件库,coturn使用该库需要预先安装。
服务器处理大量连接时它们往往会产生问题,因为它们使用的内存或 CPU 太多,或者达到了某个操作系统限制。主要方法有:
循环,循环遍历打开的网络连接的列表,判断是否有要读取的数据。效率低;
poll、epoll 和变体,使用回调机制处理,poll结构很大添加新连接影响性能;
利用多线程,为每个链接启动一个线程,OS进行调度,但会引起CPU、RAM、上下文切换的损失,不适合大量活跃线程;
libevent ,事件机制,对于不同平台的上述实现加一个包装器,简化链接添加,降低底层IO。
参考:https://www.ibm.com/developerworks/cn/aix/library/au-libev/index.html
下载库,最新版本在release(https://github.com/libevent/libevent/releases/ ) 中查看
$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
解压与编译
$ tar xvfz libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure
生成Makefile文件,注意configure的提示,安装缺少的依赖,如openssl开发库
$ sudo apt install libssl-dev
$ ./configure
$ sudo make
$ sudo make install
安装libevent和openssl开发库完毕
获取Coturn源码,从https://github.com/coturn/coturn/wiki/Downloads 查阅版本
$ wget https://coturn.net/turnserver/v4.5.0.8/turnserver-4.5.0.8.tar.gz
解压并cd到目录,注意阅读 INSTALL和README文件。
$ ./configure
生成Makefile文件,注意configure的提示,安装缺少的依赖库,如需要一个数据库可以用sqlite
sqlite安装
$ sudo apt install sqlite3
sqlite开发库安装
$ sudo apt install libsqlite3-dev
$ ./configure
$ sudo make
$ sudo make install
编译安装成功结果
*注:sqlite数据库地址如上提示
增加用户:增加普通long-term TURN用户(还有管理员用户),用于WebRTC的登陆。
格式:$ turnadmin -a -u -r -p
$ sudo turnadmin -a -u ts -p 12345678 -r testrealm
添加用户名为ts,密码为12345678,realm域为testrealm的用户。
注意:
查看当前的普通用户
$ turnadmin -l
# 输出:ts[testrealm]
删除普通用户
格式:$ turnadmin -d -u -r
命令参考:https://github.com/coturn/coturn/wiki/turnadmin,详细见man turnadmin
turnserver默认搜索位置:/etc/turnserver.conf或/usr/local/etc/turnserver.conf
参考该conf文件以及设置解释:/usr/local/etc/turnserver.conf.default,大部分可以保持默认配置,参考解释进行修改。
生成加密传输需要的私钥、证书
证书和私钥用于加密传输,可信机制。证书表明身份,私钥是自己留用的解密方法。
私钥只需自身保管,丢失需要重新生成,让就证书失效。证书中含有密钥用于进行加密通信。往往非对称加密获得对称加密密钥再进行通讯。HTTPS的S为SSL/TLS(用于TCP)。
自签名证书生成:
# openssl req -x509 -days 1000 -newkey rsa:2048 -keyout ./key.pem -out ./cert.pem -nodes
得到两个文件,拷贝到/cert/目录下备用
The `req` command primarily creates and processes certificate requests in PKCS#10 format
-x509 请求签名,输出一个自签名证书,自己充当CA认证
-days 1000 默认30天,用于-x509天数设置
-newkey rsa:2048 生成新的认证和私钥
-nodes 对生成的私钥不加密
openssl req详见:man openssl
其他参考:https://blog.csdn.net/jiangshouzhuang/article/details/52730442
配置文件turnserver.conf
# 本地监听外网的网卡设备,默认eth0
listening-device=eth0
# TURN服务器UDP/TCP监听端口,默认:3478,同时根据协议会自动开启3479
# 应该需要防火墙开放端口
listening-port=8101
# TURN服务器TLS监听端口,默认5349,自动开启5350
#本地用于转发的网卡设备,默认eth0
relay-device=eth0
# UDP中继端口范围,用于UDP转发,注意安全组放通
# (default values are 49152 and 65535)
min-port=8110
max-port=8120
# 日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出,默认关闭
# Verbose
# 消息验证,WebRTC 的消息里会用到,默认关闭
fingerprint
# long-term验证机制,webrtc 通过 TURN中继使用的验证方式,默认关闭即不需要认证机制。
lt-cred-mech
# 默认域Realm
# 当在数据库中没有显示的域关系定义时,或没有使用任何db时使用。
# 配合long-term认证机制或者TURN REST API使用,需要设置。
realm=realm.me
# TURN REST API 认证标记。
# 但无法同时使用lt-cred-mech和use-auth-secret两种方式,保持注释
# use-auth-secret
# REST API 加密所需的'静态' KEY,同保持注释
# static-auth-secret
# 认证文件和私钥,用户TLS加密传输。
cert=/cert/cert.pem
pkey=/cert/key.pem
#屏蔽multicast IP地址(224.0.0.0 and above)的 转发
no-multicast-peers
启动turn服务器
sudo turnserver -c /etc/turnserver.conf
查看是否打开设置端口(8101),正确加载配置:
$ netstat -nap | grep 8101
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 172.21.0.9:8101 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8101 0.0.0.0:* LISTEN -
tcp 0 0 172.21.0.9:8101 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8101 0.0.0.0:* LISTEN -
udp 0 0 172.21.0.9:8101 0.0.0.0:* -
udp 0 0 172.21.0.9:8101 0.0.0.0:* -
udp 0 0 127.0.0.1:8101 0.0.0.0:* -
udp 0 0 127.0.0.1:8101 0.0.0.0:* -
测试
使用 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 测试如图:
成功如下图:
认证失败如图:
认证失败的几个原因(不完全欢迎补充):
turnadmin -l
为空;turnserver -r new.realm
来覆盖默认设置;*可以将turnserver输出重定向保存log搜索error或者其他错误,常会有收获。