🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 参考链接:[https://www.kancloud.cn/vim26/v1/578933](https://www.kancloud.cn/vim26/v1/578933), [https://www.wware.org/wide/yw/backups/turnserverconfig.html](https://www.wware.org/wide/yw/backups/turnserverconfig.html) ## STUN/TURN服务器搭建 rfc5766-turn-server : google研发 **coTurn**: rfc5766的升级版。 ResTurn:比较老的Turn服务 ## coTurn ### 安装 ### coTurn配置 ``` listening-port=3478 #指定真挺的端口 external-ip=39.105.185.198 #指定云主机的公网IP地址 user=aaa:bbb ## 访问 stun/turn服务的用户名和密码 realm=stun.xxx.cn ## 域名, 这个一定要设置 ``` ##### 启用turnserver服务 在启用coturn之后,需要修改一些配置。打开SSH终端输入以下命令打开配置文件: ``` vim /etc/turnserver/turnserver.conf ``` 修改或添加如下内容 : ``` #中继服务器监听的IP地址,直接写公网IP地址,可以指定多个IP listening-ip=60.70.80.91 #中继服务器转发地址(本地IP地址将用于传递数据包的给每个端),和监听地址一样 relay-ip=60.70.80.91 #外部IP,直接写公网IP地址 external-ip=60.70.80.91 #打开fingerprint的注释,使用长期证书机制。 fingerprint #打开密码验证,使用短期证书机制。 lt-cred-mech #服务器名称,用于OAuth认证,默认和realm相同,直接填公网ip.部分浏览器本段不设可能会引发cors错误。 server-name=60.70.80.91 # TURN REST API的长期凭证机制范围,同样设为ip,同server-name. realm=60.70.80.91 #移动的ICE(MICE)的规范支持。 mobility #快捷的添加用户是使用user=XXX:XXXX的方式,可以添加多个。/var/db/turndb也工作,可以使用turnadmin来管理其中用户,可以添加多个。 user=test:test ``` 如果服务器是NAT网络环境,请按如下内容修改 : ``` #中继服务器监听的IP地址,NAT环境下直接写私网IP地址,可以指定多个IP listening-ip=0.0.0.0 #中继服务器转发地址(本地IP地址将用于传递数据包的给每个端),和监听地址一样 #relay-ip=60.70.80.91 #外部IP,NAT环境下直接写:公网IP/私网IP external-ip=192.168.1.13/192.168.1.13 #打开fingerprint的注释,使用长期证书机制。 fingerprint #打开密码验证,使用短期证书机制。 lt-cred-mech #服务器名称,用于OAuth认证,默认和realm相同,直接填公网ip.部分浏览器本段不设可能会引发cors错误。 server-name=192.168.1.13 # TURN REST API的长期凭证机制范围,同样设为ip,同server-name. realm=192.168.1.13 #移动的ICE(MICE)的规范支持。 mobility #快捷的添加用户是使用user=XXX:XXXX的方式,可以添加多个。/var/db/turndb也工作,可以使用turnadmin来管理其中用户,可以添加多个。 user=test:test ``` 启动: ``` turnserver -c /etc/turnserver/turnserver.conf ``` 可以使用一段简单的检查代码,检查代码如下,直接在chrome浏览器的console执行即可: ``` function checkTURNServer(turnConfig, timeout){ return new Promise(function(resolve, reject){ setTimeout(function(){ if(promiseResolved) return; resolve(false); promiseResolved = true; }, timeout || 5000); var promiseResolved = false , myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection //compatibility for firefox and chrome , pc = new myPeerConnection({iceServers:[turnConfig]}) , noop = function(){}; pc.createDataChannel(""); //create a bogus data channel pc.createOffer(function(sdp){ if(sdp.sdp.indexOf('typ relay') > -1){ // sometimes sdp contains the ice candidates... promiseResolved = true; resolve(true); } pc.setLocalDescription(sdp, noop, noop); }, noop); // create offer and set local description pc.onicecandidate = function(ice){ //listen for candidate events if(promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf('typ relay')>-1)) return; promiseResolved = true; resolve(true); }; }); } checkTURNServer({ url: 'turn:192.168.1.13', username: 'test', credential: 'test' }).then(function(bool){ console.log('is TURN server active? ', bool? 'yes':'no'); }).catch(console.error.bind(console)); ``` 将第二段的地址换为真实地址,用户名密码修改为真实的即可 使用上面的检查代码,检查,返回is TURN server active? yes说明正确,返回no说明有错误。