《webrtc入门系列(一)easy_webrtc_server 入门环境搭建》
《webrtc入门系列(二)easy_webrtc_server 入门example测试》
《webrtc入门系列(三)云服务器coturn环境搭建》
《webrtc入门系列(四) zlmediakit webrtc sdp交互详细解读》
一、背景
这几天零碎的搜索,已经大概摸清楚了ipc想要接入webrtc的一些流程,其中打洞服务器必不可少,我们选择coturn来做为服务器。
好早就想云服务器切换成Ubuntu,乘机一起迁移切换了系统,忙了一个周末,还触发了腾讯云的bug,补偿了50代金券。
安装coturn环境,搜索一搜一大把,但没有谁的例子是完整可用的,最后还是相信了默认配置文件的注释、turnserver命令注释,逐个修改可疑配置的定义,再结合网友的各种教程,配合一个正常的coturn服务器对比,开了三个浏览器edge、Firefox、chrom,一共六个窗口,把可疑配置项逐一增删,最后完成部署。
二、环境
云服务器:Ubuntu 20.04
toturn版本:Ubuntu 20.04源默认版本
公网IP:106.66.66.66
内网IP: 172.16.0.13
暂时不配置域名和证书,不用加密认证。
三、安装和配置
//更新源
sudo apt-get update
//安装coturn服务器
sudo apt-get install coturn
然后,安装就完成了,结束?
这么简单就不会水一篇博客了。
继续
全部配置如下:
//默认监听端口
listening-port=3478
//默认监听IP
listening-ip=172.16.0.13
//公网IP
external-ip=106.66.66.66
//通信端口范围
min-port=49152
max-port=65535
//增加安全选项,允许交换秘钥指纹,防止中间人攻击,非必需
/*
如果您取消注释以在TURN消息中使用指纹,这意味着客户端和服务器之间交换的消息将包括共享密钥的加密指纹。这个指纹用于确保消息的完整性和真实性,并防止中间人攻击。
默认情况下,此选项被关闭,这意味着客户端和服务器之间交换的消息将不包括指纹。然而,如果安全是一个问题,建议打开此选项,为通信添加额外的安全层。
*/
fingerprint
//打开鉴权,可以是证书或者用户名密码
/*
如果您取消注释以使用长期凭据机制,这意味着TURN服务器将使用凭据机制来验证客户端的身份。这个机制需要客户端提供一个凭据(如用户名和密码),以便TURN服务器可以验证客户端是否有权限使用服务。默认情况下,没有使用凭据机制,这意味着任何用户都可以使用TURN服务器。
如果您启用了凭据机制,则只有那些提供正确凭据的用户才能访问TURN服务器。这将增加通信的安全性和保护机密信息不被未经授权的访问。
*/
lt-cred-mech
//用户名密码配置,暂使用明文,后续可以把密码MD5或者hash等,用命令生成
user=hayson:hayson
//系统日志默认是打开的
syslog
//禁止回环和广播,安全相关应该是默认关闭的,非必需配置
/*
allow-loopback-peers是一个标志,用于允许来自回环地址(127.x.x.x和::1)的对等体连接TURN服务器。这是一项额外的安全措施。
在测试环境中,可以允许回环地址访问TURN服务器,但在生产环境中不建议使用这个选项,因为这可能会增加安全漏洞。如果要使用这个选项,请确保同时设置了cli-password来提高安全性。
通过启用此选项,您可以允许来自本地回环地址的客户端连接TURN服务器,这对于开发和测试环境非常有用。但请注意,在生产环境中,允许来自回环地址的客户端连接可能会增加安全风险,因此应该谨慎使用。
*/
no-loopback-peers
no-multicast-peers
//禁止turnserver命令行交换,安全配置,非必需
/*
这段代码是用于关闭TURN服务器的命令行界面(CLI)支持的。默认情况下,CLI支持总是打开的。可以使用这个选项关闭CLI支持,以增强TURN服务器的安全性。
CLI是一种交互式界面,允许用户通过命令行界面与TURN服务器进行交互。通过启用CLI支持,用户可以使用命令行界面来管理和控制TURN服务器,例如添加或删除用户,查看日志文件等。但是,由于CLI支持需要在TURN服务器上暴露命令行接口,因此它可能会增加安全风险。
如果您认为不需要CLI支持或希望提高TURN服务器的安全性,请使用这个选项关闭CLI支持。请注意,关闭CLI支持可能会对TURN服务器的管理和控制造成一定的不便。
*/
no-cli
核心配置
turnserver.conf 文件备份后修改为如下内容
//默认监听端口
listening-port=3478
//默认监听IP
listening-ip=172.16.0.13
//公网IP
external-ip=106.66.66.66
//通信端口范围
min-port=49152
max-port=65535
//加密
fingerprint
lt-cred-mech
user=hayson:hayson
重启服务器
sudo systemcrtl restart coturn.service
四、云服务器网络端口放行
-
3478端口(TCP&&UDP)
-
49152-65535端口(TCP&&UDP)
五、测试
google ICE测试
-
remove server 先把默认的服务器清空
-
添加测试服务器
TURN URL:turn:106.66.66.66:3478
TURN username:hayson
TURN password:hayson
- 点击添加服务器
- 点击Gather candidates
这里我们看两个结果东西,srflx和relay
srflx:是表示反射地址,即我们自己的出口IP,如果用stun就只需要查看有反射就行了。
relay:表示中转地址。
host:收集的到浏览器电脑本机地址
js测试
测试网页如下,记得修改服务器地址信息
<!DOCTYPE html>
<html>
<button id="btn1">Test TURN SERVER</button>
<script type="text/javascript">
var btn1 = document.getElementById('btn1');
btn1.addEventListener('click', testtrun);
btn1.disabled = false;
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(turnConfig),
noop = function() {};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(function(sdp) {
console.log(Math.random()+"createOffer:"+JSON.stringify(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
console.log("onicecandidate:"+ice.candidate.candidate)
if (promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf(
'typ relay') > -1)) return;
promiseResolved = true;
resolve(true);
};
});
}
function testtrun() {
checkTURNServer({
'iceServers': [
{
'urls': 'stun:106.66.66.66:3478'
},
{
'urls': 'turn:106.66.66.66:3478',
'credential': "hayson",
'username': "hayson"
}
]
}).then(function(bool) {
var resTxt = bool ? 'yes' : 'no';
//document.getElementById('spRes1').innerHTML = resTxt;
console.log('is my TURN server active? ', resTxt);
}).catch(console.error.bind(console));
}
</script>
</html>
F12 查看结果
参考
《WebRTC之ICE服务器coturn安装及部署》
《Coturn服务器搭建步骤》
《测试coturn服务器是否可用(Webrtc)》
《自建 AppRTC》
《stun server、turn server、coturn server安装与使用》