Feedback

应对防火墙限制

本教程主要介绍应对防火墙限制的最佳实践。例如,在企业内网等设有防火墙的网络环境中,TRTC Web SDK 可能因防火墙限制而无法正常使用。
此时有两种解决方案:
方案一:监听 SDK 错误,引导用户更换网络或配置防火墙白名单。
方案二:使用 Nginx + coturn 代理方案。
说明:
TRTC Web SDK 默认使用 UDP 传输媒体数据到 TRTC 服务器,并内置 TURN Server,支持通过 UDP 或 TCP 中继媒体数据。
在公网中,用户无需设置任何代理,SDK 会按直连、TURN Server UDP、TURN Server TCP 的顺序尝试建立媒体连接。
如果已知用户将在内网防火墙中使用 SDK,可能无法建立媒体连接,需要设置代理。

方案一

此方案适用于您无法确认用户的网络是否会受到防火墙限制的情况。此时您可以监听 SDK 错误,引导用户更换网络或检查防火墙。
当您调用 startLocalVideo、startLocalAudio、startRemoteVideo 等 API 时,SDK 内部会建立媒体连接通道来传输媒体数据。遇到防火墙限制时,SDK 可能建立连接失败,SDK 会抛出防火墙限制错误并继续重试。
您可以参考以下代码示例监听此错误,并引导用户更换网络或检查网络防火墙,将 TRTC Web SDK 使用的域名和端口加入白名单。
trtc.on(TRTC.EVENT.ERROR, error => {
// 用户网络防火墙限制可能导致音视频通话失败。
// 此时引导用户更换网络或检查网络防火墙设置。
if (error.code === TRTC.ERROR_CODE.OPERATION_FAILED && error.extraCode === 5501) {
}
});

WebRTC 需要将哪些端口和域名添加到防火墙白名单?

将以下端口加入白名单
WebRTC(H5)
端口
TCP
443
UDP
8000、8080、8800、843、443、16285
将以下域名加入白名单
apisgp.my-imcloud.com

# v5.5.0 之后的版本
*.rtc-web.com
*.rtc-web.io

# v5.5.0 之前的版本

signailing.rtc.tencentcloud.com
schedule.rtc.tencentcloud.com
*.rtc.tencentcloud.com

方案二

此方案适用于您确认用户的网络受防火墙限制,需要设置代理服务器来解决问题的情况。
此方案需要部署两台服务器:Nginx + TURN Server。您可以联系公司的运维同事协助搭建。Nginx 代理服务器用于代理 TRTC Web SDK 的 WebSocket 信令数据包,TURN Server 用于中继媒体数据。
方案
适用场景
网络要求
A
用户网络可以访问指定外网代理服务器
代理服务器部署在外网,内网防火墙需要开放白名单,允许内网用户访问外网代理服务器。
B
用户网络只能访问内网代理服务器
代理服务器部署在内网,内网防火墙需要开放白名单,允许内网代理服务器访问外网。
图 2-A
图 2-A

图 2-B
图 2-B


方案 2-A

搭建 Nginx 服务器

1. 部署 Nginx 服务器
请参考网上找到的 Nginx 服务器部署教程进行部署。如果企业已部署 Nginx 服务,可以直接配置。
2. 配置 Nginx 服务器。
vi /etc/nginx/nginx.conf
http {
server {
# Nginx 服务器的访问域名
server_name proxy.example.com;
# Nginx 服务器的访问端口
listen 443;
ssl on;
location /ws/ { # 对应 setProxyServer 中的 websocketProxy 参数
proxy_pass https://signaling.rtc.qq.com/; # TRTC 服务器
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /logger/ { # 对应 setProxyServer 中的 loggerProxy 参数
proxy_pass https://yun.tim.qq.com/;
}
# 域名对应的 SSL 证书,用于 HTTPS,用户需自行申请
ssl_certificate ./crt/1_proxy.trtcapi.com_bundle.crt;
ssl_certificate_key ./crt/2_proxy.trtcapi.com.key;
}
}
3. 重新加载 Nginx。
sudo nginx -s reload
4. 确认公司防火墙允许访问 Nginx 服务器的 IP 和端口。

搭建 TURN 服务器

您可以在网上搜索 TURN 服务器搭建教程进行搭建,或者使用以下脚本在 CentOS 中搭建 turn 服务器。
1. 在 Linux 服务器中创建脚本文件 turn.sh,脚本内容如下。
#!/usr/bin/env bash

# 当前文件名为 turn.sh

# ref:
# https://gabrieltanner.org/blog/turn-server STEP 3 testing turn server
# https://medium.com/av-transcode/what-is-webrtc-and-how-to-setup-stun-turn-server-for-webrtc-communication-63314728b9d0

# 以超级用户身份运行
# usage: current_program <external-ip>

set -x
set -e

ip a
pwd
whoami

display_usage() {
echo "此脚本必须以超级用户权限运行。"
echo -e "\n用法: $0 <外部IP> \ne.g. $0 154.8.246.205"
}

# 如果参数少于1个,显示用法信息
if [ $# -lt 1 ]
then
display_usage
exit 1
fi

if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "获取外部IP $1"
else
echo "错误的外部IP $1,不能包含空格、制表符和其他字符"
exit 2
fi

yum install -y coturn

# $1 是 <外部IP>
cat <<EOF > /etc/coturn/turnserver.conf
external-ip=$1
listening-port=3478
lt-cred-mech
max-port=65535
min-port=20000
no-dtls
no-tls
realm=tencent
user=turn:turn
verbose
EOF
2. 添加可执行权限。
chmod +x turn.sh
3. 以 root 身份执行脚本,例如:
# sudo ./turn.sh <服务器公网 IP>
sudo ./turn.sh 14.3.3.3
4. 启动 TURN 服务器。
systemctl start coturn

# 检查 turn 是否启动成功
ps aux | grep coturn

# 如需重启服务,执行
service coturn restart
5. 为 TURN 服务器配置防火墙,开放入站端口 3478(TCP 和 UDP),以及上述配置中最小和最大端口之间的出站端口(UDP)。
6. 配置公司内网防火墙,允许访问 TURN 服务器的 IP 并开放出站端口 3478(TCP 和 UDP)。
7. 测试 TURN 服务器。使用此测试页面测试 TURN 服务器是否可访问。如果结果如下图所示显示"done",则表示 turn 服务器工作正常。
turn 测试
turn 测试


方案 2-B

方案 2-B 搭建 Nginx 代理的方式与方案 2-A 相同。
主要有两个区别:
1. 搭建 TURN 服务器时,配置文件中 external-ip 字段必须填写公司内网的服务器地址。
# 方案 2-A 的启动脚本填的是服务器的外网地址,例如 14.3.3.3
./turn.sh
# 方案 2-B 的启动脚本填的是服务器的内网地址,
# 例如内网地址 10.0.0.4
sudo ./turn.sh
2. 防火墙配置:
对于 Nginx 服务器,需要在公司内网防火墙中配置域名白名单,允许 Nginx 服务器访问 TRTC 的相关域名。请参考 白名单。
对于 TURN 服务器,允许 TURN 服务器访问外网。

为 TRTC Web SDK 设置代理服务器

在您搭建好 Nginx 和 TURN 服务器后,可以参考以下示例为 TRTC Web SDK 设置代理服务器。
const trtc = TRTC.create();

await trtc.enterRoom({
...,
proxy: {
// 设置 Websocket 代理,用于中继 SDK 与 TRTC 后端之间的信令数据包。
websocketProxy: 'wss://proxy.example.com/ws/',
// 设置 turn 服务器,用于中继 SDK 与 TRTC 后端之间的媒体数据包。14.3.3.3:3478 是 turn 服务器的 IP 地址和端口。
turnServer: { url: '14.3.3.3:3478', username: 'turn', credential: 'turn', credentialType: 'password' },
// 默认情况下,SDK 会尝试直连 TRTC 服务器,如果连接失败,SDK 会尝试通过 TURN 服务器中继媒体数据。您可以设置 'relay' 强制通过 TURN 服务器连接。
iceTransportPolicy: 'all',
// 默认情况下,SDK 会向 yun.tim.qq.com 域名上报日志。如果您的内网无法访问此域名,需要对该域名进行白名单配置或配置以下日志代理。
// 设置日志上报代理。日志是排查问题的关键数据,请务必设置此代理。
loggerProxy: 'https://proxy.example.com/logger/',
}
})