Featured image of post coturn 初体验

coturn 初体验

背景

前面我们介绍了stun,turn相关的协议, 本章节来介绍实现了这两个协议的coturn服务。

coturn是一个开源的turn服务器, 支持stunturn协议。代码地址

本次测试coturn的版本为: 4.7.0

部署

使用docker来部署coturn服务, 因为还有管理平台,所以需要:

  • 数据库: mysql
  • 域名,nginx证书: 因为使用tls来访问, 所以需要有一个域名, 并配置好证书。
  1. 拉取coturn的镜像

    1
    
    docker pull coturn/coturn:4.7.0
    
  2. 运行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
    
  3. 验证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中的注释:

1
2
3
4
5
mysql-userdb="host=172.16.4.113 dbname=coturn user=root password=123456 port=3306 connect_timeout=15 read_timeout=10"

web-admin
web-admin-ip=172.16.4.113
web-admin-port=8080

因为要使用数据库, 所以需要先创建数据库coturn和相关的表,表在源码的位置:docker/mysql/schema.sql

主要有以下几个表:

sql

admin_user表是用来登录管理平台的用户表, 有name,realm,password三个字段。 其中name是用户名, realm是域名, password是密码。 可以使用turnadmin工具来添加用户, 工具在docker镜像中, 可以进入容器执行。

1
turnadmin -A -M "host=172.16.4.113 dbname=coturn user=root password=123456" -u test -p 123456 -r example.com 

-r域名一定要有, 就能在数据表中看到生成的用户信息。

admin

然后浏览器访问https://exmaple.com:8080, 输入用户名密码登录。

login

存在的问题

密码如果是:123456, 登录填123456,登录不了,但是填1234或者其他的,只要比123456短, 就可以登录。已提issue。

登录后, 可以看到如下的界面:

web

通过查看TURN session可以看到当前的turn会话信息。

session

因为这块数据没写入数据库,所以只能显示当时的会话信息。

turn测试

条件说明:

  1. 测试页面使用的是webrtc.github.io 提供的页面。
  2. 由于设备有限,coturn部署的服务上只有内网ip:172.16.4.113, 域名也是绑在此ip上的,以turn.example.com代替。

turnserver.conf 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
listening-port=3478
tls-listening-port=5349
listening-ip=172.16.4.113
external-ip=172.16.4.113
min-port=49152
max-port=65535
fingerprint
lt-cred-mech
user=1758880920:v7SRsGuqqovL1clY/ydY78zCdOA=

mysql-userdb="host=172.16.4.113 dbname=coturn user=root password=123456 port=3306 connect_timeout=15 read_timeout=10"
realm=turn.example.com
cert=/etc/ssl/tls/turn.example.com.pem
pkey=/etc/ssl/tls/turn.example.com.key
no-cli 
web-admin
web-admin-ip=172.16.4.113
web-admin-port=8080
log-file=/var/log/turnserver.log
new-log-timestamp
new-log-timestamp-format "%FT%T%z"

关于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`方式, 你忘记了密码(配置中没写密码),那么就没办法了,只能重新生成`key`。
  • username:password

    1. 如果用的是lt-cred-mech, 密码就是登录时填写的密码。

    2. 如果用的是use-auth-secret, 密码就是HMAC-SHA1算法计算的结果, 密钥是static-auth-secret的值。 password是使用HMAC-SHA1算法来计算的, 可以使用此地址: hmac计算

hmac

然后在`turnserver.conf`中添加: `user=1758880920:wLvieDRiCi7eCE0MwDr/+YTCNtk=`

但是在测试时,填写`wLvieDRiCi7eCE0MwDr/+YTCNtk=`作为`password`:

ice

turn测试结果

  1. turn地址为:turn:turn.example.com:5349?transport=tcp, 测试的结果:

turn

可以看到relay即是turnserver分配的转发的ipport

抓包结果:

turn

目前的请求发送了两次,抓包和测试结果都印证了此情况。 通过抓包可以看到请求的逻辑:

    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

  • Allocate Error Response

401

  • Allocate Request with user

request

  • Allocate Success Response

200

XOR-RELAYED-ADDRESS: 是turnserver分配的转发的ipport

XOR-MAPPED-ADDRESS: 是turn clientNAT后地址,因为是内网访问,所以显示的是内网ip

  • Refresh Request

refresh

  • Refresh Success Response

200

  1. turn地址为:turn:turn.example.com:5349, 不带transport,默认是udp, 测试的结果:

turn

可以看到有报错:STUN binding request timed out.

但是抓的包返回都是成功的,相对于tcp测试, 多了Binding Request信令。

抓包结果:

turn

总结

  1. 现在的4.7.0版本,请求成功没有任何日志,只有报错日志,这块不太友好。
  2. turn测试,不管是用域名还是ip, tcp请求ok, udp请求会报错,暂时还未找到原因。
本博客已稳定运行
发表了64篇文章 · 总计109.63k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计