Show HN: 搭建一个近乎免费的开源 TURN Server
[中文正文内容]
如何自托管一个(几乎)免费的开源 TURN Server:
这里发布的 WebRTC 实现依赖于 PeerJS Cloud Server。它相当可靠(我已经超过5年没有看到任何重大中断),但是将自己连接到别人的项目中总是会带来一定的风险——如果他们决定放弃他们的项目,那么这个页面将会消失,可能没有太多警告。
另一个担忧是,Cloud Server 在需要时依赖于 Google 的 TURN Server。Google 有终止服务的历史,有时几乎没有或根本没有通知。此外,有些人对通过与“大 G”相关的任何东西运行其数据存在隐私问题。
那么,是否有可能创建一个独立的、完全由您控制的开源 TURN Server,而且花费最少?答案是肯定的,但可能具有讽刺意味的是,在这里我们依赖于 Oracle Cloud Infrastructure (OCI) 的免费层。 很多人过去都被 Oracle 伤害过,因为他们也有终止服务的历史。如果您要这样做,最好在其他地方保留备份。
无论如何。以下是我所做的:
1. 获取一个域名
您稍后将需要它,因为您将需要 SSL。这是此列表中唯一需要花钱的东西。周围有很多提供商和很多选择,我们不在此处详细介绍。基本上,只需找到一个您喜欢的名称并付费注册即可。
2. 注册 Oracle 免费层
您可以在这里进行注册。您将需要输入信用卡信息,但是如果您从不注册其他服务或单击“升级帐户”按钮,您将永远*停留在免费层上。免费层足以满足我们在此处所做的事情所需的计算资源。
- 或者,至少他们目前是这么说的……
3. 创建新的子网
设置好您的 Oracle 帐户后,您要做的第一件事是为您的服务器创建一个新的子网。如果您要创建更多 VM,这一点尤其重要。OCI 中的端口安全性是通过安全列表处理的,这些安全列表随后分配给子网。位于同一子网上的所有机器都将具有相同的可访问端口(在服务器端,稍后会详细介绍),并且此 TURN Server 需要打开一系列相当奇特的端口。如果您不熟悉子网划分,请参阅此简要概述。您分配到的 Virtual Cloud Network 可能具有如下所示的 IPV4 块:10.0.0.0/16,这意味着有 65,534 个可用的 IP 地址。您需要将其中一些 IP 地址划分为一个单独的池(一个子网),因此在创建该子网时,您需要指定第一个 IPv4 CIDR 块将为 10.0.0.0/24(为您提供 254 个可用 IP)。第二个子网可以是 10.0.1.0/24(为您提供第二个 254 个可用 IP 的“池”)。
从主菜单中,单击左上角的“汉堡”菜单,然后单击“Networking”,然后单击“Virtual cloud networks”: 
您将看到默认的 VCN(在免费层中您只能有一个)。单击它,然后单击左侧菜单上的“Subnets”(如果尚未选择)。您将看到列出的默认子网,可能 IPv4 CIDR 块为 10.0.0.0/24。如果 /24 是任何其他数字,请单击右侧的 3 个点进行编辑,然后将 Mask 更改为 24 并保存更改。返回主屏幕,单击 Create New Subnet,为其命名(TURN Server Subnet 即可),指定 IPv4 CIDR 块为 10.0.1.0/24,然后单击 Create Subnet 按钮。返回主屏幕,单击左侧菜单上的“Security Lists”
4. 创建安全列表
安全列表就像您子网的防火墙一样——它规定允许哪种类型的流量转到哪些端口。如果某些内容未在此处明确允许,则将被拒绝。我们运行的机器将托管 4 个服务器 - PeerJS,它围绕 WebRTC 通信协议放置了一个包装器,CoTurn 中继服务器,当主机位于 NAT 后面时,它有助于点对点通信,coturn-credential-api 凭据服务器,您可以将其与 CoTurn 的 REST API 结合使用,以要求对服务器进行身份验证并防止滥用,以及 nginx Web 服务器,我们将使用它来提供网页服务。每个都需要可访问,因此需要打开端口。我们还将打开几个端口用于连接测试。
单击 Create Security List 按钮,然后单击“add another ingress rule”并输入以下内容(请注意,一旦您输入了一条规则的信息,底部就会有一个“Add another ingress rule”按钮:
Source CIDR | IP Protocol | Destination Port Range | Description ---|---|---|--- All | TCP | 3478 | TLS TCP Listening port for Coturn Server All | UDP | 3478 | TLS UDP Listening port for Coturn Server All | TCP | 5349 | DTLS TCP Listening port for Coturn Server All | UDP | 5349 | DTLS UDP Listening port for Coturn Server All | UDP | 49152-65535 | Coturn relay ports All | TCP | 22 | SSH communication with the server All | TCP | 9000 | PeerJS server listening port All | UDP | 9000 | PeerJS server listening port All | TCP | 80 | Webserver unsecure port (http://) All | TCP | 443 | Webserver secure port (https://) All | ICMP | N/A | Used to "ping" server
输入所有规则后,单击底部的“Create Security List”按钮。返回主屏幕,单击左侧菜单上的“Subnets”,然后单击您刚刚创建的子网的名称,然后单击“Add Security list”按钮,从菜单中选择您刚刚创建的列表,然后单击底部的“Add Security List”按钮。
5. 保存配置
所以现在终于可以实际制作服务器了!现在的诱惑是立即创建一个 Instance(Oracle 称之为 Virtual Machine),但有时当您尝试这样做时,Oracle 暂时没有空间,并且该过程失败,这意味着您必须从头开始重新开始。因此,只需多单击几下,我们就可以保存配置,并随时单击按钮重试。
从左上角的汉堡菜单中,选择 Compute”,然后选择“Instance Configurations”,然后单击“Create Instance configuration”按钮。在继续之前,请注意以下几点:在撰写本文时,您基本上拥有相当于 4 个 OCPU 和 24 GB 的内存可供使用。这是在您的整个帐户中,以及您如何使用它们取决于您。您可以制作一台具有 4 个 OCPU 和 24 GB 内存的机器,也可以制作 4 台每台具有 1 个 OCPU 和 6 GB 内存的机器。您可以稍后编辑这些数量,但此时值得牢记。给配置命名并移至下面的部分。
选择镜像
在“Image and shape”部分中,单击链接进行编辑。单击“change image”按钮,选择“Ubuntu”,然后选中您可以看到的最新 Canonical Ubuntu 版本的旁边的框(可以通过单击右侧的向下箭头来查看构建号,但是列表顶部的任何内容都可以),然后单击底部的“Select image”按钮。
选择 Shape
返回主屏幕,单击“Change shape”按钮。选择“Ampere (Arm-based processor)”并选中列表中显示的形状旁边的框(撰写本文时为 VM.Standard.A1.Flex)。下面会出现一个部分,您可以在其中配置服务器将使用的 CPU 和内存量。这完全取决于您,但是 1 个 OCPU 和 9GB 内存就可以正常工作。如果您不打算在免费层中创建任何其他 VM,则不妨使用 4 个 OCPU 和 24 GB 内存将其最大化。完成后,单击“Select shape”。
指定子网
在 Primary VNIC information 部分中,保留所有默认设置,但在底部确保显示的子网是您刚刚创建的子网——上面给出的示例名称是“TURN Server Subnet”——而不是默认子网。此步骤非常重要。 如果机器是在错误的子网上创建的,除了删除它并重新开始,您无能为力。
添加 SSH 密钥
保留 Primary VNIC IP addresses 部分为默认设置,然后转到“Add SSH keys”部分。SSH 是您将如何从本地计算机与远程服务器交互。如果您已经有要用来访问此服务器的 SSH 密钥,请选择 upload public key files 并执行此操作。否则,选择“Generate a key pair for me”并将私钥保存在您会记住的地方,并使用一个有意义的名称——在此示例中,我们将使用 turn_server.key。
将其余所有内容保留为默认设置,然后单击屏幕底部的“Create”按钮。
创建服务器
现在,单击您刚刚创建的配置的名称,然后单击“Launch instance”按钮。这将打开一个与您刚刚使用的 Instance 配置屏幕类似的屏幕。您可能会注意到底部有一个小窗口,其中包含一个成本摘要,告诉您引导卷每月将花费几美元。这是由于成本分析工具中的一个错误,您可以忽略它——您不会为上述配置付费。
单击“Create”按钮。运气好的话,您将被带到另一个屏幕,该屏幕将显示“Provisioning”约一分钟左右,然后显示“Running”。如果您停留在同一屏幕上并收到 Out of Capacity 错误,请尝试再次单击 Create 按钮。如果您收到相同的错误,请将其放置半小时后再试一次。容量不足错误过去非常常见,但是似乎 Oracle 释放了更多空间,并且您通常可以在第一次尝试时运行 Instance。如果遇到长时间的延迟,您可以考虑使用 Python 自动化该过程,或者如果您正在寻找更简单的东西,自动答题器可能会起作用,前提是您在显示 Create 按钮的页面上 - 只需将其粘贴到您的控制台中,然后按 Enter:
setInterval(function(){document.querySelectorAll(".oui-button.oui-button-primary")[1].click()},60000)
测试服务器
无论您以哪种方式创建它,您现在都应该看到正在运行的服务器屏幕。从屏幕右侧复制公共 IP 地址,打开命令提示符并尝试 ping 您的服务器:

太棒了。我们有连接。让我们通过 SSH 进入服务器并开始设置它。
6. 通过 SSH 访问服务器
在命令提示符中,导航到您保存私有 SSH 密钥文件的文件夹,然后输入以下命令,替换您保存的密钥文件的名称和 IP 地址:
ssh -i your_private_key_name.key ubuntu@your_public_ip_address
键入“yes”。如果一切都按计划进行,您现在应该看到一个带有用户名 ubuntu 的 Linux 命令提示符。最有可能的是,会有一条消息说更新列表已过时。这是因为 Oracle 发布了您使用的 VM 映像有一段时间了。无论如何,最好保持系统更新,因此请运行以下命令并等待一段时间,直到它执行:
sudo apt update && sudo apt upgrade
7. 启动 Web 服务器
配置 DNS
既然您已经有了 IP 地址,就可以设置 DNS 以将您的域名指向它。这似乎为时过早,但是 DNS 更改需要一段时间才能通过网络传播,因此我们不妨现在就进行操作,并且可以在生效时处理其他事情。只需登录到您购买域名的帐户,找到可以编辑(或创建)A 记录的部分,并确保您有一个 A 记录,其中您的域名作为主机名(没有 http...,例如 example.com)和您的公共 IP 地址作为值。为了便于此时,添加另一个 A 记录,其中包含您的域名加上 www(因此是 www.example.com)和您的公共 IP 地址作为值。作为快速检查以查看更改是否已传播,您可以 ping 您的域名 - 如果结果返回显示您的公共 IP 地址,则您已成功。有时它是即时的,有时需要一段时间。如果花费的时间超过几个小时,则可能值得与您的域名托管公司联系,以查看是否存在问题。
安装 nginx
我们将使用 Web 服务器来做一些事情,虽然有一些选择,但 nginx 可以满足我们所有的需求。要安装它,只需运行:
sudo apt install nginx
完成后,检查状态:
systemctl status nginx
打开一些端口
您现在可能会想尝试通过将浏览器指向您的 IP 地址来访问 Web 服务器。别着急!与您的安全列表非常相似,您服务器上的端口配置为拒绝所有流量,除非允许它。您可以通过发出以下命令来列出打开的端口:
sudo iptables -t filter -nv -L INPUT --line-numbers
Web 上的许多教程都会告诉您,这就是您想要做的事情:
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
运行它,然后运行但先前的命令以列出打开的端口。您会看到问题在于 -A 标志将规则附加到列表的末尾,在 REJECT all 规则之后。因此,数据包永远不会到达此规则。我们想要做的是在拒绝语句之前插入规则,最简单的方法是使用 -I 标志,然后是您要插入规则的行号(这里我们使用 2,因此这些规则将最终出现在 INPUT 和 OUTPUT 链的第 2 行和第 3 行上)。以下是 nginx 需要的四个规则:
sudo iptables -I INPUT 2 -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I OUTPUT 2 -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 2 -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I OUTPUT 2 -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
使用 --line-numbers 标志列出规则的另一个优点是,您可以通过行号删除规则。如果我们想删除 INPUT 链上的第 20 条规则,我们可以这样做:
sudo iptables -D INPUT 20
我们要做的另一件事是 iptables:默认情况下,这些规则不是持久的,因此如果您曾经重新启动服务器,您将不得不再次设置它们。您需要通过调用此命令将更改保存到您的 iptables 文件:
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
现在您已准备好检查您的 Web 服务器 - 如果您可以成功 ping 您的域名,则应该能够浏览到它。导航到 http://your_domain_name。您可能会看到一条可怕的消息,提示该站点不安全。我们很快就会解决这个问题。只需单击“Proceed anyway”(或类似内容,具体取决于浏览器)。如果您可以看到“Welcome to nginx”页面,则可以继续下一步 :)
安装 TLS 证书
为了消除可怕的警告消息,我们需要安装 TLS 证书,以便我们的普通 http 站点将使用更安全的 https 协议。值得庆幸的是,EFF 的工作人员使此过程非常简单。您可以在此处阅读详细说明,但基本上:
sudo snap install --classic certbot 安装 Certbot 工具
sudo ln -s /snap/bin/certbot /usr/bin/certbot 确保可以运行 Certbot
sudo certbot --nginx 获取证书,询问您一些配置问题并打开 https
sudo certbot renew --dry-run(可选)测试自动续订过程 - 运行此程序,您应该始终拥有有效的证书
如果一切正常,您现在应该能够刷新您的浏览器页面,您会看到您的站点正在使用 https 协议提供服务
8. 制作一个示例 Web 应用程序
获取 Web 文件文件夹的所有权
现在是开始将一些文件上传到我们的 Web 服务器的时候了,但是在执行此操作之前,我们想接管 nginx 用于提供网页的目录的所有权。如果我们不这样做,我们将必须在每个命令的开头添加“sudo”,这很烦人。Web 文件的默认位置在 /var/www/html 中,因此要检查所有权,我们可以运行
ls -l /var/www/html
我们看到 root 是所有者。要更改这一点,我们将目录及其内部的所有内容的所有者更改为当前登录的用户:
sudo chown -R $USER /var/www/html
当我们在您时,为示例应用程序创建一个文件夹:mkdir /var/www/html/peertest
上传示例应用程序
以下是一个带有简单 WebRTC 聊天应用程序的 HTML 页面,我们可以使用它来测试连接:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Simple RTC Chat</title>
<style>
#peer_id{display:none}
#chat_id{display:none;}
</style>
</head>
<body>
<h1>Simple RTC Chat</h1>
<div id ="info"></div>
<div id ="id_div">Choose an ID: <input id ="myid"/>
<button id = "sub_id_btn">Submit</button>
</div>
<div id ="peer_id">Enter your friend's ID or wait for a connection:
<input id ="peerid"/><button id = "sub_peer_btn">Submit</button>
</div>
<div id="chat_id">Enter message:
<input id ="msg"><button id = "send_msg">Send</button><br><textarea id="chat" rows="50" cols="50"></textarea>
</div>
<script src="https://unpkg.com/peerjs@1.5.4/dist/peerjs.min.js"></script>
<script>
(function() {
let peer = null;
function getById(str) {
return document.getElementById(str)
}
getById("chat").value = "";
getById("sub_id_btn").onclick = function() {
peer = new Peer(getById("myid").value);
getById("id_div").style.display = "none";
getById("peer_id").style.display = "block";
peer.on('connection', function(conn) {
setConnection(conn);
});
}
getById("sub_peer_btn").onclick = function() {
conn = peer.connect(getById("peerid").value);
conn.on('open', function() {
setConnection(conn);
});
}
function setConnection(conn) {
getById("info").innerHTML="Connected as "+peer.id+", chatting with "+conn.peer;
getById("chat_id").style.display = "block";
getById("peer_id").style.display = "none";
getById("send_msg").onclick = function() {
let msg = peer.id + ": " + getById("msg").value + "\n";
getById("chat").value += msg;
conn.send(msg);
}
conn.on('data', function(data) {
getById("chat").value += data;
});
}
})()
</script>
</body>
</html>
在您的计算机上将其保存为“index.html”文件名,并保存在与保存私有 SSH 密钥的文件夹相同的文件夹中。您可以通过在浏览器中打开它并在另一个选项卡中打开另一个副本来尝试一下。在真实的应用程序中,您将进行更多错误处理 - 这里要注意的一个大问题是确保两个连接使用不同的 ID。
要将文件上传到您刚刚创建的文件夹,请打开一个常规命令提示符(而不是您用于 SSH 进入服务器的命令提示符),导航到包含 index.html 和私钥文件的目录,然后发出以下命令:
scp -i your_private_key_name.key index.html ubuntu@your_public_IP:/var/www/html/peertest
如果一切正常,您现在应该可以在 https://your_domain_name/peertest 访问该页面
8. 安装您自己的 PeerJS 服务器
如前所述,以我们上面的方式使用 PeerJS 意味着它会连接到 PeerJS 服务器,而 PeerJS 服务器本身在需要时会使用 Google 的 TURN 服务器。为了更好地控制堆栈,我们需要创建我们自己的 PeerJS 服务器。您可以在此处查看项目页面,但基本上:
安装 npm 和 PeerJS 服务器
PeerJS 服务器可通过 Node Package Manager 获得,而 Node Package Manager 本身依赖于 node.js,因此我们需要进行一些安装。但是首先我们有一个问题。我们可以运行 sudo apt-cache policy nodejs 来查看如果我们从存储库安装它会得到什么版本的 nodejs,并且输出告诉我们我们将获得:
Candidate: 10.19.0~dfsg-3ubuntu1.6 但是当我们查看 npm 中的 PeerJS 时,它说我们需要 14 或更高版本:
因此,我们需要从源代码直接通过另一种方式安装。版本 20 是撰写本文时最新的版本,因此让我们选择它...:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs
从 nodesource 安装的好处是 npm 已经安装好了,因此现在我们可以立即安装 peer...
sudo npm install peer -g
测试 PeerJS 服务器
使用以下命令启动服务器:
peerjs --port 9000 --key peerjs --path /myapp
然后将您的浏览器指向 http://your_domain_name:9000/myapp - 如果一切正常,您将获得一个小的 JSON 响应,其中包含有关 PeerJS 名称、描述和网站的详细信息。
因此它可以工作,但是有两个问题:
- 服务器作为前台进程运行。在终端中返回命令提示符或关闭终端窗口将意味着终止服务器
- 我们正在使用不安全的 http 协议
按 Ctrl + C 停止 PeerJS 服务器,然后键入以下命令以打开一个屏幕会话。Screen 是一个程序,允许我们将进程推送到后台,无论我们对主终端窗口做什么,它们都会继续运行。我们将给我们的会话命名,以便以后更容易引用它。您可以使用 -S 标志执行此操作:
screen -S peerjs_screen
应该打开一个常规的空命令提示符。现在我们可以启动服务器,但是为它提供我们先前从 certibot 获得的 ssl 证书,以确保连接安全:
sudo peerjs --port 9000 --key peerjs --path /myapp --sslkey /etc/letsencrypt/live/your_domain_name_here/privkey.pem --sslcert /etc/letsencrypt/live/your_domain_name_here/fullchain.pem
服务器应该启动。按 Ctrl + a,然后按 d 从屏幕分离,这应该会使您返回到主终端窗口。现在您可以测试 https://your_domain_name:9000/myapp - 它应该返回与您浏览到 http 版本时获得的相同响应。
将 Web 应用程序指向您的 PeerJS 服务器
在文本编辑器(如 nano)中打开您的应用程序的 index.html 文件:
nano /var/www/html/whatever_you_called_your_app_directory/index.html
并查找此行:peer = new Peer(getById("myid").value); 我们想将其更改为:
peer = new Peer(getById("myid").value,
{host: "your_domain_name",
port: 9000,
key: "peerjs"
secure: true,
path: "/myapp"
});
保存您的更改(Ctrl + o,按 Enter 确认),刷新您的网页并测试连接。它应该与以前一样连接。您可以通过重新连接屏幕会话来查看服务器连接:
screen -r peerjs_screen
9. 安装您自己的 STUN/TURN 服务器
我们几乎已经获得了端到端控制,唯一缺少的是 PeerJS 仍然使用 Google 服务器。但是我们可以告诉它使用我们自己的 coturn 实现。
安装和配置 coturn:
安装很简单:
sudo apt install coturn
保存配置文件的全新副本,以防万一:
sudo cp /etc/turnserver.conf /etc/turnserver_bak.conf
编辑配置文件:
sudo nano /etc/turnserver.conf
您会看到此处有很多选项。作为最小示例,您可以保留大多数注释掉,并仅取消注释以下行:
listening-port=3478
tls-listening-port=5349
listening-ip=the_Private_IPv4_address_of_your_Oracle _instance
external-ip=the_Public_IPv4_address_of_your_Oracle _instance
verbose
fingerprint
user=turnuser:turn456
log-file=/var/log/turn.log
simple-log
保存更改,然后重新启动 coturn 服务器:
sudo systemctl restart coturn
打开 coturn 端口
返回我们的 iptables。我们需要打开 3478 和 5349 侦听端口,以及 udp 中继终结点(在配置文件中默认设置为 49152-65535)
sudo iptables -I INPUT 2 -p tcp --dport 3478 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 2 -p udp --dport 3478 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 2 -p tcp --dport 5349 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 2 -p udp --dport 5349 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -I INPUT 2 -p udp --dport 49152:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
测试 coturn 服务器连接
我们可以使用 Trickle ICE 测试连接。
让我们从最简单的测试开始:在 STUN 或 TURN URI 框中输入 STUN:your_domain_name:3478,单击“Add server”,向下滚动并单击“Gather cadidates”。在输出中,应该列出一个 srflx 类型响应:
让我们测试 TURN 服务器:在 STUN 或 TURN URI 框中输入 TURN:your_domain_name:3478,在用户名框中输入 turnuser,在密码框中输入 turn456(这些在您的配置文件中定义),然后单击“Add server”,向下滚动并单击“Gather cadidates”。在输出中,可能会再次列出一个 srflx 类型响应,以及一个中继类型:
很酷。因此,我们可以连接到端口 3478,但是我们真正想连接到 TLS 侦听端口 5349。即使是一个简单的 STUN 测试也会失败。我们需要在配置文件中包含 SSL 文件的路径,但是这里有一些令人讨厌的事情:Let's Encrypt 文件夹(它们当前保留在该文件夹中)归 root 所有,并且 coturn 无权访问它,即使 root 用户启动它也是如此。这里有两个不太好的选择:一个选择是编辑 /lib/systemd/system/coturn.service 文件,并将 User 和 Group 设置为等于 root,以便 coturn 以 root 身份运行。如果这看起来有点极端,请创建一个新文件夹,将文件复制到该文件夹,然后更改权限,以便 turnserver 可以访问它们:
sudo mkdir /etc/turnservercerts
sudo cp /etc/letsencrypt/live/your_domain_here/fullchain.pem /etc/turnservercerts
sudo cp /etc/letsencrypt/live/your_domain_here/privkey.pem /etc/turnservercerts
sudo chown turnserver:turnserver /etc/turnservercerts -R
sudo chmod 600 /etc/turnservercerts -R
无论您选择哪种方式,您都将这两个行添加到配置文件中(如果选择了第一个“以 root 身份运行”选项,则使用指向原始密钥文件的路径):
pkey=/etc/turnservercerts/privkey.pem
cert=/etc/turnservercerts/fullchain.pem
保存更改,然后重新启动 coturn:
sudo systemctl restart coturn
现在让我们尝试在 STUN 或 TURN URI 框中输入 TURN:your_domain_name:5349,在用户名框中输入 turnuser,在密码框中输入 turn456:
如果一切看起来都不错,那么是时候编辑我们的 Web 应用程序以将其指向我们的 coturn 服务器了。
10. 将您的 Web 应用程序指向您的 coturn 服务器
PeerJS 允许我们指定我们想要在连接到 PeerJS 服务器时使用的 STUN 和 TURN 服务器。目前,我们的 index.html 创建一个 Peer 对象,如下所示:
peer = new Peer(getById("myid").value,
{host: "your_domain_name",
port: 9000,
key: "peerjs",
secure: true,
path: "/myapp"
});
我们想将其更改为:
peer = new Peer(getById("myid").value,
{host: "your_domain_name",
port: 9000,
key: "peerjs",
secure: true,
path: "/myapp",
config: {
iceServers: [
{
urls: "stun:your_domain_name:5349",
},
{
urls: "turn:your_domain_name:5349",
username: "turnuser",
credential: "tu



