中继投屏服务器部署

⚠️ 观看提示:哔哩哔哩默认 360P 清晰度,建议手动切换至 720P 或高清画质

针对极少数设备P2P(NAT 穿透)失败的情况的备用方案。


概述

P2P 连接条件说明

本地投屏(同一局域网内)

  • 局域网 IPv4 ⇆ 局域网 IPv4
    控制端和被控端在同一局域网下,支持直接建立 P2P 连接,无需中继服务器。

远程投屏(不同网络环境)

网络类型是否可直接 P2P是否需中继服务器
公网 IPv6 ⇆ 公网 IPv6✅ 是❌ 否
公网 IPv4 ⇆ 公网 IPv6✅ 是❌ 否
公网 IPv4 ⇆ 局域网 IPv4✅ 是(支持 NAT 穿透)❌ 否

必须使用中继服务器的场景

网络类型原因
局域网 IPv4 ⇆ 局域网 IPv4(不同 NAT)❌ 无公网地址,无法实现 NAT 穿透
局域网 IPv4 ⇆ 公网 IPv6❌ 地址族不一致,且无公网 IPv4 地址

检查电脑/手机网络信息

  1. 打开浏览器访问: http://cloud.jsdevhub.com/#/network
    推荐使用 Chrome 浏览器。若在后续步骤中点击“收集候选项”无结果,请尝试更换浏览器。
  2. 点击 收集候选项 查看 IP 信息:
    • ✅ 有公网 IPv6 → 可直接建立远程 P2P 连接
    • ❌ 无公网 IPv6 → 需继续排查或搭建中继服务器

常见的网络类型

支持公网 IPv6 的网络:大多数移动、联通、电信的手机卡、全网通流量卡、宽带以及共享路由器网络均支持公网 IPv6 地址,通常能够顺利建立 P2P 直接连接,无需中继服务器。

部分路由器未开启公网 IPv6 功能:需登录路由器管理后台手动开启,开启后建议重启路由器以确保生效。

支持公网 IPv6 的云手机示例:星界链云、移动云等。
支持公网 IPv4 的云手机示例:芒果云。

🛑 无法建立 P2P 直接连接的网络场景包括:少数物联卡、单网流量卡,以及部分云手机(如天翼云、鲨克云),这些网络仅具备局域网 IPv4 地址,缺乏公网 IPv6 支持,导致无法实现直接 P2P 连接。


部署教程

在 CentOS 8 及 Ubuntu 24 上搭建投屏中继服务器

准备阶段

购买云服务器(阿里云、百度云、腾讯云、华为云、AWS 等)

  • 推荐配置:
    • 2 核 CPU
    • 2G 内存
    • 5Mbps 带宽
    • CentOS 8
  • 带宽可根据同时投屏数量选择合适的带宽,有条件的用户可选择联通宽带(带公网 IPv4),无需购买服务器。
本教程命令基于 CentOS 8 / Ubuntu 24 演示,其他 Linux 发行版(如 Debian)同样适用,部分命令可能需要根据包管理器调整。

购买步骤:

  1. 打开云服务器提供商官网自行购买
  2. 推荐服务器区域:华东、华北、香港、北京,选择离用户最近区域,延迟更低
  3. 操作系统选择:CentOS 8 64位
  4. 设置 root 密码 并开通实例。

下载并安装连接工具(Windows)

推荐工具:Xshell 6 、 Xftp 6 安装教程:https://blog.csdn.net/weixin_57558097/article/details/127416711

连接服务器

  1. 打开 Xshell
  2. 新建会话
  3. 填写服务器信息
    • 主机:阿里云公网IP
    • 协议:SSH
    • 端口:22
    • 用户名:root
    • 密码:服务器密码

部署 Coturn 服务

Coturn 是一个开源的 STUN/TURN 服务器。以下步骤适用于 CentOS 系统

卸载旧版本 Coturn(如有)

sudo yum remove coturn -y

安装 Coturn

# 安装 EPEL(Extra Packages for Enterprise Linux)扩展源
sudo yum install -y epel-release

# 安装 Coturn TURN/STUN 服务器
sudo yum install -y coturn

常见错误

遇到以下错误时,表示 CentOS 8 无法解析 mirrorlist.centos.org,导致 yum 更新失败:

Errors during downloading metadata for repository 'appstream':
  - Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock [Could not resolve host: mirrorlist.centos.org]
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Curl error (6): Couldn't resolve host name for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock [Could not resolve host: mirrorlist.centos.org]

若遇到此问题,可通过以下步骤来解决:

# 1. 备份现有 repo 文件
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

# 2. 下载阿里云 CentOS 8 Vault 镜像源(含 Base、AppStream、Extras 等)
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

# 3. 清理旧缓存
yum clean all

# 4. 生成缓存
yum makecache

确认配置文件路径

sudo find /etc -name "turnserver.conf"

一般 CentOS 为 /etc/coturn/turnserver.conf,Ubuntu 为 /etc/turnserver.conf

查看服务器内外网 IP 地址

# 安装 net-tools 工具包,提供 ifconfig 命令
sudo yum install net-tools -y

# 查看本机的网络接口信息(主要用于获取内网 IP)
ifconfig

# 获取本机公网 IP(从外部服务查询,适用于云服务器等有公网出口的机器)
curl ifconfig.me

# 🔸 也可以登录服务器提供商的控制台后台(如阿里云、腾讯云、AWS 等)查看分配给该实例的公网 IP
  • 内网 IP:在 inet 192.168.x.x 处查看。
  • 公网 IP:使用 curl ifconfig.me 或登录云服务商查看。

编辑 Coturn 配置文件

#安装 nano 编辑器
sudo yum install -y nano

sudo nano /etc/coturn/turnserver.conf

建议配置如下(请根据实际情况替换内网 IP、公网 IP,并设置自定义 TURN 账号和密码):

# 内网监听地址
listening-ip=192.168.0.198

# 公网出口地址
external-ip=191.191.191.191

# 设置TURN 账号密码
user=admin:123456  

# 默认端口
listening-port=3478

# 中继端口范围(必须)
min-port=49152
max-port=65535

# 鉴权机制
lt-cred-mech

# 域名或 IP 作为认证域
realm=191.191.191.191

# 开启调试日志
verbose
fingerprint

开放服务器防火墙和安全组端口

确保云平台和防火墙规则中开放以下端口:

  • TCP/UDP 3478:Coturn 默认端口
  • UDP 49152–65535:中继媒体流端口范围
  1. 服务器防火墙放行端口(以 CentOS/firewalld 为例)
# 检查 firewalld 是否正在运行
sudo systemctl status firewalld

# 如果 firewalld 未运行,执行以下命令启动它
sudo systemctl start firewalld

# 开放 端口(TCP 22 )
sudo firewall-cmd --permanent --add-port=22/tcp

# 开放 Coturn 默认 STUN/TURN 端口(UDP 3478)
sudo firewall-cmd --permanent --add-port=3478/udp 
# 开放 Coturn 默认 STUN/TURN 端口(TCP 3478)  
sudo firewall-cmd --permanent --add-port=3478/tcp

# 开放 TURN 中继端口范围(UDP 49152-65535)
sudo firewall-cmd --permanent --add-port=49152-65535/udp

# 开放 TURN 中继端口范围(TCP 49152-65535)
sudo firewall-cmd --permanent --add-port=49152-65535/tcp

# 应用上述防火墙规则变更
sudo firewall-cmd --reload
  1. 云服务商控制台安全组放行端口(必做)

云服务器默认会通过安全组拦截外部端口访问,即使本地防火墙已放行,外部设备依然无法连接。

请在云服务商控制台(阿里云、腾讯云、华为云、AWS 等)添加安全组规则,放行 UDP/TCP 端口

说明:安全组是云服务器的外层防火墙,必须单独配置,不可省略。若你的服务器没有安全组,只需放行系统本地防火墙即可,此步骤可跳过。

启动与重启 Coturn 服务

  • 启动服务:
sudo systemctl start coturn
  • 重启服务(配置修改后必须重启):
sudo systemctl restart coturn
  • 查看状态:
sudo systemctl status coturn

使用 turnserver 命令手动运行(调试用)

你可以通过命令行直接运行 Coturn,适用于测试和调试阶段,应先停止服务:

# 1. 先停止 systemctl 管理的服务
sudo systemctl stop coturn

# 2. 手动以调试模式运行(前台运行,输出到终端)
sudo turnserver -v -r 191.191.191.191 -a -o -c /etc/coturn/turnserver.conf  --no-tls --no-dtls


# 3. 调试完成后,重新用 systemctl 启动
sudo systemctl start coturn

⚠️ 请将 191.191.191.191 替换为你服务器的公网 IP 地址。

参数说明

参数含义
-v显示详细日志(verbose 模式)
-r 191.191.191.191指定认证域,通常 STUN/TURN 服务器使用公网 IP 而非域名
-a启用长期认证(long-term credentials)
-o将日志信息输出到标准输出(stdout)
CentOS -c /etc/coturn/turnserver.conf
Ubuntu -c /etc/turnserver.conf
指定配置文件路径

测试 TURN 服务

打开测试页面 使用浏览器访问测试网页:http://cloud.jsdevhub.com/#/network

添加中继服务器地址

在“中继服务器”地址输入框中填写 TURN 服务器地址,格式如下:

turn:公网IP:端口

示例:

turn:191.191.191.191:3478

填写认证信息

  • 用户名:admin
  • 密码:123456

(请替换成你 Coturn 配置文件中 user=admin:123456 对应的账号密码)

添加服务器

点击“添加服务器”按钮,将 TURN 服务器添加到候选服务器列表。

选择添加的 TURN 服务器

点击“获取候选项”按钮,开始进行连接测试。

确认测试结果

  • 如果看到类型(type)中出现 relay,并且对应的公网 IP 地址为 191.191.191.191(你的 TURN 服务器公网 IP),说明中继服务器成功响应。这表明你的 TURN 服务搭建成功,能够为客户端提供中继转发功能。
  • 如果没有出现 relay 类型:
    • 请检查防火墙和安全组端口是否开放(UDP/TCP 3478 及中继端口范围)。
    • 确认 Coturn 服务是否正常运行。
    • 确认配置文件中用户和密码是否正确。

设置 Coturn 开机自启

# 启用 Coturn 开机自启
sudo systemctl enable coturn

# 检查 Coturn 是否已设置为开机启动
sudo systemctl is-enabled coturn

排查端口占用(可选)

安装 dnf(CentOS 8+)

sudo yum install -y dnf

安装 lsof 工具

sudo dnf install -y lsof

查看端口占用情况

sudo lsof -i :3478

查看所有 TURN 相关进程

sudo lsof -i -P -n | grep turn

使用 Coturn 实现远程投屏

登录云控后台

点击右上角头像,选择「服务地址管理」,在「远程-投屏中继地址」添加中继服务器信息。

添加 TURN 服务器信息

在添加 TURN 服务器窗口中填写 Coturn 服务器的公网 IP、端口,以及对应的用户名和密码,保存配置。

重新登录云控后台

使配置生效。

在手机端云控 App 中断开当前连接后重新连接

或者重启 App,即可生效。


可选:配置域名 + SSL 证书

本节为可选步骤。 上文基于 IP 的配置(turn:191.191.191.191:3478已经能正常工作,如果你的投屏需求已满足,可以跳过此步骤。

补上域名 + 证书后,可获得以下能力:

能力用 IP(无证书)用域名 + 证书
明文 TURN(turn:✅ 能用✅ 能用
换服务器 IP❌ 客户端全部要改只改 DNS 解析

总结:IP 版能用,域名 + 证书版更稳、更安全、更好维护

前置条件

  1. 已有一个备案域名(如 example.com
  2. 域名 DNS 解析可控
  3. 能从云服务商申请 SSL 证书

操作步骤

添加 TURN 子域名解析

登录域名 DNS 控制台,添加一条 A 记录

字段
主机记录turn
记录类型A
记录值你的服务器公网 IP(如 116.196.113.2
TTL600

最终效果turn.example.com116.196.113.2

验证

nslookup turn.example.com 8.8.8.8

申请 SSL 证书

在云服务商(阿里云 / 腾讯云 / 百度云 等)的 SSL 证书 控制台:

  1. 申请免费证书(有效期一般 3 个月)
  2. 绑定域名:turn.example.com
  3. 等待签发

下载证书

在证书控制台点击下载,选择 PEM (Nginx, SLB) 格式。

下载后一般有 2 个文件:

文件内容
turn.example.com.crt服务器证书 + 中间证书(已拼接)
turn.example.com.key私钥

上传证书到服务器

# 新建目录(若不存在)
sudo mkdir -p /etc/coturn/certs

# 上传证书(用 Xftp 或 scp 传到服务器,再拷到目标路径)
# 证书文件名保持原样,不要重命名
sudo cp turn.example.com.crt /etc/coturn/certs/
sudo cp turn.example.com.key /etc/coturn/certs/

设置权限

sudo chmod 600 /etc/coturn/certs/turn.example.com.key
sudo chmod 644 /etc/coturn/certs/turn.example.com.crt
sudo chmod 755 /etc/coturn/certs
sudo chown -R root:root /etc/coturn/certs

修改 Coturn 配置文件

sudo nano /etc/turnserver.conf

修改三处

改动 1:external-ip 改成"公网/内网"格式

原来

external-ip=191.191.191.191

改成

external-ip=191.191.191.191/192.168.0.198

为什么要加 /内网IP

云服务器处于 NAT 后,网卡上绑的是内网 IP(192.168.0.198),公网 IP(191.191.191.191)由云平台 NAT 映射。

只写 external-ip=191.191.191.191 时,coturn 中继分配消息里会返回内网地址,导致外部客户端拿到这个地址后无法连接。

写成 公网/内网 格式后,coturn 对外宣告用 191.191.191.191,实际绑定用 192.168.0.198,客户端拿到的中继地址就是公网 IP。

改动 2:realm 改成域名

原来

realm=191.191.191.191

改成

realm=turn.example.com

必须和证书域名一致,否则 TLS 握手后认证阶段会因为域名不匹配而失败。

改动 3:新增 TLS 端口 + 证书路径

listening-port=3478 下面新增

tls-listening-port=5349

在文件末尾新增

# 证书
cert=/etc/coturn/certs/turn.example.com.crt
pkey=/etc/coturn/certs/turn.example.com.key

改动后的完整配置

# 内网监听地址
listening-ip=192.168.0.198

# 公网出口地址(改成"公网/内网"格式)
external-ip=191.191.191.191/192.168.0.198

# 设置TURN 账号密码
user=admin:123456  

# 默认端口
listening-port=3478

# TLS 端口(新增)
tls-listening-port=5349

# 中继端口范围(必须)
min-port=49152
max-port=65535

# 鉴权机制
lt-cred-mech

# 认证域(改成域名)
realm=turn.example.com

# 证书(新增)
cert=/etc/coturn/certs/turn.example.com.crt
pkey=/etc/coturn/certs/turn.example.com.key

# 开启调试日志
verbose
fingerprint

重启 Coturn

sudo systemctl restart coturn
sudo systemctl status coturn

测试

测试方式与上文 IP 版完全一致,只是把地址里的 IP 换成域名:

IP 版域名版
地址turn:191.191.191.191:3478turn:turn.example.com:3478

用上文「测试 TURN 服务」那一节的方法测试即可,把测试地址里的 IP 替换为域名,如果能看到 relay 类型且 IP 为你的公网 IP,说明配置成功。

常用 Coturn 命令

启动 Coturn 服务

sudo systemctl start coturn

停止 Coturn 服务

sudo systemctl stop coturn

重启 Coturn 服务

sudo systemctl restart coturn

查看服务运行状态

sudo systemctl status coturn

启用开机自启

sudo systemctl enable coturn

禁用开机自启

sudo systemctl disable coturn