turnserver配置

TURN Server是VoIP媒体流量NAT穿越服务器和网关。它也可以用作通用网络流量TURN服务器和网关。在使用WebRTC进行即时通讯时,需要使浏览器进行P2P通讯,但是由于NAT环境的复杂性,并不是所有情况下都能进行P2P,这时需要TURN Server来帮助客户端之间转发数据。

1. 启用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=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

 

2. 测试turnserver是否启用成功

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说明有错误。