美文网首页WebRTC
Ubuntu 下 coturn 配置实现 TURN 中继传输媒

Ubuntu 下 coturn 配置实现 TURN 中继传输媒

作者: Gobert | 来源:发表于2017-09-11 14:40 被阅读460次

    注:如果你已经实现了基于 coturn 的 P2P 模式通话,而现在正在努力实现 Turn 转发模式的音视频通话的话,请直接查看第三节;

    一、源码下载编译

    1、编译安装 coturn

    coturn 依赖 libevent2,通过 apt-get 直接安装 libevent2

    github 下载 coturn 源码

    git clone https://github.com/coturn/coturn
    

    2 、编译安装

    cd coturn
    ./configure
    make 
    sudo make install
    

    二、 coturn 配置

    1、拷贝默认配置

    coturn 源码的 example/etc 目录中,有提供 coturn 的默认配置文件,以供我们使用,我们需要分别拷贝 turnserver 所需要的三个配置文件:

    • 首先在 /etc 目录下创建 turnserver 配置的存放目录:

      sudo mkdir /etc/turnserver/
      

      注: 这一步 并不是必须的,因为 turnserver 启动时可以指定任意目录的配置文件;

    • 拷贝 conf 配置脚本

      进入 coturn 目录

      cd coturn
      sudo cp ./examples/etc/turnserver.conf /etc/turnserver/
      

      注: 在 examples 目录下的此配置文件,每个配置项均有说明,这样可以明白具体的参数含义;

      此配置文件自己也可以新建,然后将后面章节中的内容直接粘贴进去;

    • 拷贝 pem 秘钥文件

    为了做些明显的区分,我们将 *.pem 秘钥文件也拷贝到 /etc/turnserver/ 目录下(也可由 openssl 命令生成,这里我们偷个懒,直接用默认的):

    sudo cp ./examples/turn_server_*.pem  /etc/turnserver/
    

    这里我们拷贝的秘钥文件,将在上一步的 turnserver.conf 配置文件中指定;

    2、生成 coturn 用户

    通过 turnadmin 执行简单的命令,指定相应的用户名、密码、域名,既可将此账号添加到 coturn 的数据库中;

    如下:

    sudo turnadmin -a -u 用户名 -p 密码 -r 域名
    

    执行成功后,通过 turnadmin -l 既可查看新创建的用户名及域名:

    sudo turnadmin -a -u gobert -p 12345678 -r qiniu.com
    turnadmin -l
    gobert[qiniu.com]
    

    创建成功!

    其实这里我们指定的密码和域名暂时都是无关紧要的,因为后面我们在启动 turnserver 时,可以通过相关参数,给其指定固定的域名和密码;

    3、配置 turnserver.conf

    建议:将之前拷贝的 turnserver.conf 文件备份,并新建一个 turnserver.conf 文件,将一下内容拷贝进入:

    #本地监听的网卡设备,这里根据自己的实际情况填写
    listening-device=eth1
    listening-port=3478
    #本地用于转发的网卡设备,这里根据自己的实际情况填写
    relay-device=eth1
    #指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽
    min-port=3480
    max-port=3500
    #日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
    Verbose
    #消息验证,WebRTC 的消息里会用到
    fingerprint
    #webrtc 通过 turn 中继,必须使用长验证方式
    lt-cred-mech
    # ICE REST API 认证需要
    use-auth-secret
    # REST API 加密所需的 KEY
    # 这里我们使用“静态”的 KEY,Google 自己也用的这个
    static-auth-secret=4080218913
    #用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
    realm=<填写你自己的域名>
    #可为 TURN 服务提供更安全的访问
    stale-nonce
    # SSL 需要用到的, 生成命令:
    # sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
    #这里我们使用刚才拷贝到 /etc/examples/目录下秘钥文件
    cert=/etc/turnserver/turn_server_cert.pem
    pkey=/etc/turnserver/turn_server_pkey.pem
    #屏蔽 loopback, multicast IP地址的 relay
    no-loopback-peers
    no-multicast-peers
    #启用 Mobility ICE 支持(不懂)
    mobility
    #禁用本地 telnet cli 管理接口
    no-cli
    

    注:以上配置内容中,有许多的参数并没有配置,turnserver 启动时将使用其默认值,已配置的参数,也可以在 turnserver 启动时加上相应的参数覆盖它;

    以上配置项目中,只要 listening-device 和 relay-device 需要根据自己 server 的实际情况进行修改,其它均使用默认值既可。

    三、启动 turnserver

    通过 turnserver 实现 Peers 默认通过 turn 中继转发媒体数据流,进行音视频通话,其中一个关键点是 coturn 需要布置到一个同时连接到两个网络的服务器(公网)上,如网卡一:公网,网卡二:私网(暂且还用不到),且需要同时联通网络,否则会出现两个 Peers 只要开始连接,turnserver 就会报 Allocation timeout 的错误,目前原因需要通过跟踪代码去分析,暂时还未明确具体原因。

    启动 turnserver 可以通过如下命令进行启动:

    启动 turnserver 可以通过如下命令进行启动:

    sudo ./turnserver -v -L 222.73.202.228  -a -f -r 222.73.202.228 -c /etc/turnserver/turnserver.conf
    

    以上命令:通过 -v 指定日志输出级别; -L 指定用于绑定的网卡 IP 地址;-a 指定使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,将覆盖 turnserver.conf 文件中的配置;-C 指定配置文件路径。

    四、通话测试

    让 Peers 默认通过 turn server 转发的模式进行音视频通话,通过修改 Clients 端的代码或者配置既可实现,我们首先实现浏览器之间 SFU 模式的音视频通话,后面再实现 Mobile App Demo 之间的通话。

    1、实现浏览器之间 turn 转发通话

    进入 apprtc 源码中(Room Server),修改其 out/app_engine/apprtc.py 文件,找到 get_room_parameters 方法,修改如下的一段代码,默认是:

      # Which ICE candidates to allow. This is useful for forcing a call to run
      # over TURN, by setting it=relay.
      ice_transports = request.get('it')
    

    注释已经说得很清楚了,ice_transports 可以通过设置成 relay,以强制会话通过 TURN 进行转发,修改后如下:

      # Which ICE candidates to allow. This is useful for forcing a call to run
      # over TURN, by setting it=relay.
      ice_transports = request.get('it')
      ice_transports = 'relay'
    

    重启房间服务器,以及刷新下浏览器页面,以重新加载修改后的 Python 代码,通过 wireshark 抓包或者浏览器控制台的日志输出,我们已经可以看到,WebRtc 的 candidates 交换,已经只有 relay type 的了,不会再去交互 host 和 srflx 类型的 candidates 了。

    打开火狐浏览器(暂未实现 https 加密访问),输入 RoomServer 地址,进入同一个房间,既可开启 TURN 转发模式的视频通话了。

    2、实现 App 之间 turn 转发通话

    实验中

    相关文章

      网友评论

      • 72405d6413a5:我遇到Allocation timeout , 服务器时单网口,如果双网口的话,另一个在内网下,有什么用呢?有点搞不懂这个ip时怎么配置

      本文标题:Ubuntu 下 coturn 配置实现 TURN 中继传输媒

      本文链接:https://www.haomeiwen.com/subject/ifhfsxtx.html