OpenVidu(九) STUN/TURN 打洞

根据前面八章的内容,一个简单的在局域网的WebRTC应用已经建立了。如果部署在公网可能还不能用。

不同网络间不能直接访问

在局域网中我们的客户端是在同一个网络中,彼此通过ip很容易访问到。但是在公网环境,客户端A可能用的局域网A,客户端B可能用的局域网B,彼此之间不能通过IP访问。这个时候就需要有个工具充当桥梁的作用,在客户端A和客户端B建立通讯连接的功能。
男生和女生分属不同的局域网,彼此间通过自己的Private IP不能访问到对方

利用中介解决问题

有两种方案可以解决这个问题 STUN和TURN

STUN(Session Traversal Utilities for NAT)服务器充当向其发出请求的临时中间人,他会在双方NAT设备上打开一个端口以允许响应返回,然后告知双方对方的开发端口,这样双方就能进行p2p连接了。这种行为叫网络打洞。STUN只解析/提供双方的访问地址,不参与实际的数据传输。实际的数据传输是在双方获取到彼此的地址后,直接通讯。所以这种方法也叫做P2P。
在这里插入图片描述

TURN(Traversal Using Relays around NAT)服务器是公共访问位置的中继,防止无法进行P2P连接。TURN会直接参与数据的传输。
在这里插入图片描述

在某些情况下,例如由于防火墙的限制,无法打洞。在这些情况下,两个对等点根本无法直接进行一对一对话,并且它们的所有流量都通过TURN服务器中继。这是一个第三方服务器,两个对等方都可以无限制地连接到该服务器,并且可以简单地将数据从一个对等方转发到另一对等方。

使用哪种方案

目前提供STUN/TURN服务的软件很多,市面上最常见的是COTURN。
方案一:OpenVidu Deployment 自带了一个COTURN,需要在启动的时候把3478端口和待访问端口映射出来就可以用了。
方案二:自建COTURN服务。

不想麻烦可以选用方案一,本文介绍方案二。

COTURN的安装

TURN服务器的一种流行实现是coturn。 基本上STUN 及TURN所有这些功能都可以由一台服务器实现。
1、准备一台有独立IP的主机
可以购买一台云主机,比如阿里云/腾讯元/华为云等。
在这里插入图片描述
2、安装coturn

apt update
apt install coturn

3、创建用户
使用命令turnadmin创建一个用户/密码,并添加到SQLlite数据库中。
增加普通long-term TURN用户(还有管理员用户),用于WebRTC的登陆。
格式:$ turnadmin -a -u -r -p

$ sudo turnadmin -a -u ts -p 12345678 -r testrealm

添加用户名为ts,密码为12345678,realm域为testrealm的用户。

3、修改配置文件/etc/turnserver.conf

# 本地监听外网的网卡设备,默认eth0,可通过ip addr命令查看
listening-device=eth0
# TURN服务器UDP/TCP监听端口,默认:3478,同时根据协议会自动开启3479
# 应该需要云服务器防火墙开放端口
listening-port=3478
#公网ip
external-ip=xx.xx.xx.xx 
#内网地址
listening-ip=172.xx.xx.xxx 
#用户名和密码,STUN不需要配置,TURN必须配置
user=username:password
#管理台密码,必须添加;不加这个运行会报错,随便写
cli-password=123456 

#本地用于转发的网卡设备,默认eth0
relay-device=eth0
# UDP中继端口范围,用于UDP转发,注意云服务器要开发该段的端口
# (default values are 49152 and 65535)
min-port=40000
max-port=60000

# 日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出,默认关闭
# Verbose
# 消息验证,WebRTC 的消息里会用到,默认关闭
fingerprint

# 默认域Realm
# 上一步创建用户的时候,生成的realm。
realm=testrealm


4、启动turn服务器

sudo turnserver -c /etc/turnserver.conf

5、开放云服务器端口
需要开放listening-port 的3478 和 min-port=40000 max-port=60000 的端口
在这里插入图片描述

5、验证
使用如下命令,查看进程是否启动

ps -ef|grep turn

使用如下命令,监听端口

lsof -i:3478

在这里插入图片描述

使用 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 测试如图:
在这里插入图片描述
在这里插入图片描述

修改客户端中ICE的配置

1、android客户端

private void initIceServers() {
    iceServersDefault.add(PeerConnection.IceServer.builder("stun:stun.l.google.com:19302").createIceServer());
    iceServersDefault.add(PeerConnection.IceServer.builder("stun:stun2.l.google.com:19302").createIceServer());
    iceServersDefault.add(PeerConnection.IceServer.builder("stun:stun4.l.google.com:19302").createIceServer());
    iceServersDefault.add(PeerConnection.IceServer.builder("stun:111.xxx.xxx.141:3478").setUsername("ts").setPassword("12345678").createIceServer());
    iceServersDefault.add(PeerConnection.IceServer.builder("turn:111.xxx.xxx.141:3478").setUsername("ts").setPassword("12345678").createIceServer());
}

2.js

iceServers: [
      {
        urls: [
          "turn:10.xxx.xxx.232:3478?transport=udp",
          "turn:10.xxx.xxx.232:3478?transport=tcp", // 可以插入多个进行备选
        ],
        username: "ts",
        credential: "12345678",
      },
      {
         urls: [
           "stun:stun1.l.google.com:19302",
           "stun:stun2.l.google.com:19302",
           "stun:stun3.l.google.com:19302",
           "stun:stun4.l.google.com:19302",
        ],
       },
    ],

3、OpenVidu的js端
OpenVidu的js端是封装在openvidu-webcomponent-2.27.0.js,不好改!!
在这里插入图片描述
好在OpenVidu提供另一种动态配置ICE-Server的方法。
在启动OpenVidu deployment的时候可以配置ICE-Server。

docker run -p 4443:4443 --rm -e OPENVIDU_SECRET=MY_SECRET openvidu/openvidu-dev:2.27.0 OPENVIDU_WEBRTC_ICE_SERVERS=["url=turn:111.xxx.xxx.141:3478,username=ts,credential=12345678"]

所有的OpenVidu客户端可以在获得连接的时间,自动的从OpenVidu deployment中获取到 这些ICE_SERVERS地址。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值