p2p云端服务配置介绍和部署说明

    云端服务由golang语言开发,天然具有跨平台和高性能特点。kkp2p云端服务有四个运行模块,分别是p2p_route、p2p_track、p2p_relay,turnserver,这四个模块均支持分布式部署,即可以分别部署在多台机器上,也可以集中部署在同一台服务器上,整个云端系统可以随着业务规模的变化进行弹性的扩缩容。

     turnserver模块是开源的c++可选模块,如果您需要以下三个功能之一,则必须部署turnserver模块,否则可以不用部署(如果仅使用tcp类型通道,且不需要ipv6穿透功能)。其开源地址为  https://github.com/coturn/coturn.git

     (1)、需要使用udp类型通道

     (2)、需要使用webrtc类型通道

     (3)、需要支持ipv6穿透,此时turnserver必须多配置监听机器的ipv6地址,该ipv6地址要加到turnserver的域名解析中。

    如果您的sdk创建连接使用的是局域网搜索模式,是不需要部署和使用云端服务的。

1、p2p_route模块的配置说明和部署

1.1 模块介绍

    p2p_route是路由模块,里面保存了所有的peer server的登录路由相关的信息。p2p_route一台机器只能部署一个实例,因为p2p_route对外提供的服务端口号只能有一个,该端口号是给peer server登录以及给peer client建连使用的。peer server和peer client支持使用域名或者ip地址进行登录或者建连。当使用域名进行登录或建连时,您可以设计成一个域名对应多台机器,每台机器上部署一个p2p_route实例。kkp2p sdk内部会定时对域名进行解析出ip地址列表,会随机选择一台机器ip进行登录或者建连。

p2p_route对登陆peer数没有限制,能保存多少路由信息,完全由您机器的内存决定。

1.2 启动命令

nohup ./p2p_route -f ./p2p_route.json &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f后面是配置文件名称

1.3 配置说明

[root@ecs-def8 p2p_route]# cat p2p_route.json 

{

    "public_ip" : "124.71.217.***",

    "route_wan_host": "192.168.0.44:3080",

    "route_lan_host": "192.168.0.44:3081",

    "ocm_lan_host": "192.168.0.44:32917",

     "turn_server": "your-domain:3478",

    "turn_realm": "your-domain",

     "webrtc_conf": {

                "http_wan_host": "192.168.0.44:8080",

                "ssl_cert_file": "/etc/nginx/test.pem",

                "ssl_key_file": "/etc/nginx/test.key"

    }

}


配置项说明
public_ip

是对外提供的云服务器的公网ip地址,即初始化kkp2p中间件配置文件中域名所对应的ip地址或者ip地址之一,该ip地址用于peer server登录或者peer client建连使用。

如果您从云厂商购买了一台服务器,您也是通过该ip地址远程登录到您服务器上进行管理。

route_wan_host

进程运行实际绑定的ip和端口号,用于对公网提供服务,即用于对客户端peer client和peer server提供服务。


顾名思义,route_wan_host本应该是一个公网的ip地址,但是一般情况下,您从云服务商购买的服务器,机器网卡只有一个局域网ip地址,程序运行只能绑定这个地址。云服务商内部的NAT设备(路由器)将一个公网ip地址(上述的public_ip)和该局域网地址做了映射,外部访问的是public_ip,您程序实际绑定的是局域网地址。


如果您的云服务器主机的网卡本身有公网ip地址,那么这里就填写实际的公网ip地址用于程序启动绑定。linux服务器可以通过ifconfig -a命令看机器的网卡和ip地址信息。


您的云服务器必须开放该端口的tcp访问权限。

route_lan_host

进程运行实际绑定的ip和端口号,用于对另外两个云端服务p2p_track和p2p_relay提供服务。


顾名思义,为安全起见,route_lan_host应该是一个局域网的ip地址,公网不应该访问到。


如果您的云服务器具有多个ip地址,您应该使用局域网(内网)ip地址。如果是linux服务器,您可以通过ifconfig -a命令查看机器的实际网卡和ip地址信息。

ocm_lan_host

内部运维ip和端口号,telnet命令可以连接该地址对该模块进行运维管理。该地址必须是内网地址,且端口号访问权限不能对公网放开。

只有正式版本才支持该配置,个人版本可以配置为空

turn_server

该配置项是开源服务turnserver的部署机器对应的访问域名以及对应udp端口号。

2.0版本及以上才支持该配置,不需要turnserver功能可以配置为空。

turn_realm

该配置项一般配置为开源服务turnserver的域名

2.0版本及以上才支持该配置,不需要turnserver功能可以配置为空

http_wan_host

如果需要支持webrtc通信,则必须配置该配置项。该配置项向浏览器前端提供http/https接口服务,不需要webrtc功能可以填空

2.0版本及以上才支持该配置。

云服务器必须开通该端口外网访问权限

ssl_cert_file

数字证书文件。如果配置该选项,则向往提供https协议;如果为空则向外提供http协议。为了数据安全,建议配置。不需要webrtc功能可以填空

2.0版本及以上才支持该配置。

ssl_key_file

数字证书对应的私钥文件。不需要webrtc功能可以填空

2.0版本及以上才支持该配置。

2、p2p_track模块的配置说明和部署

2.1 模块介绍

    p2p_track是实际的登录模块,peer server会登录到p2p_track模块并保持和p2p_track之间的长连接,且定时和p2p_track之间发送心跳消息。peer client和peer server建连的信令协议是通过p2p_track模块进行中转的。

p2p_track同时向外提供NAT探测服务,所以需要云服务器同时放开udp和tcp端口的访问权限。

p2p_track可以部署在一台或者多台机器之上,支持动态扩缩容(增加部署实例即扩容,停止实例服务即缩容)。也支持在一台服务器之上部署多个p2p_track实例,只要这些实例的端口号配置不一样即可。

2.2 启动命令

nohup ./p2p_track -f ./p2p_track.json -l p2p_license &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f选项后面是配置文件名称, -l选项后面是license文件所存放的目录;如果没有-l选项,默认是程序启动目录下的名为p2p_license的目录。

2.3 配置说明

[root@ecs-def8 p2p_track]# cat p2p_track.json 

{

    "public_ip": "124.71.217.***",

    "track_wan_host": "192.168.0.44:3380",

    "route_lan_hosts": [

        "192.168.0.44:3081"

    ],

    "ocm_lan_host": "192.168.0.44:32918",  

    "webrtc_conf": {

        "websocket_wan_host": "192.168.0.44:8090"

     }

}


配置项说明
public_ip

和p2p_route模块的含义一样,即对外提供服务的云服务器公网ip地址

track_wan_host

即程序启动实际绑定的ip地址和端口号,用于对外的peer client和peer server提供服务。程序启动虽然绑定的是该ip地址和端口号,但对外表现的是public_ip地址。和p2p_route模块的route_wan_host类似。

您的云服务器必须同时开放该端口的tcp和udp端口访问权限。因为该端口同时向外提供tcp和udp服务。

route_lan_hosts

是json的一个数组配置,配置所有p2p_route实例的route_lan_host信息,p2p_track会向每个p2p_route实例上报心跳消息,让每个p2p_route实例感知到自己的存在。

ocm_lan_host

内部运维ip和端口号,telnet命令可以连接该地址对该模块进行运维管理。该地址必须是内网地址,且端口号访问权限不能对公网放开。

只有正式版本才支持该配置,个人版本可以配置为空

websocket_wan_host

如果需要支持webrtc通信,则必须配置该配置项。该配置项为websocket服务端地址。不需要webrtc功能可以填空。

2.0版本及以上才支持该配置。

云服务器必须开通该端口外网访问权限

2.4 license目录以及license文件

    license目录存放了所有的license文件,license文件必须由深圳库快科技有限公司提供。具体一个license文件举例如下:[root@ecs-def8 p2p_license]# cat license_id.txt 

kkuai-ipc-00001 WtXmjG

kkuai-ipc-00002 OBq26M

license-sign AUav2LFuXS5TWFwxJ3NLDL*************************


    该配置文件一共有三行。第一行和第二行是两个登录账号以及各自的密码,用于对登录的peer的签名信息进行鉴权,保障云端服务的安全性,只允许合法的账号进行登录。最后一行是深圳市库快科技有限公司的签名信息。您必须通过在深圳库快科技有限公司的官网上通过购买方式合法获取license文件,否则程序运行会出现异常。


    license文件可以按照业务的发展情况按量分多批次购买,统一放在该目录下,程序启动时候会一次性读取该目录下所有的license文件信息。


    友善提醒您,您购买的license登录账号个数只要超过您的最大同时在线设备数即可,可以在您的业务逻辑里面实现设备在线时候动态获取登录账号和密码,设备离线时候动态回收,这样可以极大节约您的购买成本。另外在很多场景,比如通过手机app观看网络摄像头,作为连接的服务端(peer server),只有网络摄像头需要购买license账号和密码进行登录;作为主动发起连接的手机app客户端(peer client),是不需要使用登录账号和密码的。

2.5 open files数限制

    一般对于linux系统,每个进程能够打开的句柄数(包括socket句柄)是有限制的,可以通过ulimit -a命令查看限制,如下图所示:


ubuntu下系统缺省值是65535,因此最多只支持65535个设备同时在线,建议将该值改为655350,即单机支持65万设备同时在线。ubuntu下通过vi命令修改文件 /etc/security/limits.conf,将里面的65535改为655350,修改完毕后执行reboot命令重启生效。

经过测试,在4核(2500MHz)8G服务器(8G内存,400% cpu资源),p2p track至少支持25W设备同时在线(实耗3.6G内存、59% cpu),因此理论上单台4核8G服务器应该可以同时支持50W设备同时在线。

3、p2p_relay模块的配置说明和部署

3.1 模块介绍

    p2p_relay是中转模块,当两个peer之间NAT穿透失败无法直接通信时候,就通过p2p_relay模块中转方式进行通信。p2p_relay模块必须部署在带宽比较充足的云服务器上,您才会获取得较好的中转性能,具体需要的中转带宽和性能您可以根据自己的业务量和业务特性进行评估。

p2p_relay可以部署在一台或者多台机器之上,支持动态扩缩容(增加部署实例即扩容,停止实例服务即缩容)。也支持在一台服务器之上部署多个p2p_relay实例,只要这些实例的端口号配置不一样即可。

3.2 启动命令

nohup ./p2p_relay -f ./p2p_relay.json -l p2p_license &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-f选项后面是配置文件名称, -l选项后面是license文件所存放的目录;如果没有-l选项,默认是程序启动目录下的名为p2p_license的目录。

3.3 配置说明

[root@ecs-def8 p2p_relay]# cat p2p_relay.json 


{

    "public_ip":"124.71.217.***",

    "relay_wan_host": "192.168.0.44:3280",

    "route_lan_hosts":[

         "192.168.0.44:3081"

        ],

    "ocm_lan_host":"192.168.0.44:32919"

}


配置项说明
public_ip

和p2p_route模块的含义一样,即对外提供服务的云服务器公网ip地址

relay_wan_host

即程序启动实际绑定的ip地址和端口号,用于对外的peer client和peer server提供服务。程序启动虽然绑定的是该ip地址和端口号,但对外表现的是public_ip地址。和p2p_route模块的route_wan_host类似。

服务器必须同时开放该端口号的tcp对外访问权限。

route_lan_hosts

是json的一个数组配置,配置所有p2p_route实例的route_lan_host信息,p2p_relay会向每个p2p_route实例上报心跳消息,让每个p2p_route实例感知到自己的存在。

ocm_lan_host

内部运维ip和端口号,telnet命令可以连接该地址对该模块进行运维管理。该地址必须是内网地址,且端口号访问权限不能对公网放开。

只有正式版本才支持该配置,个人版本可以配置为空


3.4 license目录以及license文件

和2.4章节介绍相同。

4、coturn模块的配置说明和部署

4.1 模块介绍

    coturn是一个开源服务,向外提供stun/turn服务。turnserver可以进行集群化部署,通过域名进行访问。

    由于coturn是一个开源服务,因此不是库快公司的正式对外交付件,用户可以取开源代码自行编译最新版本,以及查阅资料自行进行安装。官网上免费下载个人版云端服务中提供了库快科技编译的corturn服务的各模块binary以及配置文件模板,提供用户参考。一般安装时需要先安装libssl-dev、libevent-dev和sqlite数据库。

    本文档仅用于描述corturn服务的配置参考,以及和kkp2p sdk相关的一些操作。

4.2 启动命令

nohup ./turnserver -f -r your-realm -c ../etc/turnserver.conf &

启动命令如上,开头的nohup和最后的&符号表示以后台方式运行。-c选项后面是配置文件名称;-r后面的your-realm需要替换成实际的realm配置,一般是部署turnserver服务器的访问域名

4.3 配置说明

root@test-aliyun:~/test# cat tunserver.conf

no-rfc5780

no-stun-backward-compatibility

response-origin-only-with-rfc5780

listening-port=3478

listening-ip=172.17.241.15

listening-ip=2408:xxxx:10e9:xxxx:xxxx:xxxx:xxxx:8e4c

relay-device=eth0

relay-ip=172.17.241.15

external-ip=224.75.168.66

min-port=10000

max-port=65535

verbose

fingerprint

lt-cred-mech

realm=test.com

userdb=/usr/local/var/db/turndb

配置项说明
listening-port

向外提供服务的udp端口号

云端需要开放该端口的udp访问权限

listening-ip

服务绑定的ip地址

需要注意的是,如果需要支持ipv6 p2p功能,则需要配置ipv6地址。

可以配置两个listening-ip,一个配置ipv4地址,另外一个配置ipv6地址,turnserver支持同时侦听多个ip地址

relay-device

用于中转的网卡名字

relay-ip

中转ip地址,turnserver实际绑定的ip地址

external-ip

云服务器的外网ip地址,即用户访问需要设置的ip地址

min-port用于中转的最小端口号
max-port

用于中转的最大端口号

需要注意的是,要查看机器的系统配置,确定机器端口号有效范围是多少,配置的端口号范围要在机器的有效端口号范围之内。

云服务器需要放开端口号范围的udp访问权限。

ubuntu机器可以用以下命令查看机器的端口号范围,如果该端口号范围比较小,可以进行修改。

cat /proc/sys/net/ipv4/ip_local_port_range

realm一般配置为turnserver的域名,需要将test.com替换成实际的域名
userdbturnserver建议使用SQLite本地磁盘数据库,该配置为SQLite数据库的数据文件,用于存储设备账号id以及密钥生成的key,用于鉴权操作。

4.4 账号配置操作

     为了安全起见,需要将p2p登录账号和密码配置到turnserver系统中,让turnserver可以对客户端进行鉴权操作,拒绝非法访问。

     为了方便批量导入,库快提供了一个脚本,脚本内容如下:

     root@test-aliyun:/usr/local/coturn/bin# cat batch-turn-perm.sh

#!/bin/bash
if [ $# -lt 3 ] ; then
    echo "usage: $0 your-license-file your-turn-sqlite-db your-turn-realm"
    exit 1;
fi
while read id key
do
  if [ "$id" == "license-sign" ];then
      continue
  fi
  echo ./turnadmin -a -b $2 -u $id -p $key -r $3
  ./turnadmin -a -b $2 -u $id -p $key -r $3
done < $1

脚本用法如下

./batch-turn-perm.sh your-license-file your-turn-sqlite-db your-turn-realm

第1个参数为p2p账号license文件,第2个参数为sqlite的数据文件名(见配置项说明),第三个参数为turnserver的realm配置(见配置项说明)

以下命令可以查看当前turnserver中配置了哪些账号,-b后面的参数为实际的db文件名

./turnadmin  -l  -b  /usr/local/var/db/turndb