FRP 内网穿透 | 实现远程访问与安全管理

唠唠闲话

内网穿透简介

在互联网上,两个不同主机进行通信需要知道对方的 IP 地址。由于世界人口和设备众多,IPv4 资源相对紧缺,因此绝大部分情况下是通过路由器或交换机转换公网 IP 后才上网

位于路由器或交换机后的设备通常是内网设备,其 IP 地址通常以 192.168、172.16 或 10.0 开头,这些属于内网 IP。如果要让内网设备对外提供服务,就需要进行内网穿透。

为什么需要内网穿透?
  1. 远程访问:在家里或出差时,想要访问公司或家庭网络中的文件、应用和服务。
  2. 开发和测试:开发人员需要在本地测试服务,并希望在公网环境中进行调试和展示。
  3. 安全需求:在确保安全的前提下,将内部服务暴露到公网进行访问,而不直接暴露内网设备。
  4. 物联网设备管理:对位于内网的物联网设备进行远程监控和管理。

常见的内网穿透工具包括 Ngrok、FRP 和 ZeroTier 等,本文将介绍 FRP 的使用方法。

相关阅读
利用frp工具实现内网穿透、随时随地访问内网服务
frp 内网穿透教程
内网穿透系列:ZeroTier技术初级

FRP 是什么

FRP 是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。它可以将内网服务通过具有公网 IP 的节点以安全、便捷的方式暴露到公网。

基本原理

20230618223449

如上图所示:

  • 在带有公网 IP 的云服务器上部署 FRP 的服务端 frps
  • 在需要穿透的内网服务器上部署 FRP 的客户端 frpc
  • 每个客户端都有一个配置文件用于与服务器连接
  • 公网服务器充当代理服务器,当用户访问 公网 IP + 端口号时,公网服务器上的 frps 服务会根据端口号,自动转发到对应的内网服务器上,从而实现对内网服务的访问

下边通过实践,对这些概念做更具体的理解认识。

FRP 配置及使用

本教程使用的是 v0.52.3 版本,配置文件格式为 .toml,旧版本比如 0.49.0 使用的是 .ini 格式。

下载 FRP

访问 FRP 的 发行页面,根据您的系统选择合适的版本进行下载:

20231217210538

一般情况下,Linux 系统使用的是 AMD 架构。如果不确定,可以通过输入 arch 命令查看。如果返回值是 x86_64,则说明是 AMD 架构。

使用命令行下载:

wget -c https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz && rm frp_0.52.3_linux_amd64.tar.gz

文件结构如下:

.
├── frpc
├── frpc.toml
├── frps
├── frps.toml
└── LICENSE

将服务端和客户端文件分开,以便管理:

cd frp_0.52.3_linux_amd64
mkdir client server
mv frpc* client
mv frps* server

server 文件夹放在公网服务器上,将 client 文件夹放在内网服务器上。

配置服务端

以下是一个简单的配置文件示例,参数说明见注释。完整的配置文件请参考 frps_full_example:

bindAddr = "0.0.0.0"
bindPort = 7000
# 监控流量页面
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "username"
webServer.password = "password"

# 授权码
auth.method = "token"
auth.token = "yourtoken"

# 去除访问限速
transport.tcpMux = false

# FRP 日志配置
log.to = "/home/user/software/frp/frps.log"
log.level = "info"
log.maxDays = 3

这里有几个参数需要根据具体需求进行手动修改:

  1. bindPort:FRP 服务端监听的端口,即服务入口,建议自定义。
  2. auth.token:授权码,这个授权码也会在客户端配置中使用。
  3. webServer.port:监控流量页面的端口,建议自定义。
  4. webServer.user:监控流量页面的用户名。
  5. webServer.password:监控流量页面的密码。
  6. log.to:日志文件路径,根据需要修改。

其中,auth.token 可以通过 pwgen -s 32 1 生成,这是连接服务使用的密钥,为了安全起见,务必进行修改。

服务端自启动

server 目录上传到公网服务器,并创建 frps.service 文件:

cd /lib/systemd/system
sudo vim frps.service

内容如下:

[Unit]
Description=FRPS Service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/home/user/software/frp/frps -c /home/user/software/frp/frps.toml
Restart=always
RestartSec=15s

[Install]
WantedBy=multi-user.target

请根据实际路径填写 ExecStart 中 FRPS 的可执行文件路径和配置文件路径。

编写完成后,执行以下命令以启用和启动服务:

sudo systemctl enable frps
sudo systemctl start frps

如果之后更改了配置文件,执行以下命令重启服务:

sudo systemctl daemon-reload
sudo systemctl restart frps

通常,可以通过以下命令查看服务状态:

sudo systemctl status frps  # 查看服务状态

客户端配置

client 目录上传到内网服务器,并编辑 frpc.toml 文件,示例如下,参数见注释。

serverAddr = "公网IP地址"
serverPort = 7000

# 监控流量页面
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "username"
webServer.password = "password"

# 授权码
auth.method = "token"
auth.token = "yourtoken"

# 设置心跳
auth.additionalScopes = ["HeartBeats"]

# 去除访问限速
transport.tcpMux = false

# FRP 日志配置
log.to = "/home/user/software/frp/frpc.log"
log.level = "info"
log.maxDays = 3

其中 serverAddr 为公网服务器的 IP 地址,其他内容与服务端配置文件保持一致。如果需要添加服务(如 SSH 穿透),在 frpc.toml 中添加相应的 proxies 字段,例如:

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222

客户端自启动

客户端自启动的配置类似于服务端,创建 frpc.service 文件:

cd /lib/systemd/system
sudo vim frpc.service

内容如下:

[Unit]
Description=FRPC Service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/home/user/software/frp/frpc -c /home/user/software/frp/frpc.toml
Restart=always
RestartSec=15s

[Install]
WantedBy=multi-user.target

根据实际路径填写 ExecStart 中 FRPC 的可执行文件路径和配置文件路径。

后续命令类似:

# 启用和启动服务
sudo systemctl enable frpc
sudo systemctl start frpc
# 更改配置文件后重启服务
sudo systemctl daemon-reload
sudo systemctl restart frpc
# 查看服务状态
sudo systemctl status frpc  

监控设置

默认情况下,可以通过 IP + 端口访问监控页面。如果有域名,可以在 Nginx 中添加如下配置:

server {
    listen 80;
    server_name your_domain;
    location / {
        proxy_pass http://localhost:7500;
    }
}

其中 your_domain 为你的域名,7500 为服务端配置文件中的 webServer.port 端口。

心跳设置

如果不设置心跳,FRP 创建的连接在长时间不活动后可能会断开,并且重新连接可能需要多次尝试才能成功。为了避免这种情况,可以在服务端设置一个定时任务,保持连接的活跃性。

在服务端输入 crontab -e,添加以下定时任务:

* * * * * curl localhost:8080 --max-time 5 >/dev/null 2>&1

该任务每分钟发送一个 curl 请求,访问服务器的 8080 端口,而该端口通过 FRP 穿透到内网服务。这样每分钟都会发送一次心跳请求,保持连接不断开。

在客户端的 frpc.toml 文件中,添加相应的 proxies 配置:

[[proxies]]
name = "heartbeat"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080

这样配置后,FRP 客户端将内网的 80 端口映射到公网的 8080 端口,使定时任务可以保持连接的活跃性,避免连接断开。

总结

最后做个小结。教程详细介绍了如何使用 FRP 实现内网穿透,内容包括以下几个方面:

  1. 下载与安装:如何根据系统选择合适的 FRP 版本并进行下载和安装。
  2. 配置服务端:如何编写和优化 FRP 服务端配置文件,以及在系统中设置自启动服务。
  3. 配置客户端:如何编写 FRP 客户端配置文件,添加所需的服务映射,并设置客户端自启动。
  4. 监控设置:如何通过 Nginx 配置使用域名访问 FRP 监控页面,方便管理和查看流量信息。
  5. 心跳设置:如何通过定时任务和配置文件设置,确保 FRP 连接的稳定性,避免长时间不活动导致的连接断开。

如有任何问题,欢迎参考 FRP 的官方文档或相关社区资源进行深入了解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node 中间件使用例子

NodeJS在中间件领域有着较为广泛的应用,他能做一些中间层事件,把服务端一部分的代码抽出来,减少处理冗余事情付出的代价,同时让服务真正做业务处理而不用关心页面的事情 常见的应用场景有: 跨域:解决跨域问…

C++ 实现HTTP的客户端、服务端demo和HTTP三方库介绍

本文使用C模拟实现http的客户端请求和http的服务端响应功能,并介绍几种封装HTTP协议的三方库。 1、实现简单HTTP的服务端功能 本程序使用C tcp服务端代码模拟HTTP的服务端,服务端返回给客户端的消息内容按照HTTP协议的消息响应格式进行了组装。 demo如…

15:HAL----ADC模数转化器

STM32C8T6有2个ADC,ADC1和ADC2 一:介绍 1:简历 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC,1us转…

科技项目验收测试必须进行吗?软件测试公司推荐

科技项目验收测试是指在科技项目开发周期中,对项目完成后进行的一种测试和评估工作。它的目的是验证项目是否达到预期的要求,并确保项目交付给客户前达到预期的质量标准。 一、科技项目验收测试的必要性   科技项目验收测试是项目管理中不可或缺的一个…

Lua实现自定义函数面向对象编程

本文目录 1、引言2、原理3、实例4、层析验证 文章对应视频教程: 暂无,可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中,面向对象编程(OOP)已经成为一种广泛使用的编程范式…

k8s+pv+pvc+nas 数据持久化volumes使用

1 k8s pod申请持久化卷配置 apiVersion: v1 kind: Service metadata:name: $IMG_NAMEnamespace: rz-dtlabels:app: $IMG_NAME spec:type: NodePortports:- port: 8091nodePort: 31082 #service对外开放端口selector:app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment …

HarmonyOs修改应用名称和图标方法

最近在开发Harmony应用,发现修改app.json5下的lable:app_name和icon不生效 后来经过查找,原来还需要更改entry下的src/main/module.json5才行,具体操作路径是: 更改后生效:

线程池前置知识

并发和并行 并发是指在单核CPU上,多个线程占用不同的CPU时间片。线程在物理上还是串行执行的,但是由于每个线程占用的CPU时间片非常短(比如10ms),看起来就像是多个线程都在共同执行一样,这样的场景称作并发…

架构设计 - nginx 的核心机制与主要应用场景

一、nginx 的核心机制: 1. 事件驱动模型(epoll 多路复用) 事件循环: Nginx的核心组件是一个事件循环,它不断地监听事件(如新连接的到来、请求数据的可读性等)。 当有事件发生时,事…

『 Linux 』动态库的加载

文章目录 动静态库的区别动态库-共享库动态库的加载动态库的管理 总结 动静态库的区别 动态库(Dynamic Libraries) 链接方式 动态链接,程序在运行时(而不是在编译时)与动态库链接; 操作系统负责加载动态库文件; 文件大小 使用动态库的应用程序通常其可执行文件大小更小; 因…

missing authentication credentials for REST request

1、报错截图 2、解决办法 将elasticsearch的elasticsearch.yml的 xpack.security.enabled: true 改为 xpack.security.enabled: false

vba学习系列(5)--指定区域指定字符串计数

系列文章目录 文章目录 系列文章目录前言一、需求背景二、vba自定义函数1.引入库 总结 前言 一、需求背景 想知道所有客诉项目里面什么项目最多,出现过多少次。 二、vba自定义函数 1.引入库 引用: CountCharInRange(区域,“字符串”) Function CountCh…

光伏电站阵列式冲击波声压光伏驱鸟器

光伏电站内鸟群的聚集可不是一件好事,鸟类排泄物,因其粘度大、具有腐蚀性的特点,一旦堆积在太阳能板上,会严重影响光伏电站的发电效率。长期积累的鸟粪不仅难以清洗,还可能引发组件的热斑效应,严重时甚至可…

Bean基础配置

黑马程序员SSM 文章目录 一、Bean基础配置二、bean别名配置2.1 ban的别名配置2.2 注意事项 三、Bean作用范围配置3.1 Bean作用范围3.2 bean作用范围说明 一、Bean基础配置 二、bean别名配置 2.1 ban的别名配置 2.2 注意事项 获取bean无论是通过id还是name获取,如果…

.NET MAUI Sqlite程序应用-数据库配置(一)

项目名称:Ownership(权籍信息采集) 一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、创建多个表及相关字段 Models\OwnershipItem.cs using SQLite;namespace Ownership.Models {public class fa_rural_base//基础数据…

ArcGIS Pro SDK (三)Addin控件 1 按钮类

ArcGIS Pro SDK (一)Addin控件 目录 ArcGIS Pro SDK (一)Addin控件1 Addin控件2 ArcGIS Pro 按钮2.1 添加控件2.2 Code 3 ArcGIS Pro 按钮面板3.1 添加控件3.2 Code 4 ArcGIS Pro 菜单4.1 添加控件4.2 Code 5 ArcGIS Pro 分割按钮…

如何从零训练多模态大模型(预训练方向)

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

所爱隔山海,上海婚恋交友app开发,我奔向你

每每讲到婚恋,就有感叹“难”的声音,在婚恋市场上,到处充斥者“难”的声音,更有胜者,甚至发出了“难于上青天”的感叹。在婚恋市场蹉跎浮沉的青年俊女们,越挫越勇,向着爱的呼唤,一次…

Java工具-实现无损png转换jpg格式

目录 1、背景说明 2、通过代码实现格式转换 3、无损转化 4、说明 读取 PNG 图像: 创建空的 JPG 图像: 绘制 PNG 图像到 JPG 图像: 设置 JPG 图片压缩质量: 写入 JPG 文件并关闭流: 5、jpg转png 1、背景说明 …

Opencv图像梯度计算

Opencv图像梯度计算 Sobel算子 可以理解为是做边缘检测的一种方法。 首先说明自己对图像梯度的简单理解:简单理解就是图像的颜色发生变化的边界区域在X方向和Y方向上的梯度值 Gx Gy 而Gx和Gy处的梯度的计算—使用下面的公式来进行计算。 G x [ − 1 0 1 − 2 0 …