标签归档:打洞

Centos6 安装 stun/turn服务

1,关于stun和turn

STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一 个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。目前RFC 3489协议已被RFC 5389协议所取代,新的协议中,将STUN定义为一个协助穿越NAT的工具,并不独立提供穿越的解决方案。它还有升级版本RFC 7350,目前正在完善中。 

http://baike.baidu.com/view/884586.htm

TURN的全称为Traversal Using Relay NAT,即通过Relay方式穿越NAT,TURN应用模型通过分配TURNServer的地址和端口作为客户端对外的接受地址和端口,即私网用户发出的报文都要经过TURNServer进行Relay转发。 

http://baike.baidu.com/subview/351571/10359693.htm

2,安装

参考: 

http://www.hankcs.com/program/network/compile-rfc5766-turn-server-to-build-turn-server.html

代码下载: 

https://github.com/coturn/rfc5766-turn-server/releases 

下载最新的tar.gz包。rfc5766-turn-server-3.2.5.9.tar.gz

安装依赖环境

##ssl 需要yum安装 yum install openssl openssl-libs libevent libevent-devel
  • 1
  • 2

如果还是报错,就手动安装libevent。

centos Libevent2 development libraries are not installed properly in required location
  • 1

下载:http://libevent.org/ 官网,下载 

https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz 

然后解压缩编译安装即可

编译turn-server

tar -zxvf rfc5766-turn-server-3.2.5.9.tar.gz
cd rfc5766-turn-server-3.2.5.9 ./configure 
make
make install
  • 1
  • 2
  • 3
  • 4
  • 5

configure成功:

more is /usr/bin/more
install is /usr/bin/install
pkill is /usr/bin/pkill
Use TMP dir /var/tmp
Compiler: cc Do not use -lsocket Do not use -lwldap32 Do not use -lwldap64 Do not use -lintl
Sockets code is fine: no sin_len field present
Ignore IP_RECVERR
Crypto SSL lib found.
SSL lib found.
Libevent2 development found.
Libevent2 runtime found.
Libevent2 openssl found.
Libevent2 pthreads found.

POSTGRESQL DEVELOPMENT LIBRARY (libpq.a) AND/OR HEADER (libpq-fe.h)
        ARE NOT INSTALLED PROPERLY ON THIS SYSTEM.
        THAT'S OK BUT THE TURN SERVER IS BUILDING WITHOUT POSTGRESQL DATABASE SUPPORT. MYSQL DEVELOPMENT LIBRARY (libmysqlclient) AND/OR HEADER (mysql.h)
        ARE NOT INSTALLED PROPERLY ON THIS SYSTEM.
        THAT'S OK BUT THE TURN SERVER IS BUILDING WITHOUT MYSQL DATABASE SUPPORT. HIREDIS DEVELOPMENT LIBRARY (libhiredis.*) AND/OR HEADERS (hiredis/*.h)
        ARE NOT INSTALLED PROPERLY ON THIS SYSTEM.
        THAT'S OK BUT THE TURN SERVER IS BUILDING WITHOUT REDIS SUPPORT. PREFIX=/usr/local OSLIBS= -L/usr/local/lib/ -L/usr/local/lib/ -L/usr/local/lib64/ -L/usr/local/lib64/ -lrt -pthread -lcrypto -lssl -levent_core -levent_openssl -levent_pthreads  -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib64/ -Wl,-rpath,/usr/local/lib64/ -Wl,-rpath,/usr/lib64/mysql -Wl,-rpath,/usr/local/lib DBLIBS= OSCFLAGS=-g  -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes  -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include  -DTURN_HAS_DAEMON    -DINSTALL_PREFIX=/usr/local DBCFLAGS=
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

只是说没有数据库支持的库,暂时不需要。

安装之后说明:

1) If you system supports automatic start-up system daemon services, 
the, to enable the turnserver as an automatically started system 
service, you have to:

        a) Create and edit /etc/turnserver.conf or /usr/local/etc/turnserver.conf . 
        Use /usr/local/etc/turnserver.conf.default as an example.

        b) For user accounts settings, if using the turnserver with authentication: create and edit /etc/turnuserdb.conf 
        file, or set up PostgreSQL or MySQL or Redis database for user accounts.
        Use /usr/local/etc/turnuserdb.conf.default as example for flat file DB, or use /usr/local/share/turnserver/schema.sql as SQL database schema, or use /usr/local/share/turnserver/schema.userdb.redis as Redis database schema description and/or /usr/local/share/turnserver/schema.stats.redis as Redis status & statistics database schema description.

        c) add whatever is necessary to enable start-up daemon for the /usr/local/bin/turnserver. 2) If you do not want the turnserver to be a system service, then you can start/stop it "manually", using the "turnserver" executable with appropriate options (see the documentation). 3) To create database schema, use schema in file /usr/local/share/turnserver/schema.sql. 4) For additional information, run:

   $ man turnserver
   $ man turnadmin
   $ man turnutils
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在根目录创建一个user.db文件 

使用turnserver启动:

turnserver --userdb /root/turnuser.db 里面是webrtc用户名密码: webrtc:secret
  • 1
  • 2
  • 3

3,页面调用

https://github.com/EricssonResearch/openwebrtc-examples/tree/master/web 

安装node参考之前文章: 

http://blog.csdn.net/freewebsys/article/details/46649667#t1

修改main.js

// must use 'url' here since Firefox doesn't understand 'urls' var configuration = { "iceServers": [
  { "url": "stun:mmt-stun.verkstad.net" },
  { "url": "turn:mmt-turn.verkstad.net", "username": "webrtc", "credential": "secret" }
  ]
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

将stun服务器和turn服务器替换。

4,总结

stun和trun是webrtc打通的关键服务器,但是资源有限没有在公网测试。

webrtc与stunserver、turnserver建立连接花费时间十秒左右

  很奇怪,使用之前基于webrtc的p2p模块时出了了大问题,问题如标题左右,记得之前使用另外版本的webrtc做开发的时候,本地在CreateOffer后能够能够很快和turnserver连接,估计最左就两三秒,然而现在却是十秒左右了!

   由于换了一个webrtc的版本(此版本是支持winxp系统的),所以第一感觉似乎是webrtc版本的问题,实际上不是,因为就算是换回之前的版本,client和turnserver的连接时间几乎花费了与当前版本webrtc 差不多的时间。

 
 之前也说了,就是之前有点时间,client与turnserver的连接是正常的,于是在google到了一个解决方案,即是trickle
ice技术,据说使用该方法能够大大缩短client与opposite
client的连接时间,这个解决方案似乎和当前所遇到的问题擦着一点边,但是似乎可以值得尝试,因为这或多或少会提升client连接到对面的体验!然而client和turnserver的连接速度是似乎没多大作用,放弃此方案。

   
实际上只要网络状态好,按道理来讲本地client和turnserver的connect
时间应该很短才对,实际上也是如此!后来调试发现在client连接turnserver的过程中在stunrequest.cc中都有调用OnTimeout函数,而且说明本地client和turnserver的连接很不理想,通过查看源码获知在timeout的过程中,本地客户端总共尝试了MAX_SENDS次重发送(发送给turnserver、stunserver),在源码中MAX_SENDS被宏定义为9,超过9次之后才正式通知外部(OnTimeout),
OnTimeout函数最终会触发webrtc底层,告知client本地的icecandidate的收集已经完成,接着出发了外部的OnIceGatheringChange函数,该函数的icecandidate收集状态state将会为kIceGatheringComplete,此时本地的client才会知道本地的icecandidate信息收集已经完结,那么怎么根据当前peerconnection是否成功和stunserver、turnserver连接呢?如果已经收集到的icecandidate中不但包含了本地的ip信息,还包括了stunserver、turnserver的ip信息,那么就可以决断本地client已经成功和turnserver连接,如果只是包含了本地的ip地址信息(icecandidate信息的type字段为host、local),那么就可以决断本地client连接turnserver服务器失败。

 
 而我遇到的情况是,从client开始连接到收集icecandidate信息成功花费了太长的时间(10左右),不过最后还是能够成功连接上turnserver,之前也说了花费了那么长时间全是浪费在timeout上了,那么问题来了?为什么我本地的网络情况良好(可下载、可开网页),怎么在就是在探测turnserver的时候那么艰难呢?断点查看timeout时对应的ip地址,明白了,这个ip地址是我电脑中之前安装的virtulBox中一个虚拟机的ip地址,这个我真是没想到!查看源码,知道webrtc在探测turnserver的时候是要遍历当前平台下的所有的网络适配器的,不管是系统自带的无限网络、还是以太有线网,还是其他应用软件虚拟出来的适配器,webrtc探测时都会遍历,之所以出现时间是花在timeout上,也只是说明对应的网络适配器在和turnserver尝试连接的时候,网路状况不好!鉴于此,于是在控制面板中将virtualBox中虚拟出来的适配器禁用,重新打开本地的client,发现几乎是秒连了!