TURN Server是VoIP媒体流量NAT穿越服务器和网关。它也可以用作通用网络流量TURN服务器和网关。在使用WebRTC进行即时通讯时,需要使浏览器进行P2P通讯,但是由于NAT环境的复杂性,并不是所有情况下都能进行P2P,这时需要TURN Server来帮助客户端之间转发数据。
在启用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=172.17.19.101
#中继服务器转发地址(本地IP地址将用于传递数据包的给每个端),和监听地址一样
#relay-ip=60.70.80.91
#外部IP,NAT环境下直接写:公网IP/私网IP
external-ip=60.70.80.91/172.17.19.101
#打开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
保存配置文件后,重启turnserver服务
systemctl restart turnserver.service
1)打开测试工具: trickle-ice 按照以下内容填写,点击“add server”(注意RUI不要用域名,因为配置的是ip,cors会导致错误)
STUN or TURN URI: turn:60.70.80.91
TURN username: test
TURN password: test
然后点击“gather candidates”,若出现下方结果,则测试成功。
0.002 1 host 3883888421 udp 192.168.2.153 50459 126 | 30 | 255
0.003 2 host 3883888421 udp 192.168.2.153 33883 126 | 30 | 254
0.053 1 relay 770410964 udp 192.168.2.169 56272 2 | 30 | 255
0.054 2 relay 770410964 udp 192.168.2.169 61919 2 | 30 | 254
0.153
0.153 Done
2)另外可以使用一段简单的检查代码,检查代码如下,直接在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.2.169',
username: 'wware',
credential: 'wware'
}).then(function(bool){
console.log('is TURN server active? ', bool? 'yes':'no');
}).catch(console.error.bind(console));
将第二段的地址换为真实地址,用户名密码修改为真实的即可
使用上面的检查代码,检查,返回is TURN server active? yes说明正确,返回no说明有错误。