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 的官方文档或相关社区资源进行深入了解。

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

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

相关文章

C#操作MySQL从入门到精通(22)——创建表与操纵表

前言 我们新建数据库以后,最需要做的就是创建表,对数据库的操作绝大多数情况下都是都对表的操作,本文就是讲解如何创建表以及修改表中的列,修改表名等操作。由于创建表的方法基本上有两种,一种是使用带有界面的工具比如Navicate来创建表,另一种是使用sql语句来创建表,实…

SAP 价格金额信息控制

1)migo / mb51/mb51/mb59 关于价格和金额的显示,需要权限控制,当权限对象F_BKPF_BUK,检查对应【公司代码】 和 ACTVT有03’的权限,如果没有03的权限,对应行的价格和金额显示为空 关于价格和金额的显示,需要权限控制&a…

景联文科技:打造亿级高质量教育题库,赋能教育大语言模型新未来

随着人工智能技术的持续进步,从广泛的通用大语言模型到针对各行业的垂直大语言模型,已成为人工智能大语言模型技术深化演进的必然趋势。 教育大语言模型是适用于教育场景、具有庞大规模参数、融合了广泛的通用知识和专业知识训练形成的人工智能模型。能为…

多商户小程序开发步骤和方法

在当今的数字经济中,多商户小程序作为一种创新的商业平台,提供了一种新的商业模式,使多个商户能够在同一平台上展示和销售他们的产品或服务。这种模式不仅增强了消费者选择的多样性,也为商家提供了一个更广泛的销售渠道。以下是详…

Modbus协议转Profinet协议网关与气体监测系统配置案例

一、背景;Modbus协议和Profinet协议作为工业领域常见的两种通讯协议,各自具有一定的特点和应用范围。Modbus转Profinet网关(XD-MDPN100/300)在工业自动化控制系统中,可以将Modbus协议转换为Profinet协议,以…

基于栅格占据概率和距离场的机器人覆盖轨迹模拟

基于栅格占据概率和距离场的机器人覆盖轨迹模拟 简介 辐射场模型实现 理论基础 指数函数建模 我们使用指数函数来表示机器人在某个栅格上停留时间对覆盖概率的影响: p ( t ) 1 − e − λ t p(t) 1 - e^{-\lambda t} p(t)1−e−λt 其中 λ \lambda λ 是控制增长速率…

【SpringBoot+Vue】后端代码学习记录——登录功能开发

参考资料 https://www.cnblogs.com/three-fighter/p/14332288.html 零、前端开发 略。之前有过。 一、后端开发 1、统一结果封装 创建了一个 Result 类,用于异步统一返回的结果封装。一般来说,结果里面有几个要素必要的 是否成功,可用 c…

不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)

公司刚开始建设安全管理时,都是从一片混沌开始的,资源总是不够的,我们每个做安全的人员,又要会渗透,又要抓制度,还得管理各种漏洞。在管理楼栋是,我相信大家都遇到过以下几个问题: …

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression(回归): 类似于填空 Classification(分类): 类似于选择 Structure Learning(机器学习): ?? 机器学习找对应函数…

Python基础教程(十六):正则表达式

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

查分易老师怎么用?

老师们想知道怎么样创建一个查分易成绩查询系统吗?" 这是许多老师在学期结束时关心的问题。别担心,查分易小程序让查询发布工作变得省事又高效。 首先成绩Excel表格格式要设置正确。第一行必须是表头,包含学生的"姓名"、"…

C++中的结构体——结构体中const的使用场景

作用:用const来防止误操作 示例 运行结果

2024酒店IPTV云桌面系统建设方案

Hello大家好,我是点量小芹,这一年多的时间一直在分享实时云渲染像素流相关的内容,今天和大家聊聊酒店IPTV云桌面电视系统解决方案,或者有的朋友也会称之为IPTV服务器。熟悉小芹的朋友知道,IPTV软件系统是我们一直在推的…

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面,甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…

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

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

放弃Venn-Upset-花瓣图,拥抱二分网络

写在前面 让点随机排布在一个区域,保证点之间不重叠,并且将点的图层放到最上层,保证节点最清晰,然后边可以进行透明化,更加突出节点的位置。这里我新构建了布局函数 PolyRdmNotdCirG 来做这个随机排布。调用的是packcircles包的算…

商家转账到零钱最全面攻略:申请、使用、注意事项等详解

一、微信商家转账到零钱功能概述 微信支付作为国内最大社交软件的增值服务,在商业活动中广泛使用。其开发的营销功能“商家转账到零钱”则允许商家直接将资金转入用户的微信钱包,操作简便快捷。本文将详细探讨此功能的使用条件、操作步骤以及解答一些常…

Java中Transactional在不同方法间的穿透性,rollbackFor参数含义

哈喽,大家好,我是木头左! 在Java开发中,经常会遇到需要在一个事务中执行多个操作的场景。为了确保这些操作的原子性,可以使用Spring框架提供的Transactional注解来实现事务管理。然而,在实际开发过程中&…

LeetCode刷题之HOT100之验证二叉搜索树

1、题目描述 2、逻辑分析 要求给定的根节点是否是有效的二叉树。有效的二叉搜索树定义如上。那么如何求解呢?题解给出了两张求解方法:递归、中序遍历。这边倾向于中序遍历,中序遍历后的二叉树是升序排序的,以这个性质即可解题。 …

Prometheus——部署详解

目录 一、Prometheus Server端安装和相关配置 1.上传安装包并解压 2.配置系统启动文件 3.启动 二、部署Node Exporters监控系统指标 三、监控Mysql配置示例 1.Mysql服务器操作 2.Prometheus服务器操作 四、监控Nginx配置示例 1.在Nginx服务器操作 2.Prometheus服务器…