我们在客户的船上安装了监控设备,因为船只要横渡长江,长江南北属于不同的城市辖区,所以船在江中心时肯定会有4G基站变换的动作,导致设备的外网ip地址变化。没有固定ip地址的局域网访问方式一般是通过DDNS,但DDNS检测ip变化的时间需要10分钟,看来DDNS肯定是不适用这样的场景。
可行的方案应该是这样的,船上的设备主动连接到外面一个公网服务器,连接之后又有两种方案:
方案2明显是最优方案,今天我就先来介绍一下端口反向代理。谈到反向代理大家都会想到nginx,它的原理是这样的
很明显这种场景中nginx要能访问到应用服务器,它们一般都是同一内网的服务器。nginx要有外网直接访问到的端口。如果内网在一个没有公网ip的环境中,此访问是不可行的。
nginx与应用服务器不在内网
为什么要说穿透,就是因为我们的应用服务器没有公网ip.我们经常听到的DDNS也只是就种访问没有公网ip的方式,内网一定要在防火墙上映射端口。而我们的场景是更复杂的,除了4G设备上没有映射功能外,ip还会在一定时间内变化。所以我的终极方案是这样的:
除非应用服务器不能上网,否则应用服务器不用防火墙同意直接被穿透。
有了上面的理论基础,我们就按以上的理论来建立:
github上搜了一下,热门的两个方案为ngrok和frp。网上对ngrok好评比较多,所以使用了一下ngrok, 客服端很好用,服务端用ngrok的官网,教程可参考:https://blog.csdn.net/liu_005/article/details/79557818
毕竟我的应用要发送视频数据,数据量比较大,还是要搭建自己的服务器的。一去搭建服务器才知道,ngrok就是个坑,其中的证书一是不知道怎么用;二是真觉得没意义啊,就不能也只是配个auth_key?
果断放弃!去frp一看,Star不比ngrok少,看来ngrok只是占了年龄的光,其实岁数不小了,都三年没更新过了。在看frp的配置,这不就是我想要的。ngrok就不谈了,下面介绍下frp的安装
本着一个docker打天下的原则,我是能用现成docker包的,肯定用docker,没有现成包的,自己build也要用docker封装包。因为我用的centos 7.x,所以安装docker也很简单, 顺便我会一起装docker compose
yum install docker
curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 没权限的自行加sudo
在hub.docker.com中找到一个比较中意的包xddxdd/frps,它的client包就是xddxdd/frpc.
ssh进入一台有公网ip的服务器
为frps建立一个配置文件
mkdir frp #建立项目文件夹
cd frp
mkdir frp #建立配置文件夹
cd frp
vi frps.ini
在frp.ini中输入(#不知道能不能达到注释的作用,请实际使用时去掉#)
bind_port = 7000 #和client通信的端口
token = 123456 #验证码
# 下面都是开启管理面板的配置
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 654321
保存好frps.ini后(不会用vi的自行百度)。
cd ..
vi docker-compose.yml
输入如下
version: '2'
services:
server:
image: xddxdd/frps
restart: always
volumes:
- ./frp:/frp
ports:
- 7500:7500
- 7000:7000
- 6000-6010:6000-6010 # 预留应用的端口
command: frps -c frps.ini
保存好docker-compose.yml后,就可以运行了
docker-compose up -d
在船上4G内网环境下,放一台centos主机。这里就可以提现docker的好处了,因为docker在windows上是一样的用法
安装docker
建立客户端配置文件
mkdir frp
cd frp
mkdir frp
vi fprc.ini
输入配置参数
[common]
server_addr = xxx.xxx.xxx.xxx #服务器ip
server_port = 7000 #服务器通信端口
token = 123456 #服务器验证码
[ssh]
type = tcp
local_ip = 127.0.0.1 #本机地址
local_port = 22 #本机端口
remote_port = 6000 #在服务器注册的端口,注册成功后访问服务器的6000就等于访问的本地的22端口
保存成功后
cd ..
vi docker-compose.yml
输入如下
version: '2.2'
services:
client:
image: xddxdd/frpc
network_mode: host # 这里要用host才能访问到主机,不然127.0.0.1只能访问到这个docker容器,就没意义了
restart: always
volumes:
- ./frp:/frp
client 不要夹command制定配置文件
docker-compose up -d
客服端启动
先打开http://公网ip:7500, 输入admin 654321进入
客户端已经在线。
现在用我的电脑在家连接船电脑
ssh -p 6000 [email protected]
连接成功!
反向穿透成功,client会在断网后不断的从新和server尝试建立连接。
在client的frpc.ini中多加一个配置
[rtsp]
type = tcp
local_ip = aaa.aaa.aaa.aaa #摄像头ip,可以指向非自身的ip哦
local_port = 554 #rtsp端口
remote_port = 6001
重新启动客服端
docker-compose restart
rtsp播放器播放 rtsp://xxx.xxx.xxx.xxx:6001/streaming/101 成功