Turn服务器搭建
一、前言
在现代网络通信中,尤其是实时音视频通信领域,WebRTC(Web Real-Time Communication)技术得到了广泛应用,而TURN(Traversal Using Relays around NAT)服务器作为WebRTC架构中的关键组件,扮演了重要角色,TURN服务器的主要功能是帮助位于不同NAT(网络地址转换)后的设备实现P2P(点对点)连接,从而克服NAT穿透的问题,本文将详细介绍如何在Linux系统上搭建一个功能完备的TURN服务器。
二、所需环境准备
操作系统要求
操作系统:本文以CentOS为例,其他Linux发行版步骤类似。
公网IP:需要至少一个公网IP地址。
安装依赖包
确保系统已经安装了必要的依赖包,包括编译工具和库文件。
sudo yum install -y epel-release sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl openssl-devel libevent libevent-devel expat expat-devel asciidoc-base xmltoman
下载并安装libevent
TURN服务器依赖于libevent库,我们需要先下载并安装它。
wget https://github.com/downloads/libevent/libevent-2.0.21-stable.tar.gz tar zxvf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure --prefix=/usr/local/libevent make sudo make install
三、下载并编译coturn
克隆coturn源码
coturn是一个开源的TURN/STUN服务器实现,可以从GitHub上获取其源码。
git clone https://github.com/coturn/coturn.git cd coturn
编译coturn
在编译之前,需要确保系统已经安装了SQLite或其他数据库,因为coturn默认使用SQLite存储用户数据,这里以SQLite为例。
sudo yum install -y sqlite sqlite-devel ./configure --prefix=/usr/local --with-pthread --with-tls=openssl --enable-tls --with-nat-hook-libevent make sudo make install
四、生成证书和密钥
为了让TURN服务器支持TLS加密,我们需要生成自签名证书和密钥。
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 365 -nodes -subj "/CN=yourdomain.com"
五、配置TURN服务器
创建配置文件/etc/turnserver.conf
如下:
监听的网卡设备 listening-device=eth0 内网IP地址 listening-ip=172.18.77.60 外网IP地址 external-ip=47.107.110.xxx 监听端口 listening-port=3478 TLS监听端口 tls-listening-port=5349 最小端口号 min-port=49152 最大端口号 max-port=65535 启用长期授权机制 lt-cred-mech 用户名和密码 user=admin:123456 证书和密钥路径 cert=/etc/turn_server_cert.pem pkey=/etc/turn_server_pkey.pem 进程数 no-cli log-file=/var/log/turnserver.log pidfile=”/var/run/turnserver.pid”
六、启动TURN服务器
使用以下命令启动TURN服务器:
sudo turnserver -v -L your.internal.ip -a -u admin -p 123456 -f -r your.realm -c /etc/turnserver.conf
-v
详细模式运行。
-L
指定监听的内网IP地址。
-a
启用长期授权机制。
-u
指定用户名。
-p
指定密码。
-f
前台运行。
-r
指定Realm。
-c
指定配置文件路径。
七、验证TURN服务器
可以使用turnutils
工具包中的turnclient
命令行工具来测试TURN服务器是否正常工作。
turnclient -u admin -w admin123456 -r your.realm -n -h your.public.ip -p 3478 -V -t udp:3478
如果输出显示成功连接到TURN服务器并且分配了外部IP地址,则说明TURN服务器配置正确。
八、ICE REST API服务搭建
为了更方便地管理和获取TURN服务器的ICE候选信息,可以搭建一个简单的ICE REST API服务,以下是使用Node.js和Express框架实现的示例:
安装Node.js和npm
sudo yum install -y nodejs npm
初始化项目并安装依赖
mkdir ice-rest-api && cd ice-rest-api npm init -y npm install express https fs crypto --save
创建REST API服务器
在项目目录下创建index.js
如下:
const https = require('https'); const fs = require('fs'); const express = require('express'); const crypto = require('crypto'); const app = express(); const option = { key: fs.readFileSync('/cert/key.pem'), cert: fs.readFileSync('/cert/cert.pem') }; const hmac = function (key, content) { const method = crypto.createHmac('sha1', key); method.setEncoding('base64'); method.write(content); method.end(); return method.read(); }; app.get('/iceconfig', (req, res) => { const query = req.query; const key = '4080218913'; // HMAC密钥 const timeToLive = 3600 * 24; // 有效期24小时 const timestamp = Math.floor(Date.now() / 1000) + timeToLive; const turnUsername =${timestamp}:garrylea
; // 动态生成用户名 const password = hmac(key, turnUsername); // HMAC加密密码 res.header("Access-Control-Allow-Origin", "*"); // 允许跨域访问 res.send({ iceServers: [{ urls: [turn:${query.turnServer}:${query.turnPort}?transport=tcp
, // TCP传输方式turn:${query.turnServer}:${query.turnPort}?transport=udp
, // UDP传输方式turn:${query.turnServer}:${query.turnTlsPort}?transport=tcp
, // TLS传输方式(TCP)turn:${query.turnServer}:${query.turnTlsPort}?transport=udp
// TLS传输方式(UDP) ], username: turnUsername, // 动态生成的用户名 credential: password // HMAC加密后的密码 }] }); }); const server = https.createServer(option, app); server.listen(3033, () => { console.log('ICE REST API服务已启动'); });
启动ICE REST API服务
node index.js
九、上文归纳与展望
通过以上步骤,我们成功地搭建了一个功能完备的TURN服务器,并配置了ICE REST API服务以便更便捷地管理和获取ICE候选信息,随着WebRTC技术的不断发展,TURN服务器将在更多应用场景中发挥重要作用,为用户提供更加稳定和高效的实时通信体验。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1272935.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复