如何搭建WebRTC信令服务器 webrtc proxy
nanshan 2024-12-16 15:05 22 浏览 0 评论
1.WebRTC后台服务:
通话的房间服务器(Room Server)
房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台上的AppRTC这个房间服务器实现,该GAE App的源码可以在github.com上获取.该实现是一个基于Python的GAE应用,我们需要下载Google GAE的离线开发包到我们自己的Linux服务器上来运行该项目,搭建大陆互联网环境下的房间服务器.
通话的信令服务器(Signaling Server)
信令服务器是用来管理和协助通话终端建立去中心的点对点通话的一个角色。这个角色要负责一下任务:
1)用来控制通信发起或者结束的连接控制消息
2)发生错误时用来相互通告的消息
3)各自一方媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等
4)两两之间用来建立安全连接的关键数据
5)外界所能看到的网络上的数据,比如广域网IP地址、端口等
信令服务器的具体协议实现没有严格规定,只要实现功能就OK.我们这里依然沿用Google提供的基于GO语言和WebSocket的信令服务器Collider.和上面的房间服务器一并在Github上可以获取.获取到我们自己的Linux服务器上用GO语言的运行环境来运行该信令服务器.
防火墙打洞服务器(STUN/TURN/ICE Server)
我们目前大部分人连接互联网时都处于防火墙后面或者配置私有子网的家庭(NAT)路由器后面,这就导致我们的计算机的IP地址不是广域网IP地址,故而不能相互之间直接通讯. 正因为这样的一个场景,我们得想办法去穿越这些防火墙或者家庭(NAT)路由器,让两个同处于私有网络里的计算机能够通讯起来.
STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越); STUN协议服务器就是用来解决这些问题:
1、探测和发现通讯对方是否躲在防火墙或者NAT路由器后面.
2、确定内网客户端所暴露在外的广域网的IP和端口以及NAT类型等信息;STUN服务器利用这些信息协助不同内网的计算机之间建立点对点的UDP通讯.
STUN协议可以很好的解决一般家用(NAT)路由器环境的打洞问题,但是对于大部分的企业的网络环境就不是很好了.
这时需要一个新的解决方案:TURN(Traversal Using Relay NAT,允许在TCP或UDP的连线上跨越 NAT 或防火墙. TURN是一个Client-Server协议。TURN的NAT穿透方法与STUN类似,都是通过取得应用层中的公有地址达到NAT穿透,但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port", 也就是relayed-transport-address.这时 TURN server会建立peer,即远端端点(remote endpoints), 开始进行中继(relay)的动作,TURN client利用relay port将资料传送至peer,再由peer转传到另一方的TURN client.通过服务器新产生的peer来进行数据的中转.
ICE协议就是综合前面2种协议的综合性NAT穿越解决方案.
通过offer/answer模型建立基于UDP的通讯。ICE是offer/answer模型的扩展,通过在offer和answer的SDP(Session Description Protocol)里面包含多种IP地址和端口,然后对本地SDP和远程SDP里面的IP地址进行配对,然后通过P2P连通性检查进行连通性测试工作,如果测试通过即表明该传输地址对可以建立连接。其中IP地址和端口(也就是地址)有以下几种:本机地址、通过STUN服务器反射后获取的server-reflexive地址(内网地址被NAT映射后的地址)、relayed地址(和TURN转发服务器相对应的地址)及Peer reflexive地址等。
2.房间服务器与信令服务器搭建:
我们把这一系列后台服务器搭建在公网的一个Ubuntu Linux服务器中.
服务器的代码我们选用GoogleChrome的开源项目,该项目可以在Github找到:
https://github.com/GoogleChrome/webrtc
该项目的一些示例可以在下面网址得到:
https://github.com/GoogleChrome/webrtc
在我们自己的服务器中运行Google的房间服务器AppRTC需要依赖 Google App Engine SDK for Python 和 Grunt.
先搭建房间服务器AppRTC
首先我们安装Grunt:
cheetah@localhost:~/$ sudo apt-get install npm
cheetah@localhost:~/$ sudo apt-get install nodejs-legacy
cheetah@localhost:~/$ sudo npm -g install grunt-cli;
下载该项目的源码到某个目录:
cheetah@localhost:~/$ cd ~;
cheetah@localhost:~/$ git clone https://github.com/GoogleChrome/webrtc.git;
终端Shell切换当前工作目录到上一步的下载的项
目目录webrtc下,然后安装Grunt以及Grunt的依赖:
cheetah@localhost:~/$ cd ~;
cheetah@localhost:~/$ git clone https://github.com/GoogleChrome/webrtc.git;
运行AppRTC房间服务器之前我们需要Grunt编译一下该项目的js文件之类:
cheetah@localhost:~/webrtc$ grunt;
上面的编译过程会自动下载安装Google App Engine SDK至当前目录.
cheetah@localhost:~/webrtc$ ls
bower.json google_appengine Gruntfile.js LICENSE.md README.md samples
build google_appengine_1.9.17.zip images node_modules run_python_tests.py webtest-master
CONTRIBUTING.md grunt-chrome-build index.html package.json run_python_tests.sh webtest-master.tar.gz
下一步,我们需要把Google App Engine SDK的目录加入系统环境变量$PATH,并使之生效.
cheetah@localhost:~/webrtc$ echo "export PATH=$PATH:$PWD/google_appengine" > ~/.bash_profile
cheetah@localhost:~/webrtc$ source ~/.bash_profile
这个时候我们就可以直接运行我们的房间服务器AppRTC了.用下面的命令来开启(主机名:vpn.wuqiong.tk可以用自己的给我钱IP地址代替):
cheetah@localhost:~/webrtc$ dev_appserver.py –host vpn.wuqiong.tk samples/web/content/apprtc/
再搭建信令服务器
信令服务器我们依然采用Google Chrome WebRTC项目里提供的用GO语言编写的基于websocket的信令服务器:Collider.
我们需要先安装Go语言运行环境支持:
cheetah@localhost:~/webrtc$ sudo apt-get install golang-go
然后在我们的用户目录新建一个目录(collider_root)来存放这个Collider的go代码程序.
cheetah@localhost:~/webrtc$ mkdir -p ~/collider_root;cheetah@localhost:~/webrtc$ exportCOLLIDER_ROOT=$HOME/collider_root; //也可以加入~/.bash_profile
下一步就是链接wenrtc项目目录下面的collider代码目录到$COLLIDER_ROOT/src下去,准备后续的编译工作;
cheetah@localhost:~/webrtc$ ln -sf $PWD/samples/web/content/apprtc/collider/collider$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ ln -sf $PWD/samples/web/content/apprtc/collider/collidermain$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ ln -sf $PWD/samples/web/content/apprtc/collider/collidertest$COLLIDER_ROOT/src/
一切准备之后,我们就主要编译安装Collider了:
cheetah@localhost:~/webrtc$ go get collidermaincheetah@localhost:~/webrtc$ go install collidermain
这个时候,信令服务器的二进制程序就安装到了$COLLIDER_ROOT/bin下去了. 如下命令就可以开启运行信令服务器:
cheetah@localhost:~/webrtc$ $COLLIDER_ROOT/bin/collidermain -port=8089 -tls=false
信令服务器暂时用非tls方式运行.因为我们自签名的证书Websocket通讯不了.
3.STUN/TURN/ICE服务器的搭建
我们选择有更丰富功能的coTurn作为我们的NAT穿越打洞服务器,该项目是一个C/C++语言的开源项目,项目地址:https://code.google.com/p/coturn/ 或者我们直接下载已经编译好的软件包,在下面站点可以下载我们对应平台的软件包:http://turnserver.open-sys.org/downloads/v4.4.1.2/ 打开这个网址,根据我们的服务器类型选择下载,我现在选择Debian和Ubuntu系统的包:
cd ~;wget http://turnserver.open-sys.org/d … t-x86-64bits.tar.gz
接着解压软件包:
tar xvfz turnserver-4.4.1.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz
详细阅读安装手册 INSTALL 文件,根据指导进行安装:
$ sudo apt-get update$ sudo apt-get install gdebi-core$ sudo gdebi coturn*.deb
然后编辑配置文件,打开系统默认启动配置:
$ vim /etc/default/coturn
把上面打开编辑的文件中的这一行TURNSERVER_ENABLED=1去掉注释,保存退出.
再根据实际情况编辑coturn的配置文件 /etc/turnserver.conf,比如我打开的配置项如下:
listening-device=eth0listening-ip=~~106.186.127.xxx~~relay-device=eth0relay-ip=~~106.186.127.xxx~~Verbosefingerprintlt-cred-mechuse-auth-secretstatic-auth-secret=diveineduuser=diveinedu:0x06b2afcf07ba085b7777b481b1020391user=diveinedu:diveinedustale-noncecert=/etc/turn_server_cert.pempkey=/etc/turn_server_pkey.pemno-loopback-peersno-multicast-peerssha256mobilityno-cli
上面cert和pkey配置的自签名证书用Openssl命令生成:
sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
穿墙服务器的一切配置完成之后, 万事俱备,之前启动命令了:
service coturn start;
房间服务器和信令服务器的设置
三个服务器都搭建完成之后,我们需要多一定的整合配置,使他们能一起工作: apprtc目录下的constants.py是一些常量配置信息的配置文件,比如我的做了如下设置:
#TURN_BASE_URL = 'https://computeengineondemand.appspot.com'TURN_BASE_URL ='http://apprtc.diveinedu.com'#TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'TURN_URL_TEMPLATE ='%s/turn.php?username=%s&key=%s'#CEOD_KEY = '4080218913'CEOD_KEY = 'diveinedu'#WSS_HOST_PORT_PAIR = 'apprtc-ws.webrtc.org:443'WSS_HOST_PORT_PAIR = 'apprtc.diveinedu.com:8089'
由于我们的信令服务器没有开启安全Socket模式,所以我们要对应的改一下apprtc的代码, 做apprtc.py中如下修改:
def get_wss_parameters(request): ws_host_port_pair = request.get('wshpp') ws_tls = request.get('wstls') if notws_host_port_pair: ws_host_port_pair = constants.WSS_HOST_PORT_PAIR if ws_tls and ws_tls == 'false': wss_url ='ws://' + ws_host_port_pair + '/ws' wss_post_url = 'http://' + ws_host_port_pair else: wss_url = 'ws://' + ws_host_port_pair+ '/ws' wss_post_url = 'http://' + ws_host_port_pair return (wss_url, wss_post_url)
把原来的wss和https的scheme都改为ws和http,不要让客户端或者浏览器去使用SSL链接.当然,如果有第三方根证书的签名机构颁发的证书,那就不需要这样了
而对应的信令服务器也需要稍微做设置: 编辑collider/collidermain/main.go,修改设置自己的房间服务器URL:
//var roomSrv = flag.String("room-server", "https://apprtc.appspot.com", "The origin of the room server")var roomSrv = flag.String("room-server", "http://apprtc.diveinedu.com:8080/", "The origin of the room server")
经过这一些简单的房间服务器和信令服务器的定制设置之后,我们就搭建了一套基于Google项目的属于自己的WebRTC的简单服务了.
用谷歌浏览器打开 http://apprtc.diveinedu.com:8080/ ,注册房间之后就可以视频通话了.当然结合之前的WebRTC for iOS 框架就可以浏览器和iOS的原生应用直接视频通话了.
相关推荐
- Let’s Encrypt免费搭建HTTPS网站
-
HTTPS(全称:HyperTextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入...
- 使用Nginx配置TCP负载均衡(nginx tcp负载)
-
假设Kubernetes集群已经配置好,我们将基于CentOS为Nginx创建一个虚拟机。以下是实验种设置的详细信息:Nginx(CenOS8Minimal)-192.168.1.50Kube...
- Nginx负载均衡及支持HTTPS与申请免费SSL证书
-
背景有两台minio文件服务器已做好集群配置,一台是192.168.56.41:9000;另一台是192.168.56.42:9000。应用程序通过Nginx负载均衡调用这两台minio服务,减轻单点...
- HTTPS配置实战(https配置文件)
-
原因现在网站使用HTTPS是规范操作之一,前些日子买了腾讯云服务,同时申请了域名http://www.asap2me.top/,目前该域名只支持HTTP,想升级为HTTPS。关于HTTPS的链接过程大...
- 只有IP地址没有域名实现HTTPS访问方法
-
一般来说,要实现HTTPS,得有个注册好的域名才行。但有时候呢,咱只有服务器的IP地址,没注册域名,这种特殊情况下,也能照样实现HTTPS安全访问,按下面这些步骤来就行:第一步,先确认公网...
- 超详解:HTTPS及配置Django+HTTPS开发环境
-
众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种。在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数...
- Godaddy购买SSL之后Nginx配置流程以及各种错误的解决
-
完整流程:参考地址:https://sg.godaddy.com/zh/help/nginx-generate-csrs-certificate-signing-requests-3601生成NGI...
- Nginx从安装到高可用,一篇搞定(nginx安装与配置详解)
-
一、Nginx安装1、去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本2、上传nginx到linux系统3、安装依赖环境(1)安装gcc环境yuminstallgc...
- 阿里云免费证书申请,配置安装,使用tomcat,支持http/https访问
-
参数说明商品类型默认已选择云盾证书服务(无需修改)。云盾证书服务类型SSL证书服务的类型。默认已选择云盾SSL证书(无需修改),表示付费版SSL证书。如果您需要免费领取或付费扩容DV单域名证书【免费试...
- 你试过两步实现Nginx的规范配置吗?极速生成Nginx配置小工具
-
NGINX是一款轻量级的Web服务器,最强大的功能之一是能够有效地提供HTML和媒体文件等静态内容。NGINX使用异步事件驱动模型,在负载下提供可预测的性能。是当下最受欢迎的高性能的Web...
- 从零开始搭建HTTPS服务(搭建https网站)
-
搭建HTTPS服务的最初目的是为了开发微信小程序,因为wx.request只允许发起HTTPS请求,并且还必须和指定的域名进行网络通信。要从零开始搭建一个HTTPS的服务需要下面4...
- 群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问
-
安全第一步,群晖NAS使用官网域名和自己的域名配置SSL实现HTTPS访问【新手导向】NAS本质还是一个可以随时随地访问的个人数据存储中心,我们在外网访问的时候,特别是在公网IP下,其实会面临着很多安...
- 让网站快速升级HTTPS协议提高安全性
-
为什么用HTTPS网络安全越来越受到重视,很多互联网服务网站,都已经升级改造为https协议。https协议下数据包是ssl/tcl加密的,而http包是明文传输。如果请求一旦被拦截,数据就会泄露产生...
- 用Https方式访问Harbor-1.9版本(https访问流程)
-
我上周在头条号写过一篇原创文章《Docker-Harbor&Docker-kitematic史上最详细双系统配置手册》,这篇算是它的姊妹篇吧。这篇文章也将用到我在头条写的另一篇原创文章的...
- 如何启用 HTTPS 并配置免费的 SSL 证书
-
在Linux服务器上启用HTTPS并配置免费的SSL证书(以Let'sEncrypt为例)可以通过以下步骤完成:---###**一、准备工作**1.**确保域名已解析**...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
【系统配置】信创终端挂载NAS共享全攻略:一步到位!
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)