前提:双网卡服务器
stun
什么STUN
STUN(Simple Traversal of User Datagram Protocol through Network Address Translators (NATs),NAT的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户 端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于 NAT路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。目前RFC 3489协议已被RFC 5389协议所取代,新的协议中,将STUN定义为一个协助穿越NAT的工具,并不独立提供穿越的解决方案。它还有升级版本RFC 7350,目前正在完善中。
下载、安装stun
上github下载源码包 https://github.com/jselbie/stunserver 更新系统 yum update -y
解压文件后进入目录 安装依赖 sudo yum groupinstall "Development Tools" # For g++, make, et. al. sudo yum install boost-devel # For Boost sudo yum install openssl-devel # For OpenSSL
编译
make
make后会生成stunserver、stunclient、stuntestcdoe三个文件
stunserver是server文件 stunclient是客户端文件
查看帮助信息 ./stunserver --help --mode 指定模式。有"basic"和"full"两种模式 --primaryinterface指定第一个监听的本机ip地址或网卡 --altinterface 指定第二个监听的本机ip地址或网卡 --primaryport 指定第一个监听的端口(默认3478) --altport 指定第一个监听的端口(默认3479) --family 网络类型,4表示IPV4,6表示IPV6 --protocol 指定网络连接类型,udp或tcp,默认为udp --maxconn 设置最大连接数 --verbosity 设置日志级别,0最少,1其次,2较多,3最多。默认0 --ddp 分布式拒绝访问。开启此选项时如果客户端以过多的数据包冲击服务器端将被短时间的拒绝访问,该IP后续的数据库将被删除。 --primaryadvertised --altadvertised --primaryadvertised和--altadvertised用于设置公网ip,必须使用full模式,仅当你的stunserver运行在NAT后面的私有环境时使用。如经过内外端口映射,经过服务转发等。 --configfile 指定配置文件 --help 查看帮助信息
经过防火墙地址转换后的用法: nohup ./stunserver --mode full --primaryinterface IP1 --altinterface IP2 --primaryadvertised public IP --altadvertised public IP
turn server
官方网址:http://turnserver.sourceforge.net/index.php?n=Main.HomePage
什么是turn
百度百科 TURN协议允许NAT或者防火墙后面的对象可以通过TCP或者UDP接收到数据。这在使用了对称式的NAT(或者防火墙)的网络中尤其具有实用价值 。 TURN的全称为Traversal Using Relay NAT,即通过Relay方式穿越NAT,TURN应用模型通过分配TURNServer的地址和端口作为客户端对外的接受地址和端口,即私网用户发出的报文都要经过TURNServer进行Relay转发,这种方式应用模型除了具有STUN方式的优点外,还解决了STUN应用无法穿透对称NAT(SymmetricNAT)以及类似的Firewall设备的缺陷,即无论企业网/驻地网出口为哪种类型的NAT/FW,都可以实现NAT的穿透,同时TURN支持基于TCP的应用,如H323协议。此外TURNServer控制分配地址和端口,能分配RTP/RTCP地址对(RTCP端口号为RTP端口号加1)作为本端客户的接受地址,避免了STUN应用模型下出口NAT对RTP/RTCP地址端口号的任意分配,使得客户端无法收到对端发过来的RTCP报文(对端发RTCP报文时,目的端口号缺省按RTP端口号加1发送)
使用环境: 内网openfire服务器提供视频服务,用stunserver转发外网。。。。。。反正就是stunserver不行,无法穿透,无法保证视频通话的成功率,就用turnserver了
下载页面 http://turnserver.sourceforge.net/index.php?n=Main.Download
安装
安装confuse依赖库 wget http://savannah.spinellicreations.com/confuse/confuse-2.7.tar.gz tar axf confuse-2.7.tar.gz cd confuse-2.7 ./configure make && make install && echo $?
安装libconfuse-devel yum install libconfuse-devel -y
将下载的turnserver-0.7.3.tar.bz2 传上来,然后解压 tar axf turnserver-0.7.3.tar.bz2 编译安装 cd turnserver-0.7.3 ./configure make && make install && echo $? 生成并修改配置文件 cp extra/turnserver.conf.template /etc/turnserver.conf vim /etc/turnserver.conf
#"修改转发地址,公网地址"
listen_address ={ “8.8.8.8”,"114.114.114.114" }
#“修改监听端口,默认3478”
udp_port = 3478
tcp_port = 3478
#“使用后台服务,默认为false”
daemon = true
#"设置网络限制,0表示无限制"
restricted_bandwidth = 0
#“指定认证文件”
account_file = "/etc/turnusers.txt"
生成并修改认证文件 cp extra/turnusers.txt.template /etc/turnusers.txt
toto:password:domain.org:authorized
toto是默认用户,password是默认密码,后面的是固定格式,修改用户名和密码即可
coturn (turn)(推荐使用)(建议使用centos7及以上版本安装)
coturn是turn的升级版,同一作者,老的turn作者已经不再维护,下的coturn下载需要去githup,建议使用coturn
githup地址:https://github.com/coturn/coturn/tree/master
安装coturn
下载好后进入安装目录 查看INSTALL文件,里面安装过程讲解的非常详细(啰嗦) 安装依赖
yum install gcc gcc-c++ openssl-devel libevent2 libevent2-devel
如果报错 libevent2 和 libevent冲突就卸载 libevent装libevent2,如果yum源没有libevent2就去下rpm包或源码包,如果还有其他报错就按报错处理 编译安装 使用c++代替c编译
CC=g++ ./configure
make && echo $?
安装完成后会生成(centos7会在coturn的安装目录下的bin目录生成执行文件) /usr/local/bin/turnadmin /usr/local/bin/turnserver /usr/local/bin/turnutils_natdiscovery /usr/local/bin/turnutils_oauth /usr/local/bin/turnutils_peer /usr/local/bin/turnutils_stunclient /usr/local/bin/turnutils_uclient
centos7修改环境变量 vim /etc/profile #COTURN
export COTURN_HOME=/coturn-master
export PATH=$PATH:${COTURN_HOME}/bin
source /etc/profile
配置
生成证书
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
生成认证文件(MD5密码)
turnadmin -k -u USERNAME -r REALM -p PASSWORD >/etc/turnuserdb.conf
生成主配置文件
cp examples/etc/turnserver.conf /etc/turnserver.conf
修改配置文件(按照里面的说明逐个添加即可)(一下是我的配置)
listening-port=PORT #“默认3478”
tls-listening-port=PORT #"默认5349"
listening-ip=IP1 #"监听地址"
relay-ip=IP2 #"转发地址,可以和监听地址一样"
external-ip=public #“公网IP”
min-port=48000 #“连接使用最小端口”
max-port=49000 #"连接是使用最大端口"
lt-cred-mech #“使用证书认证(证书认证和静态身份认证不能同时使用)”
# static-auth-secret=USERNAME #“使用静态身份认证,后面指定的是用户名”
user=USERNAME:PASSWORD #”用户名1:密码1“
user=USERNAME:MD5 #“用户名2:密码2(密码2为)/etc/turnuserdb.conf中的值”
sha256 #“指定加密算法”
userdb=/etc/turnuserdb.conf #“database文件名,自动上面生成的文件”
realm=REALM #“域,需要与turnadmin创建认证信息时指定的一样”
stale-nonce #"nonce生命周期,如果像这里不指定具体的值则使用默认值600(秒)"
cert=/etc/turn_server_cert.pem #"指定认证文件"
pkey=/etc/turn_server_pkey.pem #"指定认证文件"
no-loopback-peers #"安全设置,禁止环回网卡"
no-multicast-peers #"安全设置,禁止知名广播地址"
mobility #"支持mobility"
no-cli #"禁止CLI,默认运行"
启动服务
/usr/local/bin/turnserver -L LISTEN-IP -o -a -b /etc/turnuserdb.conf -f -r REALM
连接测试
turnutils_uclient -u USERNAME -w PASSWORD -p PORT -v LISTEN-ADDRESS
-u 指定用户 -w密码-p端口 -v使用Verbose,最后指定监听端口
单网卡配置方式
vim /etc/turnserver.conf
listening-port=3478
listening-ip=IP #"私网ip"
external-ip=public/private #"公网ip"
min-port=49152 #“连接使用最小端口”
max-port=65535 #“连接使用最大端口”
lt-cred-mech
user=USERNAME1:PASSWORD1
user=USERNAME2:PASSWORD2
userdb=/etc/turnuserdb.conf
realm=REALM
stale-nonce=600
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
no-loopback-peers
no-multicast-peers
mobility
no-cli
启动服务 turnserver -o -a 连接测试 turnutils_uclient -v -t -T -y -u USERNAME -w PASSWORD IP 如下说明成功
参考文档
COTURN服务器使用 :http://blog.csdn.net/day_day_up1991/article/details/52253892 STUN和TURN技术浅析请