在云商(如阿里云)的服务器上部署WebRTC服务(或中继服务),由于服务器处于NAT之后(例如候选中的 IP:172.17.117.191 和 192.168.0.101 表示内网地址),这些地址对外不可达,导致候选无法连通,这时候就需要搭建STUN/TURN服务以穿透 NAT 防火墙。
一、在 CentOS 7.9 上安装并配置 coturn
1. 安装 EPEL 仓库(如果尚未安装):
sudo yum install epel-release
2. 安装 coturn:
sudo yum install coturn
安装成功后会有 /usr/bin/turnserver 这个可执行文件,以及/etc/coturn/turnserver.con配置文件
3. 编辑配置文件
# 监听IP,此处填写云服务器内网IP
listening-ip=172.17.117.191
# 默认 STUN/TURN 监听端口(UDP/TCP),常见为 3478
listening-port=3478
# 指定 realm(随便写一个域名,必须有,用于TURN验证)
realm=mydomain.com
# 启用 long-term credential 机制
lt-cred-mech
# 添加一个测试用户 (username: testuser, password: testpass)
user=testuser:testpass
# 允许中继
fingerprint
total-quota=100
bps-capacity=0
#中继IP,此处填写云服务器内网IP
relay-ip=172.17.117.191
#外网IP,此处填写云服务器公网IP
external-ip=39.99.xx.xx
#日志相关
no-stdout-log
verbose
💡这是最小最简配置,目标是先实现服务,像日志记录,动态鉴权等需要后续逐步完善
4. 打开防火墙端口:
如果你在使用 CentOS 7 自带的 firewalld,需开放 3478/UDP(和 3478/TCP 如果你启用 TCP 转发):
sudo firewall-cmd --permanent --add-port=3478/udp
sudo firewall-cmd --reload
如果使用云服务商(如阿里云、腾讯云等)还需要在其安全组中开放 3478 端口的入站 UDP/TCP 规则。
5. 启动并设置开机自动启动:
sudo systemctl enable coturn
sudo systemctl start coturn
这样,coturn 就会作为一个守护进程在 3478 端口上监听 STUN/TURN 请求。
6. 验证 coturn 是否在监听端口:
netstat -tulnp | grep turnserver
确认有在 x.x.x.x:3478 (udp/tcp) 监听。
二、在 aiortc(Python)中使用 STUN/TURN
在你的 WebRTCPeerConnection 创建处,为 RTCPeerConnection 设置 configuration 参数,指定 iceServers。
from aiortc import RTCPeerConnection, RTCConfiguration, RTCIceServer
# 举例:在 on_offer 里创建下游/上游时使用
pc_down = RTCPeerConnection(
RTCConfiguration(
iceServers=[
RTCIceServer(urls="stun:YOUR_SERVER_IP_OR_DOMAIN:3478"),
# 如果要使用 TURN,需要在 coturn 配置好用户名/密码
RTCIceServer(urls="turn:YOUR_SERVER_IP_OR_DOMAIN:3478",
username="turnuser",
credential="turnpass")
]
)
)
pc_up = RTCPeerConnection(
RTCConfiguration(
iceServers=[
RTCIceServer(urls="stun:YOUR_SERVER_IP_OR_DOMAIN:3478"),
# 同上,若需要 TURN
]
)
)
三,在前端(网页端)中使用STUN/TURN
在创建 RTCPeerConnection 时加入 iceServers:
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:YOUR_SERVER_IP_OR_DOMAIN:19302" },
// 如果你有自建的 STUN/TURN 服务器,也可以加上:
{
urls: "turn:YOUR_SERVER_IP_OR_DOMAIN:3478",
username: "turnuser",
credential: "turnpass"
}
]
});
这样当浏览器收集本地候选时,会先向这个 STUN/TURN 服务器询问自己的公网地址,或直接走 TURN 中继(如果 NAT 或防火墙阻挡了直连)。
至此,整个服务搭建完毕。