CentOS 7.9 安装并配置 coturn,为WebRTC提供 STUN/TURN服务

在云商(如阿里云)的服务器上部署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 或防火墙阻挡了直连)。

至此,整个服务搭建完毕。

Leave a Comment

Your email address will not be published.

*

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理