前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >frp内网穿透原理 解析_梅林frp内网穿透教程

frp内网穿透原理 解析_梅林frp内网穿透教程

作者头像
全栈程序员站长
发布于 2022-10-03 06:44:39
发布于 2022-10-03 06:44:39
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

frp 内网穿透实例

前置

在这之前,你应该在嵌入式设备上和带有公网 IP 的服务器上都已经安装好了 frp ,如果没有的话就翻一下前面几节的内容。

今天把 frp 的官方文档阅读完了,发现这个项目是我们国人主导的,还是比较自豪的;文档写的非常详细,我的建议是全部读一遍吧,花不了你多久时间的,因此也不介绍 frp 了,直接给出几个我自己的配置实例就可以了。

官方文档 : FRP

这里给出的几个配置实例的原因主要是因为我的应用场景比较特殊,是用在 IOT 上,也就是寻找一种有效的方式访问到内网里的嵌入式设备,主要是为了在产品出现问题的时候有一种有效的方式远程解决客户的问题;这里比较特殊的地方就是,很多个人用户是一对一的模型也就是客户端和服务器都是只有一个,而 IOT 那客户端就多了个去了,而且要做的事情跟个人用户也不太一样;不过殊途同归,都是想像局域网一样访问设备。

在这里给出一个通用的配置以及给出几个内网穿透的案例:

  • netdata 穿透 ———— 远程监控 IOT 设备系统状况
  • ftp 穿透 ———— 获取远程 IOT 设备资源及上传文件给远程 IOT 设备
  • gdb 穿透 ———— 远程调试 IOT 设备
  • rtmp 穿透 ———— 针对于流媒体,播放远程摄像头上的媒体流
  • nfs 穿透 ———— 建立本地于远程 IOT 设备的共享文件夹

基本配置

frp 使用 ini 格式进行配置,里面可以选择的东西还挺多的,但是我喜欢简洁一点,所以只使用 IP 层的 TCPUDP 进行配置。

服务器基本配置

服务器 frps 使用 frps.ini 进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
# 服务端监听地址(一般不需要填写)
# bind_addr = 0.0.0.0
# 服务端监听端口
bind_port = 8012
# 日志文件地址
log_file = ./frps.log
# 鉴权方式
authentication_method = token
# 鉴权使用的 token 值 客户端需要设置一样的值才能鉴权通过
# 建议使用 uuidgen 生成服务器的 UUID
token = 082116ea-1fcd-4737-944e-56e5078fa8fb
# 允许代理绑定的服务端端口
# 1 - 1024 以下的端口保留给服务器自己使用,防止冲突服务器的端口
# allow_ports = 1024-65535
# 2 - 开放全部端口,存在更大与服务器端口端口的冲突的可能性
allow_ports = 0-65535
# 只接受启用了 TLS 的客户端连接
tls_only = true
# 启用 Dashboard 监听的本地端口
dashboard_port = 8013
dashboard_user = root
dashboard_pwd = 123465
# 是否提供 Prometheus 监控接口
enable_prometheus = true

除去注释的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
bind_port = 8012
log_file = ./frps.log
authentication_method = token
token = 082116ea-1fcd-4737-944e-56e5078fa8fb
allow_ports = 0-65535
tls_only = true
dashboard_port = 8013
dashboard_user = root
dashboard_pwd = 123465
enable_prometheus = true

使用命令行 ./frps -c ./frps.ini & 将 frp 服务器运行在后台。

然后可以这样登录服务器端的控制台:

控制界面是长这样的,这个界面是用 vue 写的:

如果解决跨域(CROS)问题的话,那么找到 vue 工程的 js 部门也就可以拿到 http 的接口了,可以自己接入自己的平台。

客户端基本配置

客户端 fprc 使用 fprc.ini 进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
# 连接服务端的地址,填写 frps 的公网IP
server_addr = x.x.x.x
# 连接服务端的端口
server_port = 8012
# 日志文件地址
log_file = ./frpc.log
# 第一次登陆失败后是否退出
login_fail_exit = false
# 启用 TLS 协议加密连接
tls_enable = true
# 鉴权方式
authentication_method = token
token = 082116ea-1fcd-4737-944e-56e5078fa8fb
# 启用 AdminUI 监听的本地端口
admin_port = 25000
admin_user = root
admin_pwd = 123456

除去注释的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[common]
server_addr = x.x.x.x
server_port = 8012
log_file = ./frpc.log
login_fail_exit = false
tls_enable = true
authentication_method = token
token = 082116ea-1fcd-4737-944e-56e5078fa8fb
admin_port = 25000
admin_user = root
admin_pwd = 123456

然后登录客户端的控制台,可以看到这些内容:

这说明什么呢,说明 frpc 启动之后并不是非得重启才能重新配置的,然后这个也是 vue 写的,只要把 CROS 就可以把接口扣出来,而不用去修改 frp 的 go 代码,就可以做到热重启。

更多详细的配置读读官方的文档,我这配置估计挺快就会报废,听说 frp 最近在准备 v2 版本,架构发生了改变,可能文档也会修改地比较厉害:参考

内网穿透

netdata 穿透

有关于 netdata 的相关信息这里不赘叙,只是说一下 netdata 是一个系统检测工具,有兴趣地可以看下:

目前 Netdata 运行在我局域网的机器,我已经将 Netdata 拉起来了:

然后我开始往 fprc.ini 里添加内容,追加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[netdata]
type = tcp
local_ip = 127.0.0.1
local_port = 25000
# 映射后可以使用 `public IP address:remote_port` 的形式访问
remote_port = 25000

这样子就能使用公网 IP 访问 Netdata 了,效果如下:

打开服务器和客户端的控制台可以分别看到以下内容:

客户端的控制台不知道为什么连接不上,这个之后再查一查了,可能是因为访问被锁定在 IOT 上了,所以我的宿主机去访问就访问不了;检查了一下,确实是这样,我将 frpc.ini 中的 admin_addr 老老实实填成 ifconfig 中的 IP 地址后就可以了,不填 0.0.0.0 这样会被锁定在本机上。

这样代理就完成了,但是还没完,这里引出另一个问题,线下可不止一台 IOT 设备,这里我的宿主机作为另一台 IOT 测试设备,做同样的操作。

在我的宿主机添加一样的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[netdata]
type = tcp
local_ip = 127.0.0.1
local_port = 19999
remote_port = 25000

然后出现这样的情况:

这个 cpu 飙升的原因暂不知道,而且只在那时候出现过一次,之后尝试复现没有成功。

修改端口使用为 24999 ,出现以下:

这个我是知道的,代理不能取同一个名字,这在文档里说过;但是也太不合理吧,你叫我每台机取什么名字呢,这个我得思考下。

netdata 修改为 netdata2 ,可以正常运行,如下:

服务器控制面板如下:

通过观察这里,可以发现 IOT 使用 frpc 的两个需要解决的地方:

  • 端口冲突
  • 代理名称冲突

ftp 穿透

frp 是有提供获取远程文件的途径的,但是由于之前我已经在我的 IOT 上搭建好了 ftp 服务器,可以下载和上传文件,所以这里也打算穿透一下。这里科普一下,虽然连接 ftp 是 21 端口,但这个端口只是控制端口;还有一个数据端口 20。

客户端追加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[range:ftp]
type = tcp
local_ip = 127.0.0.1
local_port = 20-21
remote_port = 20-21

这个失败了,报错原因如下:

弄了半个钟还是没有解决问题,这个问题是来自于 vsftpd ,我在我的 IOT 上移植了 vsftpd,并且为了解决一些依赖问题,又对 vsftpd 进行了一些定制化的裁剪;后期再去看看 vsftpd 的源码,看看是出了什么问题。

gdb 穿透

远程 gdb 调试就拿 vsftpd 作为调试的程序吧,刚好 ftp 的穿透出现了问题,vsftpd 就是支撑这个 ftp 服务器的程序,这样 gdb 穿透 这个需求就很明确了,现实中确实有这个需求。

以下是我 vscode 的配置,gdbserver 的端口固定在 10002:

在 IOT 上先把 gdbserver 开起来:

然后在 frpc.ini 中追加以下内容,并重启 frpc:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[gdb]
type = tcp
local_ip = 127.0.0.1
local_port = 10002
remote_port = 10002

这样就抓到了,说明是可以通过 frp 去远程调试局域网内的设备的。

有关于 vscode 远程调试的内容可以看这里 : 嵌入式 LINUX IDE 环境搭建

rtmp 穿透

在我的 IOT 上是绑定摄像头的,所以自然而言就有画面,有画面就有流媒体,有流媒体就可以拉流;流的种类挺多的,这里就拉一个 rtmp 吧。

frpc.ini 中追加以下内容,并重启 frpc:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[rtmp]
type = tcp
local_ip = 127.0.0.1
local_port = 1935
remote_port = 1935

然后使用 VLC 拉下流,效果如下:

拉流正常,之后播放个 2 分钟,观察一下阿里云的带宽使用:

大概是 40 多 M 的样子吧,好像也不是很多,还是可以接受的。

然后这个画面虽然是 IOT 上面显示,但是 IOT 的这个画面是从摄像头拉过来的,所以 frpc.ini 可以修改成这样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[rtsp]
type = tcp
# 摄像头的 IP ,并且 IOT 能够 ping 到
local_ip = 172.20.92.204
local_port = 554
remote_port = 554

然后重启 frpc,也是正常显示的(这里我直接用我的域名去拉流了,写 ip 有点累):

这说明什么呢, frpc 不是只能做自己的代理,只要是 frpc 所在的机器能够碰得到的 ip:port , frpc 就能做代理;如果你的应用场景中除了 IOT 之外还存在像主机这样性能比较优秀的机器,可以考虑让主机帮助 IOT 进行内网穿透,减轻 IOT 设备的负担。

nfs 穿透

热加载

正如在这篇文章里看到的一样,上述的这些场景都是临时需要开启的,而且开启的时间都不会很长;这代表着 frpc.ini 这个文件的内容改动会很频繁,在 frp 中是有一个折中的解决方案的,叫做配置拆分

以下内容摘自 frp 官网:

通过 includes 参数可以在主配置中包含其他配置文件,从而实现将代理配置拆分到多个文件中管理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
includes = ./confd/*.ini
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ./confd/test.ini
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

上述配置在 frpc.ini 中通过 includes 额外包含了 ./confd 目录下所有的 ini 文件的代理配置内容,效果等价于将这两个文件合并成一个文件。

需要注意的是 includes 指定的文件中只能包含代理配置,common 段落的配置只能放在主配置文件中。

总结

在了解完这篇文章列举出有关于 frp 的使用方式后,应能能满足你大部分的需求。

但是在 IOT 上这两点是逃不掉的:

  • 端口冲突
  • 代理名称冲突

一个比较好的办法是自己封装一层,手动维护服务器可用的端口,以及使用 UUID 使 IOT 的代理名称不会冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197366.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月4日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Frp内网穿透
Frp是一个用于内网穿透的反向代理工具,可以方便的从外网访问内网中的主机。frp分为服务器端(frps)和客户端(frpc),想要实现内网穿透,除了需要frp工具,我们还需要一台VPS。接下里就演示一下内网穿透的效果。
Tommonkey
2023/02/27
2.3K0
Frp内网穿透
使用frps和frpc实现内网穿透
内网穿透的作用包括跨网段访问一个局域网中的一台主机。 如上图,假设我们想要通过主机 A 访问主机 C,但是主机 A 和主机 C 绑定的都是私有 ip 地址,所以它们之间是无法直接进行通信的。要想使得 A 和 C 能够进行通信,就需要用到内网穿透的技术。 我们可以借助 frps(服务端)和 frpc(客户端)来实现主机 A 对主机 C 的访问。 需要做的是: 在绑定了公网 ip 的主机 B 中配置 frps(服务端) 在主机 C 中配置 frpc(客户端) frps/frpc 的工具包的 github 地
入门笔记
2022/06/03
5.1K0
使用frps和frpc实现内网穿透
内网渗透 | 内网穿透工具FRP的使用
FRP(Fast Reverse Proxy) 是一款简单,好用,稳定的隧道工具。FRP 使用 Go 语言开发,它是一款高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、KCP、HTTP、HTTPS等协议类型,并且支持 Web 服务根据域名进行路由转发。在进行内网渗透中,FRP是常用的一款隧道工具。
谢公子
2022/01/19
2.5K0
内网渗透 | 内网穿透工具FRP的使用
FRP 搭建内网穿透
下载最新的 FRP :https://github.com/fatedier/frp/releases 几种常用架构如:
chuchur
2022/10/25
2K0
FRP 搭建内网穿透
搭建frp内网穿透
frp脚本下载:https://github.com/fatedier/frp/releases/
R0A1NG
2022/02/19
1.8K0
搭建frp内网穿透
内网穿透工具 frp 使用教程
frp 适用于有公网IP需求的用户,如果有需要在互联网中找到自己的电脑,但是电脑又没有公网IPv4地址,又不想用IPv6地址,恰好还有一个空闲的拥有IPv4公网地址的云服务器,那么frp 是使用你需要的工具。
为为为什么
2022/08/06
6.3K0
内网穿透工具 frp 使用教程
使用frp进行内网穿透
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
小陈运维
2021/10/13
9340
frp 进行内网穿透
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。 截至本文完成,frp的最新版本为v0.22.0,本文使用最新版本。
用户10125653
2022/11/10
6380
frp 进行内网穿透
frp端口转发内网穿透
简单地说,frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。我们今天仅讨论TCP和UDP相关的内容。
鸿鹄实验室
2021/04/15
2.7K0
frp端口转发内网穿透
FRP内网穿透_内网穿透 无需公网ip
二、为什么要使用内网穿透 为了外网要访问内网,因为当不在同一局域网内,ip和地址互相ping不同的话,最简单的方式是使用向日葵与teamview,但是用起来并不方便。
全栈程序员站长
2022/09/30
5K0
FRP内网穿透_内网穿透 无需公网ip
通过 docker 部署 frp 内网穿透(Linux and Windows)
FRP (Fast Reverse Proxy) 是一个用于内网穿透的高效反向代理应用,它支持 TCP、UDP、HTTP 和 HTTPS 等多种协议,能够让处于防火墙或 NAT 后的内网服务通过公网访问。通过 FRP,内网服务可以绑定到外网 IP 地址和端口,用户可以方便地通过公网访问这些内网服务,适用于远程管理、应用发布等场景。
冷影玺
2024/10/09
3.6K0
通过 docker 部署 frp 内网穿透(Linux and Windows)
利用frp工具实现内网穿透、随时随地访问内网服务
之前分享过一次《ZeroTier实现内网穿透、异地组网》,其基本工作原理是组建一个虚拟局域网,各个设备(NAS、Linux、Windows、Mac、iOS、Android)安装了客户端、加入到这个虚拟局域网后,就会自动分配一个IP,从而实现局域网内各个设备及服务的相互访问。
大刚测试开发实战
2023/01/18
3K0
使用frp配置内网穿透访问(超详细)
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。
网络安全自修室
2021/11/25
2.9K0
使用frp配置内网穿透访问(超详细)
内网穿透FRP教程
输入指令uname -a,分别查看自己服务器的详细系统。做好记录,后面需要根据这个去下载对应的FRP安装包。
鹏程
2023/05/02
8260
内网穿透FRP教程
centos frp内网穿透_内网穿透 无需公网ip
安装步骤省略(下载解压拷贝到server服务器和client服务器完事)具体移步:github
全栈程序员站长
2022/09/30
2.2K0
内网穿透FRP搭建教程
        开篇先虾扯蛋一会儿,看到上一篇博文更新已经是1个多月之前的文章了,当时学习小程序忙!拖拖拉拉一个多月,也没学到什么,不过基本的构建明白了!今天是给大家分享一下,内网穿透教程!顺便分享一下自己的frp服务器!
十月梦想
2018/08/29
3.7K0
使用FRP内网穿透工具实现"安全访问"家中群晖NAS
有时出差或者外出需要访问家中的群晖NAS,但由于该群晖NAS没有quickconnect服务(原因你懂的),基于安全考虑也不愿意将NAS通过内网穿透的方式直接暴露到公网上
yuanfan2012
2023/09/06
4.2K0
使用FRP内网穿透工具实现"安全访问"家中群晖NAS
frp配置-内网穿透工具最佳实践
frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
zhangheng
2020/04/29
9.2K0
frp配置-内网穿透工具最佳实践
frp配置内网穿透教程(超详细)
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。frp 项目官网是 https://github.com/fatedier/frp,
网络安全自修室
2021/06/21
135.3K8
frp配置内网穿透教程(超详细)
frp实现内网穿透 | frp服务端配置 | frp客户端配置
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
宋天伦
2020/11/16
14.4K0
相关推荐
Frp内网穿透
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验