一文拿捏内网穿透利器之frp(反向代理软件相关)

news2024/11/19 13:37:29

一文拿捏内网穿透利器之frp

一、什么是 frp

1.1 内网穿透

图片

如下图所示, 一般情况下, 公网内的设备都能够被任意一台设备访问到!! 而不同局域网内的设备是相互隔离的, 局域网 A 的设备是无法访问到局域网 B 内的设备

图片

而内网穿透技术, 顾名思义就是能让公网、或者当前局域网外的任意设备访问到局域网内某个设备! 如下图, 设备 C 实现了内网穿透技术, 所以局域网内任意设备都能够访问到当前设备

图片

那么有了内网穿透我们可以做啥呢?

  1. 远程访问和管理: 内网穿透允许您从任何地方通过互联网连接到位于其他局域网内中的设备或服务器, 举个最简单的例子就是, 当你在家里想远程访问公司的电脑时, 因为你的两个设备是处于不同局域网内, 默认情况下是无法相互访问的, 这时就可以通过内网穿透来实现

  2. 游戏娱乐: 比如你在家用电脑开游戏服, 想邀请朋友加入联机, 因为你家里的网络与朋友的网络处于不同的局域网, 当朋友想要联机加入你的游戏服时, 就需要你的电脑使用内网穿透技术将设备访问权暴露出去

  3. 共享本地服务: 实现文件共享, 如文件共享、打印机访问或监控摄像头; 通过内网穿透技术, 我们可以随时随地访问家里设备的资源、服务

  4. 测试和开发环境: 开发人员可以使用内网穿透将本地开发环境暴露给外部世界; 比如我们要本地测试 github webhooks 就可以通过内网穿透来让外部的服务访问到我们本地服务

1.2 frp 简介 & 原理简述

简单地说, frp 就是一个反向代理软件, 它的作用是将内网中的服务器暴露到互联网上, 它体积轻量但功能很强大!!! 通过它我们可以很方便实现内网穿透功能!!!

它其实有两个服务:

  • 客户端 frpc, 安装在我们内网中某台物理机上

  • 服务端 frps, 安装在一个公网服务器上

如下图:

  • 首先公网上先部署了 frps 服务, 并设置了连接端口

  • 然后在内网中运行 frpc 服务, 启动时会连接到公网上的 frpc 服务, 并保持保持住这个长连接(如果断开了会进行重试)

  • 当用户公网地址时, 会先在本地看是否有可用的连接, 如果没有, 那么 frps 服务就会将请求转发到 frpc 服务上

  • 再由 frpc 将请求转发到内网中任意一个服务上

图片

FRP的优点: 它可以隐藏内网中的服务器, 避免因直接暴露内网服务器导致的安全问题。此外, FRP还支持动态端口映射, 可以方便地实现内网的服务器负载均衡

二、公网服务器 frps 部署

上文提到, frp 其实是有两个服务的, 一个存在于公网的 frp 服务端, 也是就 frps; 一个就是部署在局域网物理机上的 frp 客户端, 也就是 frpc

那么本节将介绍下 frps 的一个部署, 这里使用到的 docker 镜像是 snowdreamtech/frps, 需要注意的是本文使用的是最新的版本, 所以配置文件和目前网上大部分教程是有所出入的!!!

如下图, 从 docker 镜像的详细信息可以看出, 该镜像发布时间的一个时间, 以及使用的配置文件路径, 配置文件具体信息可以看 frp 官网

图片

下面开始正式部署 frps 服务...

2.1 添加配置文件

首先找个位置, 添加一个配置文件 frps.toml, 我这里配置文件完整路径为 /home/moyuanjun/frp/frps.toml, 配置文件内容如下, 具体每个配置项参考注释, 更多配置可查阅 frp 官网

 
bindPort = 7000         log.to = "console"      vhostHTTPPort = 7100    vhostHTTPSPort = 7200   

auth.method = "token"   auth.token = "password" 

webServer.port = 7300        webServer.addr = "0.0.0.0"   webServer.user = "admin"     webServer.password = "admin" 
 

2.2 Docker 容器部署

配置文件整完, 下面我们开始部署 docker!!!

  1. 首先先拉取下最新的 docker 镜像 snowdreamtech/frps

sudo docker pull snowdreamtech/frps
 

这里提前拉取了下镜像, 主要目的就是要确认下拉取下来的 snowdreamtech/frps 镜像的版本是否是最新的, 这里我就是简单看下镜像的创建时间(没办法, 不同的 docker 源上最新版本可能存在差异, 我这次就被坑惨了!!!)

图片

  1. docker 运行: 如下命令, 运行 snowdreamtech/frps, 这里唯一要调整的是 -v /home/moyuanjun/frp/frps.toml:/etc/frp/frps.toml, 要将前面我本地配置文件路径改成你自己的

 

sudo docker run -d \--network host \-v /home/moyuanjun/frp/frps.toml:/etc/frp/frps.toml \--name frps \snowdreamtech/frps
 

图片

2.3 日志查看

上文我们已经完成了 frps docker 容器的部署, 但实际上我们只看到容器起来了!! 但是 frps 具体运行情况我们是无法知道得知的!!

其实我们在 frps.toml 中配置了 log.to = "console", 日志实际上已经输出了, 这里我们直接通过 docker logs frps 就可以查看到日志信息了:

图片

当然如果我们想要查看实时的日志, 可以使用 docker logs -f frps 来开启一个实时的终端进程, 就能够实时监控到日志的输出:

图片

2.4 frps 仪表盘

我自己的服务器是阿里云的, 默认情况下防火墙只开启了几个常用端口, 所以在开始前, 我这边还需要设置下阿里云的防火墙, 为 frp 开放了一批端口出来

还记得我们在 frps.toml 中配置了仪表盘信息嘛, 下面我们可以通过 ip/域名:[webServer.port] 来访问仪表盘页面!!!

首次需要登录, 用户名密码就是 frps.toml 设置的内容:

图片

如下图, 就是仪表盘的界面了:

图片

三、内网 frpc 部署

下面我们还需要一个 frpc 客户端, 当我们运行 frpc 服务时将和公网上的 frps 建立一个长连接, 当我们访问公网不存在的服务时会转发到 frpc, 然后 frpc 再做一个二次转发

那么本节将介绍下 frpc 的一个部署, 这里使用到的 docker 镜像是 snowdreamtech/frpc, 需要注意的是本文使用的是最新的版本, 所以配置文件和目前网上大部分教程是有所出入的!!!

如下图, 从 docker 镜像的详细信息可以看到, 该镜像的一个发布时间, 以及使用的配置文件路径, 配置文件具体信息可以看 frp 官网

图片

下面开始正式部署 frpc 服务...

3.1 添加配置文件

还是一样, 我们需要先找个位置, 添加一个配置文件 frpc.toml, 我这里配置文件完整路径为 /Users/qianyin/frp/frpc.toml, 配置文件最简内容如下, 具体每个配置项参考注释, 更多配置可查阅 frp 官网

serverPort = 7000                serverAddr = "www.kunlunxu.cc"   log.to = "console"               auth.token = "password"
 

图片

3.2 Docker 容器部署

配置文件整完, 下面我们开始部署 docker!!!

  1. 首先先拉取下最新的 docker 镜像 snowdreamtech/frpc

docker pull snowdreamtech/frpc
 

这里提前拉取了下镜像, 主要目的就是要确认下拉取下来的 snowdreamtech/frpc 镜像的版本是否是最新的, 这里我就是简单看下镜像的创建时间(没办法, 不同的 docker 源上最新版本可能存在差异, 我这次就被坑惨了!!!)

图片

  1. docker 运行: 如下命令, 运行 snowdreamtech/frpc, 这里唯一要调整的是 -v /Users/qianyin/frp/frpc.toml:/etc/frp/frpc.toml, 要将前面我本地配置文件路径改成你自己的

 

docker run -d \--network host \-v /Users/qianyin/frp/frpc.toml:/etc/frp/frpc.toml \--name frpc \snowdreamtech/frpc
 

图片

  1. 同样的, 这里我们可以通过 docker logs frpc 来查看启动日志

图片

  1. 当然我们也可以通过查看 frps 仪表板中客户端连接数, 来确定 frpc 的连接情况

图片

3.3 将内网上本地 html 服务暴露到公网(tcp 版本)

  1. 首先本地我们先起一个服务, 我这里直接使用 vscode 插件 Live Server 起了一个静态服务

图片

  1. 下面我们修改 frpc 配置文件, 添加一个代理配置, 我们希望的是, 当访问公网 ip/域名:7001 能够通过 frps 转发到内网上的 frpc 服务上, 然后再通过 fprc 代理到内网的 192.168.0.108:5500 上; 配置完整内容如下, 参数介绍看注释, 主要就是加了 [[proxies]] 配置:

 

# frpc.tomlserverPort = 7000                # [必选] 要连接的 frps 端口serverAddr = "www.kunlunxu.cc"   # [必选] 要连接的 frps 地址log.to = "console"               # [可选] 日志配置, 通过打印的方式输出日志auth.token = "password"          # [可选] token 设置, frps 设置的 token, 其实就是密码
+ [[proxies]]                      + name = "web"                     # 代理名称(随便填)+ type = "tcp"                     # 代理类型+ localIP = "192.168.0.108"        # 代理地址, 要转发到哪个地址+ localPort = 5500                 # 代理端口, 要转发到哪个端口+ remotePort = 7001                # 远程端口(和远程 frps 哪个端口绑定在一起, 访问对应端口将使用该代理)

重启 frpc: 其实就是重启 docker 容器

 

​​​​​​​

docker stop frpcdocker start frpc
 

访问 http://www.kunlunxu.cc:7001 将正常展示内网上本地项目:

图片

下面是一个简易流程图:

图片

3.4 将内网上本地 html 服务暴露到公网(html 版本)

下面我们换一种配置方式, 下面是完整配置内容如下, 参数介绍看注释; 因为我们在 frps 上设置了 vhostHTTPPort = 7100 那么当我们访问公网服务器 7100 端口时, 转发到 frpc 后会走 type = "http" 的配置:

 

​​​​​​​

# frpc.tomlserverPort = 7000                # [必选] 要连接的 frps 端口serverAddr = "www.kunlunxu.cc"   # [必选] 要连接的 frps 地址log.to = "console"               # [可选] 日志配置, 通过打印的方式输出日志auth.token = "password"          # [可选] token 设置, frps 设置的 token, 其实就是密码
[[proxies]]                      name = "web - tcp"               # 代理名称(随便填)type = "tcp"                     # 代理类型localIP = "192.168.0.108"        # 代理地址, 要转发到哪个地址localPort = 5500                 # 代理端口, 要转发到哪个端口remotePort = 7001                # 远程端口(和远程 frps 哪个端口绑定在一起, 访问对应端口将使用该代理)
+ [[proxies]]+ name = "web - html"                   # 代理名称(随便填)+ type = "http"                         # 代理类型+ localIP = "192.168.0.108"             # 代理地址, 要转发到哪个地址+ localPort = 5500                      # 代理端口, 要转发到哪个端口+ customDomains = ["www.kunlunxu.cc"]   # 限制公网地址, 只有对应地址上
 frps 转发了 html 才会走到这里

重启 frpc: 其实就是重启 docker 容器

​​​​​​​
docker stop frpcdocker start frpc
 

访问 http://www.kunlunxu.cc:7100 将正常展示内网上本地项目:

图片

图片

下面是一个简易流程图:

图片

四、遇到问题

1、版本问题: 目前网上大部分文章的配置文件还是 frps.ini 或 frpc.ini, 写法上也是老的写法, 所以这里如果你安装的是最新版本那么一定请以 frp 官网 为准

2、如何确定 Docker 容器使用的配置文件是哪个? 答案是可直接查看容器的信息来进行确认

图片

如何查看日志? 正如上文可在配置文件中设置 log.to = "console" 并配合 docker logs 来查看服务输出的日志

  1. 上文中 webServer.addr 设置了 "0.0.0.0", 是因为默认情况下是该值为 127.0.0.1, 在测试过程中发现如果保持默认值无法访问到仪表盘页面了!!!

  2. 在最开始我是跑了一个 React 项目, 然后试图在 frpc 中将项目暴露出去, 最后发现一直无法代理成功!!! 经排查发现原来该项目无法通过内网 IP 进行访问的, 当然相对的解决办法就是需要调整 webpack 中的配置!! 后来省方便就直接使用 vscode 插件 Live Server 起了一个静态服务来进行测试!! 所以这里主要就是想提醒下, 在测试前请确保你的本地服务能够正常通过内网 IP 进行访问, 同时配置中尽量不要直接写 127.0.0.1, 尽量使用具体的内网 IP

  1. 在阿里云上, 拉取 snowdreamtech/frps 镜像时总是发现最新版本和 hub.docker 上对不上, 经排查发现问题出在 Docker 配置的源上, 由于我这边使用了 阿里云加速器, 但是由于 Docker Hub 的限制, 导致使用镜像加速器后无法获取最新官方镜像, 暂时解决办法就是去掉加速器配置, 直接连接 Docker Hub 进行获取:

 

rm /etc/docker/daemon.json       sudo systemctl daemon-reload     sudo systemctl restart docker

链接:https://juejin.cn/post/7293392480452247562

(版权归原作者所有,侵删)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1138195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个进程最多可以创建多少个线程

前言 话不多说,先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。 比如最常见的 32 位和 64 位系统&…

操作系统:进程与线程(一)进程与线程的概念及处理机调度算法

一战成硕 2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组织2.1.4 进程控制2.1.5 进程的通信2.1.6 线程和多线程模型 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法 2.1 进程与线程 2.1.1 进程的概念和特征…

MODBUS-TCP通信客户端如何访问服务器端RS485总线上的从站(SMART PLC梯形图程序)

SMART PLC的 MODBUS-TCP通信请参考下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.2k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的以太网…

若依ruoyi-nbcio如何做一个仿钉钉流程设计器的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 看到有些流程图采用仿钉钉的流程设计,比如下面界面: 这种方式虽然简单&#xff0c…

Python 中的 Pexpect

我们将通过示例介绍Python中的Pexpect。 Python 中的 Pexpect Python 是一种非常流行的语言,用于数据科学和机器学习。 它是一种非常强大的语言,因为 Python 具有可用于不同目的的内置库。 在这篇文章中,我们将研究Python中的pexpect。 Pex…

找不到msvcr90.dll无法继续执行代码怎么解决

msvcr90.dll是Microsoft Visual C 2008 SP1可再发行程序包中的一个动态链接库文件。它包含了用于支持C编程语言的类和函数。动态链接库是一种可重用的代码模块,它可以在多个应用程序之间共享,从而减少代码量并提高开发效率。那么遇到msvcr90.dll丢失怎么…

【计算机网络】从输入URL到页面都显示经历了什么??

文字总结 ① DNS 解析:当用户输入一个网址并按下回车键的时候,浏览器获得一个域名,而在实际通信过程中,我们需要的是一个 IP 地址,因此我们需要先把域名转换成相应 IP 地址。浏览器会首先从缓存中找是否存在域名&…

【继承之extends关键字和super关键字】

文章目录 继承是什么?为什么要继承?怎么继承?继承的语法 关键字extends 子类中访问父类的成员变量1.子类和父类的成员变量不同名2.子类和父类成员变量同名 子类中访问父类的成员方法1. .子类和父类的成员方法名字不同2..子类和父类的成员方法…

JUC并发编程之Synchronized锁优化

目录 1. Java对象头 2. Synchronized锁优化 2.1 偏向锁 2.2 轻量级锁 2.3 重量级锁 2.4 各种锁对比 1. Java对象头 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance D…

数据结构 C语言 2.1 线性表抽象数据类型 2.2 小议顺序表

一、线性表抽象数据类型 线性表的定义 定义:零个或多个数据元素的有限序列 线性表的特点: 1.它是一个序列 数据元素之间是有序的 数据元素之间是一对一的关系 2.有限性 线性表的数据元素个数是有限的 注意:零个数据元素的有限序列又…

NewStarCTF2023week4-依旧是空白(snow隐写)

打开附件的空白图片,CRC报错,很可能是高度被修改 爆出图片正确的宽度和高度并修复 打开看到密码 password: s00_b4by_f0r_y0u 另一个文件是空白的txt文档,大致看了一下像是不可见字符,尝试 white_space,发现不是&…

Uservue 中 keep-alive 组件的作用

目录 前言 用法 代码 理解 keep-alive 是 Vue.js 中一个内置的组件,它能够将不活动的组件实例保存在内存中,防止其被销毁,以便在后续需要时能够快速重新渲染。这个功能在一些需要频繁切换但不希望每次都重新渲染的场景中非常有用&#xf…

详解预处理(2)

目录 #undef 命令行定义 条件编译 NO1. NO2.多个分支的条件编译 NO3.判断是否被定义 NO4.嵌套指令 文件包含 头文件被包含的方式 本地文件包含 库文件包含 嵌套文件包含 其他预处理指令 今天接着继续讲解预处理的点,前面已经深入学习了#define。 #unde…

基于Springboot 游戏娱乐信息平台-计算机毕设 附源码 04691

Springboot 游戏娱乐信息平台 目 录 摘要 1 绪论 1.1研究内容 1.2国内外研究慨况 1.3研究方法 1.4论文结构与章节安排 2 游戏娱乐信息平台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性…

EvilAppleJuice(邪恶苹果汁)-ESP32C3项目(iphone疯狂弹窗)

原作者作品页: ckcr4lyf/EvilAppleJuice-ESP32: Spam Apple Proximity Messages via an ESP32 (github.com) 代码优化一下,增加呼吸灯效果方便知道设备运行情况,我是用arduino烧录 仅作交流学习使用,请勿在公开场合滥用 运行效果…

黑豹程序员-Python入门-for循环

文章目录 1、for循环语法2、巩固案例:长安三万里你记得的三位诗人?实现步骤:第一步:新建一个列表,存储诗人姓名第二步:列表用[]表示,元素之间用逗号,分隔第三步:用列表[索引]的方法将…

莫名其妙el-table不显示问题

完全复制element-ui中table代码,发现表格仍然不显示,看别人都说让降低版本,可我不想降低啊,不然其他组件有可能用不了,后来发现可以通过配置vite.config.js alias: {: path.resolve(__dirname, src),vue: vue/dist/vue…

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…

nexus5x 刷机root

刷机 进入fastboot模式 adb reboot bootloader 或者开机 音量减 解锁bootloader fastboot oem unlock 刷入rom包 下载 Nexus 和 Pixel 设备的出厂映像 | Google Play services | Google for Developers 选一个合适的ROM包下载到电脑的某个位置,然后unzip解…

国家网信办发布第十三批境内区块链信息服务备案编号

2019年2月15日《区块链信息服务管理规定》(以下简称《管理规定》)正式实施以来,国家互联网信息办公室依法依规组织开展备案审核工作,已发布2批次共506个境内区块链信息服务名称及备案编号,近日正式发布第三批共224个境…