STUN服务器(使用docker搭建STUNTURN服务器)
大家好,STUN服务器相信很多的网友都不是很明白,包括使用docker搭建STUN/TURN服务器也是一样,不过没有关系,接下来就来为大家分享关于STUN服务器和使用docker搭建STUN/TURN服务器的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
coturn服务器配置
注:为了更好的体验,将内容复制到工具中效果才好
#coturn服务器配置
##操作系统:建议使用ubuntu16+
##安装步骤:
以下安装以ubuntu16为例
###安装软件包
* apt update
* apt install coturn
###配置coturn服务器
####复制DTLS、TLS支持的证书文件(目录中已经有相应的证书)
* cp/usr/share/coturn/examples/etc/turn_server_cert.pem/etc/turn_server_cert.pem
* cp/usr/share/coturn/examples/etc/turn_server_pkey.pem/etc/turn_server_pkey.pem
####编辑/etc/turnserver.conf文件
listening-device=eth0#网卡
listening-port=3478#对外服务的商品,需要在防火墙、云服务器安全组放通,协议为UDP/TCP,出入站都需要
listening-ip=127.0.0.1#内网地址
tls-listening-port=5349#备用端口
listening-ip=172.17.0.4#局域网地址
relay-ip=172.17.0.4#局域网地址
external-ip=81.0.187.0#外网地址
lt-cred-mech
server-name=stun.xxx.cn#域名
realm=stun.xxx.cn#域名
min-port=50001#穿透需要用到的开始端口需要在防火墙,云服务器安全组中放通
max-port=50009#穿透需要用到的结束端口
user=test:test#用户名:密码测试或者客户端接入时需要用到
userdb=/var/db/turndb#数据文件的位置,如果没有该文件,启动会有错误提示
cert=/etc/turn_server_cert.pem#密钥相关上面步骤准备的
pkey=/etc/turn_server_pkey.pem#密钥相关上面步骤准备的
no-stdout-log
log-file=/var/tmp/turn.log#日志文件
pidfile="/var/run/turnserver.pid"#pid文件位置
no-stun#不使用stun服务主要用于测试turn中继方式时来关闭stun 更多类容可以参考配置文件自带的说明
###编辑/etc/default/coturn文件
*默认是不需要改的,但还是检查一下
* TURNSERVER_ENABLED=1
##安装完成,重启服务
* service coturn restart
##端口放通
*参考各系统、服务器,不赘述
##测试
*使用自带工具
turnutils_uclient ip或者域名-u用户名-w密码
##客户端使用
iceServers: [{
'urls':'stun:stun.xxxx.cn:3478',
'credential':"test",
'username':"test"
}
,{
'urls':'turn:stun.xxxx.cn:3478',
'credential':"test",
'username':"test"
}];
使用docker搭建STUN/TURN服务器
前言
STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
TURN,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展
简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。
ICE的全称Interactive Connectivity Establ.shment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。
STUN和TURN服务器和ICE可以参考阅读: P2P技术详解(三):P2P技术之STUN、TURN、ICE详解
本文介绍如何通过DOCKER搭建STUN和TURN服务器,步骤如下
1:创建Dockerfile,内容如下:
FROM ubuntu:14.04
MAINTAINER Patxi Gortázar<patxi.gortazar@gmail.com>
RUN apt-get update&& apt-get install-y\
curl\
libevent-core-2.0-5\
libevent-extra-2.0-5\
libevent-openssl-2.0-5\
libevent-pthreads-2.0-5\
libhiredis0.10\
libmysqlclient18\
libpq5\
telnet\
wget
RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz\
&& tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz\
&& dpkg-i coturn_4.4.2.2-1_amd64.deb
COPY./turnserver.sh/turnserver.sh
ENV TURN_USERNAME test
ENV TURN_PASSWORD test
ENV REALM kurento.org
ENV NAT true
EXPOSE 3478 3478/udp
ENTRYPOINT ["/turnserver.sh"]
2:创建turnserver.sh,内容如下
#!/bin/bash
set-e
if[$NAT="true"-a-z"$EXTERNAL_IP"];then
#Try to get public IP
PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)||echo"No public ip found on http://169.254.169.254/latest/meta-data/public-ipv4"
if[-z"$PUBLIC_IP"];then
PUBLIC_IP=$(curl http://icanhazip.com)||exit1
fi
#Try to get private IP
PRIVATE_IP=$(ifconfig|awk'/inet addr/{print substr($2,6)}'|grep-v 127.0.0.1)||exit1
exportEXTERNAL_IP="$PUBLIC_IP/$PRIVATE_IP"
echo"Starting turn server with external IP:$EXTERNAL_IP"
fi
echo'min-port=49152'>/etc/turnserver.conf
echo'max-port=65535'>>/etc/turnserver.conf
echo'fingerprint'>>/etc/turnserver.conf
echo'lt-cred-mech'>>/etc/turnserver.conf
echo"realm=$REALM">>/etc/turnserver.conf
echo'log-file stdout'>>/etc/turnserver.conf
echo"user=$TURN_USERNAME:$TURN_PASSWORD">>/etc/turnserver.conf
[$NAT="true"]&&echo"external-ip=$EXTERNAL_IP">>/etc/turnserver.conf
exec/usr/bin/turnserver"$@"
3:使用docker build创建镜像,执行结果如下
[root@www]# docker build-t teststurn_1.
Sending build context to Docker daemon 4.096kB
Step 1/11: FROM ubuntu:14.04
---> 6e4f1fe62ff1
Step 2/11: MAINTAINER Patxi Gortázar<patxi.gortazar@gmail.com>
---> Using cache
---> 4460f9f84053
Step 3/11: RUN apt-get update&& apt-get install-y curl libevent-core-2.0-5 libevent-extra-2.0-5 libevent-openssl-2.0-5 libevent-pthreads-2.0-5 libhiredis0.10 libmysqlclient18 libpq5 telnet wget
---> Using cache
---> 05ed9ced48a5
Step 4/11: RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && dpkg-i coturn_4.4.2.2-1_amd64.deb
---> Using cache
---> d82ed28fdac9
Step 5/11: COPY./turnserver.sh/turnserver.sh
---> Using cache
---> 1d37a488282c
Step 6/11: ENV TURN_USERNAME test
---> Running in bfd88f08db42
Removing intermediate container bfd88f08db42
---> cf8af0504b95
Step 7/11: ENV TURN_PASSWORD test
---> Running in b8ef33b7c213
Removing intermediate container b8ef33b7c213
---> 32a832f23169
Step 8/11: ENV REALM kurento.org
---> Running in bbe129edf5b3
Removing intermediate container bbe129edf5b3
---> 21fdfe34689b
Step 9/11: ENV NAT true
---> Running in 5bdfe8555d5e
Removing intermediate container 5bdfe8555d5e
---> dc7fc896841c
Step 10/11: EXPOSE 3478 3478/udp
---> Running in 67aaa1966f68
Removing intermediate container 67aaa1966f68
---> a12646ed45ff
Step 11/11: ENTRYPOINT ["/turnserver.sh"]
---> Running in b8fc2ff09265
Removing intermediate container b8fc2ff09265
---> f5e5acad0f81
Successfully built f5e5acad0f81
Successfully tagged teststurn_1:latest
执行完后可以看到自己创建的镜像名称为teststurn_1
4:启动docker的镜像,并开启端口3478
docker run-d-p 3478:3478-p 3478:3478/udp teststurn_1
启动后需要等待一两分钟才能测试顺畅
5:测试服务器效果
打开 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 并输入自己的本机IP和端口,分别测试两种协议服务是否生效
WebRTC之STUN与TURN以及ICE
在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。
很多时候,我们希望处于不同内部网络中的两台主机能够直接进行通信,即所谓的P2P通信,避免通过其他公共服务器的中转的方式来降低实时通信的延迟。
由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。
这种技术通常称为NAT穿透(NAT Traversal),而更多关于NAT的介绍我们在《 WebRTC之NAT穿墙》已经做了简单的介绍。
如果对NAT穿透还不了解的话建议先温习一下。
而今天的主角是STUN、TURN和ICE,它们是实现NAT穿透的不同技术方案。
STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,
即NAT会话穿透。STUN在RFC5389与RFC3489中除了名称变化外,最大的区别是在新的定义中支持TCP穿透。
STUN是典型的客户端/服务器模式,客户端发起请求,服务端进行响应,默认端口是3478。
两种STUN规范:分别是 RFC3489和 RFC5389。
RFC3489通过UDP进行穿墙。目前的服务器对于UDP的限制比较多,导致这种模式穿墙的成功率不高。
RFC5389是在RFC3489的升级版,但是含义确是不一样的,一系列的穿墙攻击,纳入了TCP穿墙。
所有的STUN消息都包含20个字节(每个字节占8位,总共是160位)的消息头,其中2个字节(也就是16位)的消息类型,
2个字节的消息长度,这个长度不包含消息头的长度还有16个字节的事务ID,请求与响应事务ID相同。
消息头之后就是是消息体,消息体可以是0或多个属性,每个属性进行TLV编码,包括16位的属性类型、16位的属性长度和变长属性值。
更加具体的消息交互协议笔者目前还不打算深入研究,因为目前我的目的是为了学习并使用WebRTC,还没到达弄清楚WebRTC的每一个细节点的高深境界。
四种主要NAT类型中有三种是可以使用STUN进行穿透:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT,对称型NAT则不能使用。
上面说到对称型NAT无法使用STUN成功进行穿透,这时候就需要TURN出场了。
TURN协议的目的就是为了解决对称型NAT无法穿越的问题。
TURN(Traversal Using Relay NAT,通过Relay方式穿越NAT),是一种数据传输协议。允许通过TCP或UDP方式穿透NAT。
TURN也是一个Client/Server协议,也和STUN使用同样的消息格式。
但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port",也就是中继转发地址。
这时TURN server会建立peer,即远端端点(remote endpoints),开始进行中继(relay)的动作,TURN client利用relay port将数据传送至peer,再由peer转传到另一方的TURN client。
说白了笔者觉得TURN协议更像一个中继转发协议,并不是真正意义上的P2P通信(不知道笔者这样的理解对不对)
ICE(Interactive Connectivity Establishment,互动式连接建立)。ICE定义了穿越方法而不是协议。
既然我们NAT穿透可以使用STUN也可以使用TURN,那么什么时候使用STUN什么时候使用TURN呢?这就是ICE做的事情。
更通俗地讲ICE更像一个NAT穿透的管理者,使用者只需要告诉ICE我要穿墙即可,至于怎么穿墙那就是ICE的事情了。
ICE整合了STUN与TURN。ICE使得两个NAT后的端点通信更加便捷。ICE使用STUN进行打洞,若失败,则使用TURN进行中转。
下面说说ICE的主要工作:
1、收集候选地址也就是收集Candidate
所谓的Candidate就是一个由IP和端口组成的地址。而Candidate又有三种类型:
2、对Candidate Pair进行排序
ICE收集到了候选者地址后,两个对等端都拥有了若干自己和对方的候选地址,并将其配对,组成Candidate Pair。
每对Candidate Pair都有对应的优先级,ICE需要对每对Candidate Pair进行优先级的排序。
3、对候选地址进行连通性检测
ICE对排序好的Candidate Pair进行发送检测和接收检测,发送和检测是同时进行的,如果发送消息出去之后还能收回和发送出去一样的信息则说明连通性是通的
《P2P技术详解(四):P2P技术之STUN、TURN、ICE详解》
微信公号:思想觉悟
关于STUN服务器和使用docker搭建STUN/TURN服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。