边缘设备远程运维方案调研

1.背景介绍

随着边缘计算的发展,越来越多的设备部署在网络边缘,需要进行远程运维管理。本报告对frp和nps两种主流内网穿透技术进行对比分析,最终提出基于frp的边缘设备远程运维实施方案。

2.技术方案对比分析

2.1.FRP(FastReverseProxy)

2.1.1基本特性开源协议:Apache2.0

编程语言:Go

协议支持:TCP、UDP、HTTP、HTTPS、STCP

部署模式:服务端-客户端架构

管理方式:配置文件为主,支持API控制

2.1.2优势

轻量级设计:客户端资源占用低,适合资源受限的边缘设备

连接稳定性:断线自动重连机制完善,适合网络不稳定的边缘环境

安全机制:支持TLS加密、token认证、客户端证书验证

社区活跃:GitHub星标超过70k+,问题响应迅速,文档完善

配置灵活:支持通过配置文件精细控制各项参数

2.1.3局限性

管理界面:原生不提供UI,需借助第三方Dashboard

多租户管理:在多设备管理方面不如nps直观

流量监控:原生监控功能较弱,需要额外开发

2.2NPS(NetMakerProxyServer)

2.2.1基本特性开源协议:MIT

编程语言:Go

协议支持:TCP、UDP、HTTP、HTTPS、Websocket

部署模式:服务端-客户端架构

管理方式:Web管理界面为主

2.2.2优势

可视化管理:内置Web管理界面,适合非技术人员操作

多租户支持:权限管理和多用户支持较好

流量统计:内置流量监控和统计功能

配置集中化:通过Web界面集中管理所有配置

2.2.3局限性

资源消耗:服务端资源占用高于frp

社区规模:社区活跃度和问题响应速度不及frp

文档完善度:中文文档较全,但英文资料相对较少

边缘设备适配:客户端对低配边缘设备支持不够友好

2.3对比总结

远程运维


3.拓扑图

边缘设备

边缘设备


4.附件

4.1frps配置文件

[common]
#frp服务端监听地址,用于接收frpc客户端的连接请求
#"0.0.0.0"表示监听所有网络接口,生产环境建议指定具体内网IP
bind_addr="0.0.0.0"
#frp服务端主通信端口,客户端通过此端口与服务端建立连接
#默认值:7000
#安全提示:建议修改为非常用端口,并在防火墙中限制访问来源
bind_port=7000
#KCP协议监听端口,用于在高丢包率网络环境下提升传输性能
#设置为与bind_port相同的值,表示复用同一端口
#设置为0表示禁用KCP协议
kcp_bind_port=7000
#QUIC协议监听端口,用于提供更好的连接复用和快速重连能力
#设置为0表示禁用QUIC协议
#注意:需要同时开放UDP端口
quic_bind_port=7001
#代理服务绑定地址,控制代理服务(如HTTP/HTTPS)监听的网络接口
#默认与bind_addr相同,特殊场景下可设置为内网IP,提高安全性
proxy_bind_addr="0.0.0.0"
#虚拟主机HTTP服务监听端口
#启用后,frps可以处理HTTP类型的代理请求
#通常设置为80端口,需要root权限或使用authbind等工具
vhost_http_port=80
#虚拟主机HTTPS服务监听端口
#启用后,frps可以处理HTTPS类型的代理请求
#通常设置为443端口,需要root权限
vhost_https_port=443
#HTTP请求超时时间(秒)
#设置等待HTTP响应头的最长时间
#过小可能导致正常请求被中断,过大会占用更多资源
vhost_http_timeout=60
#TCPMUXHTTPCONNECT代理监听端口
#用于支持浏览器通过HTTPCONNECT方法建立隧道
#常用于代理访问HTTPS网站
tcpmux_httpconnect_port=8080
#是否透传HTTPCONNECT请求
#true:将原始CONNECT请求转发给后端
#false:由frps处理CONNECT请求
tcpmux_passthrough=false
#二级域名解析基础域名
#例如:设置为"example.com",客户端配置subdomain="test"
#则访问test.example.com将被解析到该客户端的HTTP服务
#重要:需要将*.example.comDNS记录指向frps服务器IP
subdomain_host=
#自定义404错误页面
#当访问未配置的域名或路径时,显示此HTML页面
#值为文件的绝对路径
custom_404_page="/opt/frps/404.html"
#认证方式
#可选值:
# -"token":使用静态token认证(默认)
# -"oidc":使用OIDC协议认证
auth_method="token"
#认证令牌
#客户端必须配置相同的token才能连接服务器
#安全提示:使用高强度随机字符串,定期更换
#与token_file互斥,只能配置其中一个
token="yb_prod_frps_Z7B2p7JJyB8P8UJM6MGAezC37xJWCgLV"
#从文件中读取token
#适用于token需要经常更新的场景,避免重启服务
#与token互斥,只能配置其中一个
#token_file="/path/to/token.txt"
#鉴权附加范围
#控制token验证的应用范围
#可选值组合:
# -"HeartBeats":仅在心跳包中验证
# -"NewWorkConns":在新建工作连接时验证
#为空或未设置表示在所有需要认证的场景都验证
#additional_scopes=["HeartBeats","NewWorkConns"]
#################################################################################[web_server]部分配置仪表盘(Dashboard)服务
#仪表盘提供Web界面,用于监控frps状态和代理信息
#此部分是独立的顶级配置块,不是common的子项
################################################################################[web_server]
#仪表盘服务监听地址
#设置为"0.0.0.0"允许所有网络访问,生产环境建议限制为内网IP
bind_addr="0.0.0.0"
#仪表盘服务监听端口
#注意:TOML格式中参数名为"port",不是"dashboard_port"
#默认值:7500
port=7500
#仪表盘访问用户名
#注意:TOML格式中参数名为"user",不是"dashboard_user"
user="admin"
#仪表盘访问密码
#注意:TOML格式中参数名为"password",不是"dashboard_pwd"
#安全提示:使用高强度密码,避免使用默认值
password="yanBoot@123"
#是否启用Prometheus监控指标接口
#启用后,可通过http://ip:port/metrics获取监控指标
#需要同时启用web_server才会生效
enable_prometheus=true
#################################################################################[log]部分配置日志相关参数
################################################################################[log]
#日志文件路径
#设置为绝对路径,确保frps进程有写入权限
#设置为"console"表示输出到标准输出(适合容器环境)
file="/opt/frps/logs/frps.log"
#日志级别
#可选值:"trace","debug","info","warn","error"
#生产环境建议使用"info"或"warn"
level="info"
#日志文件保留天数
#超过此天数的日志文件将被自动删除
#设置为0表示不自动清理
max_days=30
#################################################################################[transport]部分配置传输层参数
################################################################################[transport]
#TCP复用保活间隔(秒)
#在TCP多路复用场景下,定期发送保活包维持连接
tcp_mux_keepalive_interval=60
#TCP保活间隔(秒)
#设置为负值表示不启用TCP保活机制
#系统默认通常为7200秒(2小时)
tcp_keepalive=7200
#最大连接池数量
#控制单个代理允许的最大连接池大小
#限制客户端资源使用,防止滥用
max_pool_count=5
#心跳超时时间(秒)
#超过此时间未收到客户端心跳,将断开连接
#根据网络状况调整,网络不稳定时可适当增大
heartbeat_timeout=90
#################################################################################[transport.tls]配置TLS传输加密
################################################################################[transport.tls]
#强制客户端使用TLS连接
#true:仅接受TLS加密连接,拒绝非加密连接
#false:兼容TLS和非TLS连接
#安全提示:生产环境建议设置为true
force=false
#################################################################################[ssh_tunnel_gateway]配置SSH隧道网关
#此功能允许通过SSH协议连接到frps服务器
#提供额外的安全层和访问控制
################################################################################[ssh_tunnel_gateway]
#SSH服务器监听端口
#客户端通过ssh-p2222user@server连接
#安全提示:避免使用标准SSH端口22,防止暴力破解
bind_port=2222
#SSH服务器私钥文件路径
#推荐使用ed25519或rsa算法生成的私钥
#与auto_gen_private_key_path互斥,只能配置其中一个
#private_key_file="/opt/frps/ssh/ssh_host_ed25519_key"
#自动私钥生成路径
#当private_key_file未设置时,frps会在此路径生成密钥
#首次启动后,建议备份此文件
#推荐使用绝对路径,避免相对路径导致的权限问题
auto_gen_private_key_path="/opt/frps/ssh/.autogen_ssh_key"
#SSH客户端授权密钥文件
#格式与OpenSSH的authorized_keys相同
#一行一个公钥,控制哪些客户端可以连接
#未设置时,任何知道服务器地址和端口的客户端都可以连接
#安全提示:生产环境必须配置此项
#authorized_keys_file="/opt/frps/ssh/authorized_keys"
#################################################################################全局其他配置参数
#注意:这些参数不属于任何配置块,直接在文件顶层定义
#################################################################################是否向客户端返回详细错误信息
#true:返回详细错误信息,便于调试
#false:仅返回通用错误,提高安全性
detailed_errors_to_client=true
#限制单个客户端最大代理数量
#防止单个客户端占用过多服务器资源
#0表示无限制
max_ports_per_client=0
#用户连接超时时间(秒)
#客户端建立连接后,等待其发送代理请求的最长时间
#超时后连接将被关闭
user_conn_timeout=10
#UDP包最大大小
#控制UDP代理支持的最大数据包长度
#服务端和客户端必须设置相同值
#通常不超过网络MTU值(1500)
udp_packet_size=1500
#NAT打洞分析数据保留时间(小时)
#保留NAT类型分析数据的时间,用于优化连接策略
#默认168小时(7天)
nathole_analysis_data_reserve_hours=168
#允许代理的服务端端口范围
#限制客户端可以绑定的服务端端口范围,提高安全性
#格式:数组形式,每个元素可以是单个端口或范围
#例如:["2000-3000","3001","3003-4000"]
#未设置表示允许所有端口
#allow_ports=["2000-3000","3001","3003-4000"]

4.2frpc配置文件

#==================================================
#frpc客户端配置文件(官方TOML格式)
#由旧版ini配置迁移而来
#适用于frpv0.50及以上版本
#==================================================
#==================================================
#frps服务器连接配置
#==================================================
#frps公网地址
serverAddr="123.235.49.242"
#frps服务端口
serverPort=57000
#首次登录失败是否直接退出
#false表示持续重连
loginFailExit=false
#==================================================
#认证配置
#==================================================
#认证方式:token
auth.method="token"
#与frps保持一致的token
auth.token="yb_prod_frps_Z7B2p7JJyB8P8UJM6MGAezC37xJWCgLV"
#==================================================
#传输层配置
#==================================================
#frpc与frps通信协议
#支持tcp/kcp/quic/websocket/wss
transport.protocol="tcp"
#心跳发送间隔(秒)
transport.heartbeatInterval=30
#心跳超时时间(秒)
transport.heartbeatTimeout=90
#==================================================
#日志配置
#==================================================
#日志输出位置(console或文件路径)
log.to="/opt/frpc/logs/frpc.log"
#日志级别:trace/debug/info/warn/error
log.level="info"
#日志保留天数
log.maxDays=3
#==================================================
#代理配置
#==================================================
#------------------------------
#SSH服务穿透
#------------------------------
[[proxies]]
#代理名称,格式为:项目名称首字母简写_序号_服务名称,例如"gxqljc_1_ssh"name="cqsc_1_ssh"
#代理类型
type="tcp"
#本地SSH服务地址
localIP="127.0.0.1"
#本地SSH服务端口
localPort=22
#frps上对外暴露的端口
remotePort=10006
#启用frpc<->frps传输加密
transport.useEncryption=true
#启用数据压缩
transport.useCompression=true
#------------------------------#stew-edgeWeb服务
#------------------------------[[proxies]]
name="cqsc_1_stew-edge"
type="tcp"
localIP="127.0.0.1"
localPort=80
remotePort=10007
transport.useEncryption=true
transport.useCompression=true#------------------------------#PostgreSQL数据库服务
#------------------------------[[proxies]]
name="cqsc_1_postgres"
type="tcp"
localIP="127.0.0.1"
localPort=5432
remotePort=10008
transport.useEncryption=true
transport.useCompression=true#------------------------------#TDengine时序数据库服务
#------------------------------[[proxies]]
name="cqsc_1_taos"
type="tcp"
localIP="127.0.0.1"
localPort=6041
remotePort=10009
transport.useEncryption=true
transport.useCompression=true#------------------------------#Redis缓存服务
#------------------------------[[proxies]]
name="cqsc_1_redis"
type="tcp"
localIP="127.0.0.1"
localPort=6379
remotePort=10010
transport.useEncryption=true
transport.useCompression=true


上一篇: 别再混用了!import.meta.env 和 process.env 到底差在哪?
下一篇: YBolt+组件耦合度,组件之间的相互依赖情况?