1、背景
为了解决因电力负荷供应紧张时的用电问题,电网针对商业楼宇、企业园区、学校等场所建设了很多了边缘设备、能效控制器以及负控终端,系统基本采用云-管-边-端或者总站-子站—单元的架构设计,边端通过量产工控机实现本地化监测、控制以及边缘计算的应用。但是随着边端设备资产日益增多,服务的更新以及异常处理的工作量也逐步增大,而边端在组网方面基本都是局域网或者4G网络,导致IP都是局域网IP或者4G动态IP,只能单向连接互联网,互联网到局域网是无法到达的,这就导致需要人工的方式升级边端服务,极大增加了项目运维成本和出差的风险,项目需要打破传统的运维方式。
2、 方案
远程运维与现在流行的DevOps以及AiOps不同,DevOps以研发的视角实现研发、运维一体化,而AiOps以客户的视角通过算法模型让故障未卜先知,但是两者在地域线上,都没有较大提及。换句话说,DevOps和AiOps都需要在地域线上做出更新实现远程运维,远程访问初步设想了几个方案:
- 外部采购相关产品
- frp内网穿透技术
- lcx端口转发技术
- mqq技术,可以上送数据,可以远程发包,但是不能远程访问系统
- 自研发内网穿透技术,tcp连接,做一个tcp通道。边端的网络设备TCP连接到云端, 云端把客户端请求转发到现场的网络设备,类似一个中转的功能,网络设备去主动连接云服务器,然后保持连接就可以。
最后使用了frp内网穿透技术实现,这里也只谈这一个技术点,通过4G设备与固定公网IP,利用frp技术打通网络渠道。frp是一个基于P2P技术的网络穿透应用,也可以称为一款反向代理应用,通过frp技术打通互联网到局域网的技术问题,实现内网穿透,让局域网的IP能够通过互联网访问到,利用固定的公网IP进行端口转发,实现局域网的业务穿透到外网访问,如下图所示,局域网端口6666,经过中转服务器(公网IP)进行36601代理之后,用户层的终端就可以通过36601端口进行访问局域网系统。
3、frp介绍
frp的官方定义frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
-
客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
-
采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
-
代理组间的负载均衡。
-
端口复用,多个服务通过同一个服务端端口暴露。
-
多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
-
高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
-
服务端和客户端 UI 页面。
下载界面:https://github.com/fatedier/frp/releases
源码界面:https://github.com/fatedier/frp
frp tcp连接包含三种连接模式:tcp、stcp、xtcp
4、frp使用
frp是能够代理的协议很多,我这里只介绍一个tcp和一个监控界面,frp在部署时分为服务端frps和客户端frpc,是一个一对多的部署,frpc部署在局域网,frps部署在具有公网IP的服务器上。
4.1、服务端frps
部署时,先部署frps,因为frpc的启动需要连接frps
1)确定版本
如果是linux系统,首先查看系统的版本
arch
查看结果,如果是“X86_64“即可选择”amd64”,
运行如下命令,根据架构不同,选择相应版本并进行下载
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.37.1_linux_amd64.tar.gz
2)安装
解压压缩包
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
文件夹改个名,方便使用
cp -r frp_0.22.0_linux_amd64 frp
把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录
cd frp
查看一下文件,是否包含frpc 、frpc.ini 、 frps 、 frps.ini
ls -a
因为我们正在配置服务端,可以删除客户端的两个文件
rm frpc
rm frpc.ini
3)配置文件
进入frp目录,执行vim frps.ini,进入配置文件编辑页面
[common]
bind_port = 7000
dashboard_port = 7500
token = xxxxxxxxx
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 38080
vhost_https_port = 3443
“bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
“dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
“token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
“dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。
“vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。
4)启动
./frps -c frps.ini
或者挂载一下
nohup ./frps -c frps.ini >"nohupLogs/nohup_frps.log" 2>&1 &
此时访问 111.111.111.111:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面,这就表示成功了
4.2、客户端frpc
1)确定版本
如果是linux系统,首先查看系统的版本
arch
查看结果,如果是“X86_64“即可选择”amd64”,
运行如下命令,根据架构不同,选择相应版本并进行下载
wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.36.2_linux_amd64.tar.gz
wget https://github.com/fatedier/frp/releases/download/v0.36.2/frp_0.37.1_linux_amd64.tar.gz
2)安装
解压压缩包
tar -zxvf frp_0.22.0_linux_amd64.tar.gz
文件夹改个名,方便使用
cp -r frp_0.22.0_linux_amd64 frp
把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录
cd frp
查看一下文件,是否包含frpc 、frpc.ini 、 frps 、 frps.ini
ls -a
因为我们正在配置服务端,可以删除客户端的两个文件
rm frps
rm frps.ini
3)配置文件
进入frp目录,执行vim frpc.ini,进入配置文件编辑页面,[localnginx]表示需要代理局域网的nginx
[common]
server_addr = 111.111.111.111
server_port = 7000
token = xxxxxxxx
[localnginx]
type = tcp
local_ip = 127.0.0.1
local_port = 7777
remote_port = 7111
[busiweb]
type = tcp
local_ip = 127.0.0.1
local_port = 8188
remote_port = 7222
[RemoteOp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33389
# common 同frps.ini
# server_addr :云服务器的ip地址
# server_port :绑定的端口,需要云服务器和内网服务器都开启这个端口
# token : 此处填写需要的token,frps.ini 中没有填写则此处不填写 填写示例:
# myPort1 此项代理的名称,名字随便写,比如:[common] [busiweb] [RemoteOp]
# type = 代理的类型,一般为tcp
# local_ip = 本地的ip
# local_port = 被代理的端口
# remote_port = 云服务器端口 填写示例:
4)启动
./frpc -c frpc.ini
或者挂载一下
nohup ./frpc -c frpc.ini >"nohupLogs/nohup_frpc.log" 2>&1 &
启动成功之后,在浏览器中输入公网地址的 http://111.111.111.111:7111/就可以访问到局域网的nginx地址了
4.3、监控界面
frp自带监控界面,在frps和frpc都启动成功之后,访问 http://公网IP:7500
输入frps.ini中配置的账号(dashboard_user)和密码(dashboard_pwd),打开tcp就可以看到配置的局域网信息了