背景
前面我们介绍了stun
,turn
相关的协议, 本章节来介绍实现了这两个协议的coturn
服务。
coturn
是一个开源的turn
服务器, 支持stun
和turn
协议。代码地址
本次测试coturn
的版本为: 4.7.0
部署
使用docker
来部署coturn
服务, 因为还有管理平台,所以需要:
- 数据库:
mysql
- 域名,nginx证书: 因为使用
tls
来访问, 所以需要有一个域名, 并配置好证书。
-
拉取
coturn
的镜像1
docker pull coturn/coturn:4.7.0
-
运行
coturn
容器因为会修改
turnserver.conf
, 所以需要挂载turnserver.conf
到容器中。1
docker run -d -v /home/data/coturn-docker/log/:/var/tmp/ -v /home/data/coturn-docker/turnserver.conf:/etc/coturn/turnserver.conf -v /home/data/coturn-docker/tls:/etc/ssl/tls --network=host --user=root --privileged=true --restart=always --name coturn coturn/coturn:4.7.0
-
验证
coturn
服务是否运行1
docker logs coturn
可以看到类似如下的日志:
1 2 3 4 5 6 7 8
0: (1): INFO: System cpu num is 8 0: (1): INFO: System cpu num is 8 0: (1): INFO: System enable num is 8 0: (1): INFO: Listener address to use: 172.16.4.113 0: (1): INFO: Coturn Version Coturn-4.7.0 'Gorst' 0: (1): INFO: Max number of open files/sockets allowed for this process: 4096 0: (1): INFO: Due to the open files/sockets limitation, max supported number of TURN Sessions possible is: 2000 (approximately) 0: (1): INFO:
测试
web管理平台
取消turnserver.conf
中的注释:
|
|
因为要使用数据库, 所以需要先创建数据库coturn
和相关的表,表在源码的位置:docker/mysql/schema.sql
。
主要有以下几个表:
admin_user
表是用来登录管理平台的用户表, 有name
,realm
,password
三个字段。
其中name
是用户名, realm
是域名, password
是密码。
可以使用turnadmin
工具来添加用户, 工具在docker
镜像中, 可以进入容器执行。
|
|
-r
域名一定要有, 就能在数据表中看到生成的用户信息。
然后浏览器访问https://exmaple.com:8080
, 输入用户名密码登录。
存在的问题
密码如果是:
123456
, 登录填123456
,登录不了,但是填1234
或者其他的,只要比123456
短, 就可以登录。已提issue。
登录后, 可以看到如下的界面:
通过查看TURN session
可以看到当前的turn
会话信息。
因为这块数据没写入数据库,所以只能显示当时的会话信息。
turn测试
条件说明:
- 测试页面使用的是webrtc.github.io 提供的页面。
- 由于设备有限,
coturn
部署的服务上只有内网ip:172.16.4.113
, 域名也是绑在此ip上的,以turn.example.com
代替。
turnserver.conf 配置
|
|
关于user
配置,有两种方式:
-
username:key
这种方式要使用
turnadmin
来生成key
,key
是以0x
开头的字符串,例如:1
turnadmin -k -u 1758880920 -r turn.example.com -p 123456
生成的
key
为:0xaa6a346a717d5152bab065c41fe0264d
。然后在
turnserver.conf
中添加:1
user=1758880920:0xaa6a346a717d5152bab065c41fe0264d
但是在测试时,填写
123456
作为password
:
所以如果使用`key`方式, 你忘记了密码(配置中没写密码),那么就没办法了,只能重新生成`key`。
-
username:password
-
如果用的是
lt-cred-mech
, 密码就是登录时填写的密码。 -
如果用的是
use-auth-secret
, 密码就是HMAC-SHA1
算法计算的结果, 密钥是static-auth-secret
的值。password
是使用HMAC-SHA1
算法来计算的, 可以使用此地址: hmac计算
-
然后在`turnserver.conf`中添加: `user=1758880920:wLvieDRiCi7eCE0MwDr/+YTCNtk=`
但是在测试时,填写`wLvieDRiCi7eCE0MwDr/+YTCNtk=`作为`password`:
turn测试结果
turn
地址为:turn:turn.example.com:5349?transport=tcp
, 测试的结果:
可以看到relay
即是turnserver
分配的转发的ip
和port
。
抓包结果:
目前的请求发送了两次,抓包和测试结果都印证了此情况。 通过抓包可以看到请求的逻辑:
sequenceDiagram stun client ->>stun server: Allocate Request stun server ->>stun client: Allocate Error Response 401 stun client ->>stun server: Allocate Request with user stun server ->>stun client: Allocat Success Response Note over stun server,stun client: XOR-RELAYED-ADDRESS,XOR-MAPPED-ADDRESS,lifetime stun client ->>stun server: Refresh Request Note over stun server,stun client: lifetime,user,realm stun server ->>stun client: Refresh Success Response
详细的信令如下:
Allocate Request
Allocate Error Response
Allocate Request with user
Allocate Success Response
XOR-RELAYED-ADDRESS
: 是turnserver
分配的转发的ip
和port
。
XOR-MAPPED-ADDRESS
: 是turn client
的NAT
后地址,因为是内网访问,所以显示的是内网ip
。
Refresh Request
Refresh Success Response
turn
地址为:turn:turn.example.com:5349
, 不带transport
,默认是udp
, 测试的结果:
可以看到有报错:STUN binding request timed out.
。
但是抓的包返回都是成功的,相对于tcp
测试, 多了Binding Request
信令。
抓包结果:
总结
- 现在的
4.7.0
版本,请求成功没有任何日志,只有报错日志,这块不太友好。 turn
测试,不管是用域名还是ip,tcp
请求ok,udp
请求会报错,暂时还未找到原因。