1. 前言

此前rtsp转webRTC的本地服务运行的不错,但是使用的某个免费stun服务突然被关停了,造成一些rtspToWebRTC的服务受到影响,因此,目前打算在我闲置的阿里云服务器上搭建stun/turn服务,我的域名xiaoyaoyou.xyz二级域名也一直只用在github page上,算是比较浪费,这里正好搭个stun/turn服务,后面看能否接到一些项目补贴一下。

2. 子域名设置

2.1 参考

参考这里:​​https://help.aliyun.com/document_detail/155782.html​

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_stun

所以我们添加设置一个三级域名:stun.xiaoyaoyou.xyz
按照帮助文档中的方法:
1 、 首先需要确认要设置什么子域名
例如主域名为dns-example.com, 要让访问者能够实现通过 www.dns-example.com 和 dns-example.com 这两个子域名进行访问
2、 登录 ​​​云解析DNS控制台​​ 3、 在域名解析列表中,单击 域名 ,进入解析设置页面
4、 在解析设置页面, 单击 添加记录

  • 记录类型:选择A记录
  • 主机记录:这里是您创建子域名的关键,例如需要创建 www.dns-example.com ,则在此处输入www即可; 如需创建dns-example.com,则在此处输入@即可。
  • 解析线路:选择默认即可;
  • 记录值: 这里输入网站服务器的IP地址(如果您不知道,可以联系您的服务器提供商或者网站空间服务商获取)
  • TTL:选择 10 分钟即可。

2.2 创建单域名

我是直接在阿里云的app上操作的,按照上面的说法主机记录输入stun即可,最终如下:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_阿里云_02

3. 阿里云免费SSL证书申请及域名设置

3.1 参考

参考这里:​​https://help.aliyun.com/document_detail/156645.html​​ 搜索数字证书管理服务->SSL证书->免费证书->购买20个即可:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_流媒体_03

之后创建证书并填写申请信息即可(免费的只支持单域名,无法带有通配符*.xxx.xxx):

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_ubuntu_04

添加域名解析并验证后即可提交审核:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_stun_05

之后等待审核通过即可,我这边很快就好了:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_流媒体_06

同样操作,再对turn.xiaoyaoyou.xyz进行一次(由于免费ssl证书只能单域名,因此需要申请两个证书,后面实际看只需要一个turn.xiaoyaoyou.xyz的就可以了):

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_turn_07

域名解析(两个单子域名的,两个ssl证书的):

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_阿里云_08

3.2 部署

部署(部署证书参考:​​https://help.aliyun.com/document_detail/98575.html​​):

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_流媒体_09

3.3 生成公钥

之后会在部署位置生成私钥、证书、证书路径:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_ubuntu_10

生成公钥的防范可以参考这里,后面公钥和证书会有用(​​https://www.fzb.me/2015-1-15-openssl-rsa.html​​):

openssl rsa -in turn_server_cert.key -pubout -out turn_server_public_key.pem

4. 阿里云Ubuntu上使用coturn创建和配置stun/turn服务

参考自:​​https://ourcodeworld.com/articles/read/1175/how-to-create-and-configure-your-own-stun-turn-server-with-coturn-in-ubuntu-18-04​

4.1 为何需要stun/turn服务简洁

在最后几天,我们需要使用 PeerJS 和 Node.js 来实现一个基于 WebRTC 的视频会议应用程序。​​正如在开始使用这项技术的官方说明​​​中提到的那样,大多数时候要使这样的应用程序工作,您将需要一种特殊的服务器来负责中继对等点之间的流量,因为有时直接套接字通常是客户端之间是不可能的(除非它们位于同一个本地网络上)。这被称为 TURN 服务器,它代表 Traversal Using Relay NAT,是一种用于中继网络流量的协议。
在本教程中,我们将向您解释如何从头开始安装和配置 coturn,以在 Ubuntu 中创建您自己的STUN/TURN 服务器。
如果没有stun服务被关停的顾虑,我们可以使用这里的免费的stun服务(也可以直接搜国内免费stun服务):
​​​https://gist.github.com/mondain/b0ec1cf5f60ae726202e​

4.2 要求

为了成功实施本教程,您必须具备以下条件:

  • 一个 Ubuntu 服务器(在我们的例子中是 20)。
  • 知道您的服务器的公共 IP,在我们的例子中,我们将使用我们的服务器公共 IP 209.126.124.122。
  • 拥有一个域并有权访问 DNS 管理器,因为您需要创建 2 个子域(在我们的例子中为:turn.xiaoyaoyou.xyz、stun.xiaoyaoyou.xyz)。
  • 子域的 SSL 证书(最好是带有通配符的证书,例如*.ourcodeworld.com,免费的ssl证书只有单域名的,所以申请两个,也可以只申请turn的)。如果没有安全协议,您的服务器实现将无法完成,并且在使用 HTTPS 在您的 WebRTC 项目上使用它之后它将无法工作,所以要聪明并避免头痛,购买 SSL 证书或使用 LetsEncrypt 获得免费证书(阿国内的云厂商一般可以申请免费的SSL证书)。

这些要求上面我们已经达到了,接下来我们继续按照步骤进行。

4.3 安装coturn

为了实现你自己的 STUN/TURN 服务器,我们将依赖 Coturn 项目。Coturn 是用于 VoIP 和 WebRTC 的 TURN 和 STUN 服务器的免费开源实现。这个项目是从 rfc5766-turn-server 项目(​​https://code.google.com/p/rfc5766-turn-server/​​​)演变而来的。有许多新的高级 TURN 规范远远超出了原始 RFC 5766 文档。本项目以 rfc5766-turn-server 的代码为起点,并为其添加了新的高级功能。
在继续安装 coturn 之前,请务必使用以下命令将 apt-get 存储库更新到其最新版本:

sudo apt-get

然后,使用以下命令安装 coturn 包:

sudo apt-get install

这将在您的服务器中安装 coturn TURN 项目,这是 TURN 和 STUN 服务器的免费开源实现。请务必在使用以下命令安装软件包后停止服务,因为安装完成后它将自动启动:

systemctl stop coturn

您现在可以跟进本教程的其余部分。有关 coturn 项目的更多信息,请务必访问​​Github 的官方存储库​​以查看文档。

4.4 启用coturn

安装完成后,需要在coturn的配置文件中启用TURN服务器。为此,请取消注释文件TURNSERVER_ENABLED中的属性/etc/default/coturn。您可以使用 vim 从终端编辑文件:

vim

4.5 备份和创建配置文件

既然开启了turn server,就需要根据自己的需要修改配置文件了。请务必备份列出coturn所有可能选项的原始配置文件,以防在其他情况下需要恢复。您可以使用以下命令来执行此操作:

# Move the original turnserver configuration file to a backup in the same directory
mv

这基本上会重命名文件。然后,继续在同一目录中创建配置文件:

vim

并在其上粘贴以下内容:

# /etc/turnserver.conf

#云主机内网IP
listening-ip=xxx
# STUN server port is 3478 for UDP and TCP, and 5349 for TLS.
# Allow connection on the UDP port 3478
listening-port=3478
# and 5349 for TLS (secure)
tls-listening-port=5349

# Require authentication
fingerprint
lt-cred-mech

# We will use the longterm authentication mechanism, but if
# you want to use the auth-secret mechanism, comment lt-cred-mech and
# uncomment use-auth-secret
# Check: https://github.com/coturn/coturn/issues/180#issuecomment-364363272
#The static auth secret needs to be changed, in this tutorial
# we'll generate a token using OpenSSL
# use-auth-secret
# static-auth-secret=replace-this-secret
# ----
# If you decide to use use-auth-secret, After saving the changes, change the auth-secret using the following command:
# sed -i "s/replace-this-secret/$(openssl rand -hex 32)/" /etc/turnserver.conf
# This will replace the replace-this-secret text on the file with the generated token using openssl.

# Specify the server name and the realm that will be used
# if is your first time configuring, just use the domain as name
#云主机内网ip
relay-ip=xxx
#云主机公网IP
external-ip=xxx

# Important:
# Create a test user if you want
# You can remove this user after testing
user=admin:admin

total-quota=100
stale-nonce=600

# Path to the SSL certificate and private key. In this example we will use
# the letsencrypt generated certificate files.
#ssl证书路径
cert=/ssl/turn_server_cert.pem
#ssl公钥路径
pkey=/ssl/turn_server_public_key.pem

# Specify the process user and group
proc-user=turnserver
proc-group=turnserver

这种基本配置通常可以满足大多数需求,但是如果您需要配置其他内容,请务必​​访问此处的配置属性的官方文档​​​。不要忘记,在这种情况下,我们在文件中包含了一个测试用户,以便稍后测试 TURN 服务器,但是您可以随意删除它并在以后使用turnadmin.
至此,我们需要在服务器上配置的所有内容都应该完成。

4.6 在您的 DNS 管理器上创建 stun/turn DNS 记录

正如我们在文章开头提到的,您需要拥有一些将托管 STUN/TURN 服务器的域。您将需要使用 turn 和 stun 作为主机创建 2 个新的 A 记录,分别指向您服务器的公共 IP(这个我们在子域名设置时也已经做过了):

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_stun_11

4.7 使用turnadmin创建一个长期用户

​Turnadmin​​包含在 coturn 的默认软件包中,此应用程序是一个 TURN 中继管理工具,可让您管理您的turn/stun服务器的用户。客户端需要凭据才能连接到您的转向服务器,因此您可以像这样注册它们:

sudo

例如,要创建一个测试用户,我将运行以下命令(用户名 test、xiaoyaoyou.xyz 和密码 12345):

sudo turnadmin -a -u test -r xiaoyaoyou.xyz -p 12345

请注意,我们之前在文件上创建了一个用户,/etc/turnserver.conf使用纯文本将用户名设置为admin和密码admin。

4.8 开启coturn服务器

创建用户并正确配置 coturn 后,您将能够启动服务,以便客户端可以连接到它。使用以下命令继续初始化服务:

systemctl start coturn

这将在服务器中启动 coturn 的服务。您可以使用以下命令检查服务的状态:

systemctl status coturn

应该输出类似于:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_ubuntu_12

4.9 测试turn/stun服务器

幸运的是,有一个很棒的在线工具可以让你检查 STUN/TURN 服务器的功能。这个工具是​​Trickle ICE​​​,一个 WebRTC 页面项目,用于测试常规 WebRTC 实现中的滴流 ICE 功能。它使用指定的 ICEServers 创建一个 PeerConnection(其中将包含我们最近实现的服务器的信息),然后开始为具有单个音频流的会话收集候选人。在收集候选人时,它们会显示在下面的文本框中,并显示候选人收集何时完成。
要开始使用,请在新的浏览器选项卡中打开工具网站并开始填写 ICE 服务器表格。在表单中,您需要分别提供 STUN 或 TURN URI 和凭据(仅适用于 TURN 服务器),如下所示:

//非加密端口
stun:stun.xiaoyaoyou.xyz:3478
turn:turn.xiaoyaoyou.xyz:3478
//加密端口
stun:stun.xiaoyaoyou.xyz:5349
turn:turn.xiaoyaoyou.xyz:5349

如您所见,URI 遵循protocol:domain:port. 表格将这样填写:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_stun_13

然后在页面底部的 ICE 选项中,按 Gather Candidates 按钮运行测试:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_ubuntu_14

测试应该生成类似于:

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_ubuntu_15

就像网站这里说的(stun服务产生srflx,turn产生relay类型数据):
If you test a STUN server, it works if you can gather a candidate with type “srflx”. If you test a TURN server, it works if you can gather a candidate with type “relay”.

4.10 注意事项

  • 确保您的服务器已打开端口 5349 和 3478。

在阿里云Ubuntu中使用coturn创建和配置您自己的STUN/TURN服务_stun_16

5. 最后

接下来我们或许会利用搭建好的stun/turn服务做一些小项目,比如开头提到的视频会议。