rfc5766-turn-server规范
rfc5766-turn-server是谷歌推荐的turn开源项目,经常作WebRTC的服务器端使用。 该开源项目是包含TURN与STUN功能于一体,默认TURN与STUN监听端口为3478。
支持tcp, udp, tls, dtls 连接.tls为基于TCP的安全层传输协议,dtls为基于udp的安全传输层协议。
注意:TLS和DTLS需要安装证书。
TURN specs:
RFC 5766 - base TURN specs
RFC 6156 - IPv6 extension for TURN
Experimental DTLS support as client protocol.
STUN specs:
RFC 5389 - base "new" STUN specs
RFC 5769 - test vectors for STUN protocol testing
RFC 5780 - NAT behavior discovery support
RFC 3489 STUN1
典型的TURN与client通信流程如下:
1.客户端发送一个不带证书的allocate请求,服务器返回401错误。
2.客户端发送一个带long-term credential(长期证书,服务器配置文件user字段定义)的allocate请求,服务器接收请求,并返回分配的转发地址。
3.客户端定期发送refresh包,证明自己的存在。
coturn搭建
webrtc适用配置文件:
链接:https://pan.baidu.com/s/1oj9zn6q4eE90QBsg0qAbGg 密码:1vur
安装依赖项
1.sudo apt-get install libssl-dev
2.sudo apt-get install libevent-dev
3.sudo apt-get install libpq-dev
4.sudo apt-get install mysql-client
5.sudo apt-get install libmysqlclient-dev
6.sudo apt-get install libhiredis-dev
其中SQL相关的依赖项可能会失败,不过这也没什么大不了的,SQL库是为了支持更多用户而准备的,如果你不是生产环境的话,忽略也行。
检出代码
从https://code.google.com/p/rfc5766-turn-server/source/checkout 到任意目录,我检出到了stun,下文脚本请注意自行对号入座。cd进去
开始编译
生成makefile文件,编译,安装
1./configure
2.make
3.sudo make install
在bin目录下生成六个可执行文件
turnadmin turnutils_peer turnutils_stunclient
turnserver turnutils_rfc5769check turnutils_uclient
turnserver 就是我们需要的服务器.
turnadmin 用来管理账户.
turnutils_stunclient 用于测试stun服务
turnutils_uclient 用于测试turn服务. 模拟多个UDP,TCP,TLS or DTLS 类型的客户端
example 目录主要是示范如何配置和使用turn. 包含一些测试用例.
example/etc 下是pem证书和conf配置文件
example/var/db 下是sqlite的db库. 用于示范数据库的格式.
coturn 支持三种配置. 命令行, conf文件和数据库. 数据库支持sqlite, mysql, postgresql, MongoDB, redis
examples\scripts 下一些测试用例:
loadbalance 示范如何进行负载均衡. 设置一个master turn server 然后配置若干个slave turn server.
longtermsecure 示范如何使用long-term 验证
longtermsecuredb 与 longtermsecure 类似, 不过是从数据库配置
shorttermsecure 示范如何使用short-term验证.
restapi 示范了web方面的使用.
stun 定义了两种验证方式.
Long-Term Credential
Short-Term Credential
短期证书用户名,密码及有效时间。
长期证书包含用户名,密码,在整个会话周期有效。
具体可以参考stun标准 http://tools.ietf.org/html/rfc5389#section-15.4
但是对于webrtc而言. 仅支持long-term .
fingerprint属性:当几种协议复用相同的通信地址时,为了区分stun消息,可以使用fingerprint属性,这时在stun数据包中会包含fingerprint属性。
http://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
TURN REST Server API
这个PDF 描述了. turn服务器和客户端的交互流程.
简单的使用
turnserver -o -a -f -v --mobility -m 10 --max-bps=100000 --min-port=32355 --max-port=65535
--user=ling:ling1234 --user=ling2:ling1234 -r demo
-m 10 表示启动十个relay线程.
当TURN Server用于WebRTC时,必须使用long-term credential mechanism, 即指定 -a 或者 --lt-cred-mech
--max-bps=100000 限制最大速度为100KB/s.
添加了两个用户ling 和ling2.
可以直接使用turnutils_uclient -u ling -w ling1234 来测试. turnutils_uclient 有很多参数可以配置的.
webrtc::PeerConnectionInterface::IceServer turnServer;
turnServer.uri = "turn:ip";
turnServer.username = "ling";
turnServer.password = "ling1234";
servers.push_back(turnServer);
如果从安全性方面考虑. 可以为账户生成key, 这样就可以直接通过key登录. 而不需要提供密码.
key 通过turnadmin生成, 需要(username, password, realm) . realm是启动turn server时-r 参数指定的.
例如这样:
turnadmin -k -u ling -p ling1234 -r demo
0xccba8f3a6a025a38eb4a0e795fc92705
测试
试试看是否编译成功,先看看turnserver支持哪些功能
turnserver -h > help.txt
支持协议
测试各基础协议是否支持
配置
rfc5766-turn-server是利用配置文件来定义自己的功能表现的,安装完成后,在下列路径都有默认的配置文件:
启动rfc5766-turn-server
sudo turnserver -c /你的路径/turnserver.conf --daemon