通过反向代理内网穿透访问视频监控

  • 业务场景
  • 反向代理
  • 建立反向代理
  • 安装docker
  • 安装服务端
  • 安装客户端
  • 使用
  • 穿透rtsp


业务场景

我们在客户的船上安装了监控设备,因为船只要横渡长江,长江南北属于不同的城市辖区,所以船在江中心时肯定会有4G基站变换的动作,导致设备的外网ip地址变化。没有固定ip地址的局域网访问方式一般是通过DDNS,但DDNS检测ip变化的时间需要10分钟,看来DDNS肯定是不适用这样的场景。

可行的方案应该是这样的,船上的设备主动连接到外面一个公网服务器,连接之后又有两种方案:

  1. 把视频流不断的推送到服务器,网络断开重连后,4G设备会立即重新连接推送,我想看的时候连接到服务器看就行了。这种方案对于4G网络来说,太贵了。
  2. 我想看视频的时候4G设备才会发流量过来,不想看的时候就不发送流量。

反向代理

方案2明显是最优方案,今天我就先来介绍一下端口反向代理。谈到反向代理大家都会想到nginx,它的原理是这样的


外网

内网

我的电脑

nginx

应用服务器


很明显这种场景中nginx要能访问到应用服务器,它们一般都是同一内网的服务器。nginx要有外网直接访问到的端口。如果内网在一个没有公网ip的环境中,此访问是不可行的。


外网X

内网

我的电脑

nginx

应用服务器


nginx与应用服务器不在内网


外网

外网X

我的电脑

nginx

应用服务器


为什么要说穿透,就是因为我们的应用服务器没有公网ip.我们经常听到的DDNS也只是就种访问没有公网ip的方式,内网一定要在防火墙上映射端口。而我们的场景是更复杂的,除了4G设备上没有映射功能外,ip还会在一定时间内变化。所以我的终极方案是这样的:


2外网

1外网

3通信

我的电脑

nginx

应用服务器


除非应用服务器不能上网,否则应用服务器不用防火墙同意直接被穿透。

建立反向代理

有了上面的理论基础,我们就按以上的理论来建立:
github上搜了一下,热门的两个方案为ngrok和frp。网上对ngrok好评比较多,所以使用了一下ngrok, 客服端很好用,服务端用ngrok的官网,教程可参考:

毕竟我的应用要发送视频数据,数据量比较大,还是要搭建自己的服务器的。一去搭建服务器才知道,ngrok就是个坑,其中的证书一是不知道怎么用;二是真觉得没意义啊,就不能也只是配个auth_key?

果断放弃!去frp一看,Star不比ngrok少,看来ngrok只是占了年龄的光,其实岁数不小了,都三年没更新过了。在看frp的配置,这不就是我想要的。ngrok就不谈了,下面介绍下frp的安装

安装docker

本着一个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 root@xxx.xxx.xxx.xxx

连接成功!

穿透rtsp

反向穿透成功,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 成功