WebRTC(Web Real-Time Communication)是一种支持浏览器和移动应用实现音频、视频和数据实时通信的技术。然而,由于NAT(网络地址转换)和防火墙的阻隔,直接建立P2P(点对点)连接通常会失败。为此,WebRTC依赖STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relays around NAT)服务器来解决NAT穿透问题。本文基于RockyLinux 8系统,部署Coturn(开源TURN/STUN服务器)的实战演示。
一些基本概念
WebRTC (Web Real-Time Communication)
WebRTC是一组开源项目和技术,允许浏览器和移动应用进行实时通信(RTC),无需安装额外插件或软件。它支持点对点的音频、视频和数据传输。
STUN (Session Traversal Utilities for NAT)
STUN是一种网络协议,主要作用是帮助位于网络地址转换 (NAT) 设备(如路由器/防火墙)后的客户端,发现并了解自己的公网 IP 地址和端口,从而实现P2P(点对点)通信的 NAT 穿越,解决传统 P2P 应用在防火墙环境下的连接难题。
TURN (Traversal Using Relays around NAT)
TURN是STUN的扩展,当STUN打洞失败时,TURN服务器作为中继转发流量,转发所有媒体流量,保证通信不中断。
coturn
coturn是一个开源项目,同时实现了STUN和TURN功能,是WebRTC应用部署的首选。
打洞过程
①、STUN阶段:建立映射,设备A向服务器发送一个UDP包。此时,A的路由器会在NAT表中自动创建一个临时通道(即“洞”),允许来自服务器的回包通过该端口进入。
②、获取信息:服务器记录下A和B的公网地址信息,并交换给双方。
③、双向发送(关键步):
A尝试向B的公网IP端口发送数据。虽然B的路由器最初可能拦截此包,但A的路由器现在已认为“发往 B 的包”是合法的出站请求。
同时B也向A发送数据。由于A已经先发过包,A的路由器会将来自B的包视为“对此前请求的响应”,从而允许其通过。
④、连接建立:一旦双方的路由器都认为这是“已请求的流量”,P2P直连隧道即告成功,后续通信不再经过服务器。
⑤、当打洞失败时,系统会转向使用TURN服务器进行中继转发(所有数据经过服务器),以确保100%的连通性。
注:STUN穿透成功率极低,绝大多数场景下都是依赖TURN进行中继中转的。
1、安装coturn
|
1 2 |
yum install epel-release -y yum install coturn -y |
注:turnserver和coturn是一个包,安装coturn后,可通过turnserver --version命令查看其版本。
2、配置turnserver
|
1 |
vim /etc/coturn/turnserver.conf |
最小化环境配置
listening-port=3478 # 监听端口,不配置的话,默认是3478
external-ip=123.123.123.123 # 中继IP(服务器公网IP)
user=username:password # 设置用户名及密码,可设置多个
user=username2:password2 # 设置用户名及密码,可设置多个
no-cli #禁用管理端口
注:如果不禁用管理端口,建议配置访问来源和密码,即
cli-ip=127.0.0.1
cli-password=qwerty
3、启动并设置开机自启命令
|
1 |
systemctl start coturn --now |
4、验证
请使用Firefox访问以下地址进行验证,Google浏览器可能无法验证通过。
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
如图以下配置

输入coturn创建的服务器地址turn:123.123.123.123:33478,账号及密码,然后点击左下角Add Server

选择刚添加的服务器,点击下方的Gather candidates按钮,确保最后显示的为Done。
原文链接:TURN/STUN服务器部署,转载请注明来源!



