frp内网穿透部署

devtools/2024/9/24 11:42:09/

如果本系列文章对您有帮助,可以 star 一下我的 limou-learn-note,求求惹(๑> <)☆♡~

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出!

[TOC]

[!NOTE]

概要:有些时候我们不得不使用内务穿透工具,这里推荐 最著名的内外穿透工具 frp,我们可以 根据这个文档来学习怎么使用 frp 来做穿透,首先您必须要知道的原理是什么,否则您可能从一开始就不清楚我们需要做什么。

[!NOTE]

资源:...


1.frp 的安装运行

直接去 frp 官网获取其对应的二进制文件即可,而这里我以 Ubuntu 为例子,使用 wget 进行安装,并且只在 Ubuntu 的具有公网 ip 的机器上尝试运行。

[!CAUTION]

警告:我们这里只是尝试运行,不代表真正应用 frp,因此下载好 frp 后,配置文件我暂时不修改,只是做个解读。

[!CAUTION]

警告:整个下载配置运行的过程,我都在具有公网 IP 服务器上进行了配置。

# 安装 frp
# 下载 frp 的二进制文件压缩包
$ wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz# 解压 frp 的压缩包
$ tar -zxvf frp_0.60.0_linux_amd64.tar.gz# 重命名解压文件夹
$ mv frp_0.60.0_linux_amd64 frp# 打开解压文件夹
$ cd frp# 查看当前目录下的文件
$ ls
frpc  frpc.toml  frps  frps.toml  LICENSE
# 查看 frp
# 查看当前服务端程序的配置文件
$ cat frps.toml # 不过我们先按照默认的即可, 我们只在本地稍微测试一下就行
bindPort = 7000 # frp 服务端程序在公网服务器中运行时所在的端口# 查看当前客户端程序的配置文件
$ cat frpc.toml
serverAddr = "127.0.0.1" # 后续要改为公网服务器的公网 ip(后面是一定要修改的)
serverPort = 7000 # 就是前面的端口, 客户端通过 serverAddr+serverPort 才能找到公网机器中的 frp 服务端程序(因此要和前面 frps.toml 中的 bindPort 保持同步)[[proxies]] # proxies 就是代理的意思
name = "test-tcp" # 客户端名称(可选修改)
type = "tcp" # 采用的代理协议(没有特殊需求无需修改)
localIP = "127.0.0.1" # 转发到这个 ip
localPort = 22 # 转发到这个 port
remotePort = 6000 # 公网机器上对外开放的端口, 用于支持外界穿透到内网(这样其他非内网主机就可以把对 "公网ip+remotePort" 的请求转发到 "localIP+localPort" 上进行处理)
# 运行 frp
$ ./frps -c ./frps.toml # 使用以下命令启动服务端程序
[1] 558528
2024-09-09 00:18:12.920 [I] [frps/root.go:105] frps uses config file: ./frps.toml
2024-09-09 00:18:13.171 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2024-09-09 00:18:13.172 [I] [frps/root.go:114] frps started successfully$ ./frpc -c ./frpc.toml # 使用以下命令启动客户端程序
2024-09-09 00:21:01.337 [I] [sub/root.go:142] start frpc service for config file [./frpc.toml]
2024-09-09 00:21:01.337 [I] [client/service.go:295] try to connect to server...
2024-09-09 00:21:01.342 [I] [server/service.go:576] [42307efebbdeb377] client login info: ip [127.0.0.1:48018] version [0.60.0] hostname [] os [linux] arch [amd64]
2024-09-09 00:21:01.342 [I] [client/service.go:287] [42307efebbdeb377] login to server success, get run id [42307efebbdeb377]
2024-09-09 00:21:01.342 [I] [proxy/proxy_manager.go:173] [42307efebbdeb377] proxy added: [test-tcp]
2024-09-09 00:21:01.343 [I] [proxy/tcp.go:82] [42307efebbdeb377] [test-tcp] tcp proxy listen port [6000]
2024-09-09 00:21:01.343 [I] [server/control.go:399] [42307efebbdeb377] new proxy [test-tcp] type [tcp] success
2024-09-09 00:21:01.343 [I] [client/control.go:168] [42307efebbdeb377] [test-tcp] start proxy success

可以看到没有什么明显的报错,这代表我们安装成功了。

2.frp 的工作原理

frp 主要由两个组件组成:客户端(frpc)服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frpsfrp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现从局域网外的计算机向局域网进行通信。

frp 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。

frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务
  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量
  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能
  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量
  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口
  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口
  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转
  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务

每种代理类型适用于不同的使用情境,您可以根据需求选择合适的代理类型来配置 frp,这里我尽可能追寻默认。

3.frp 的实践过程

3.1.代理单个 ssh 服务访问一台内网机器

[!WARNING]

注意:当然,前提是内网机器已经部署了 ssh 连接,否则后面都是空谈...

首先需要准备三台机器,我这里以及有:

  • 一台具有公网 ipUbuntu20 服务器 public_server,分配公网 IP 假设为 123.123.123.123
  • 一台我自己组件子网的 Ubuntu24 电脑 private_server
  • 一台直连运行商 4G 网络的本地 apple 电脑 self_server

此时 private_serverself_server 都可以访问 public_server,但是 self_server 无法访问到 private_server

我们此时要做到的就是 self_server 可以成功借助 public_server 访问到 private_server

此时我们先把之前在 public_serverfrp/ 文件夹及其内部的内容全部复制到 private_server 中。然后接下来记住:

  • public_server 持有文件 frps, frps.toml, frps.service
  • private_server 持有文件 frpc, frpc.toml, frpc.service

根据我之前的提示,修改配置文件,然后再配置文件的基础上,配置服务文件,因为我们一般都是直接使用 systemd 来管理服务端或客户端的。

# public_server
$ vim frps.toml
$ cat frps.toml
bindPort = 7000 # 保持不变即可, 不过注意 public_server 服务器需要开启这个端口
# private_server
$ vim frpc.toml
$ cat frpc.toml
serverAddr = "123.123.123.123" # 公网机器
serverPort = 7000 # 一定要和上面的 bindPort 保持同步[[proxies]]
name = "frp-tcp" # 这里我换了一个名字
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # 这个端口也一定要在 public_server 上开放

[!CAUTION]

警告:不过这里官方只配置了一服务端程序的配置文件,这里我把客户端程序的配置文件也给出了,为了方便您后续的使用。而且我还做了一些配置上的改动,增强这个 frp 服务,提高可用性。

# 在 public_server 上创建 frps.service 配置文件
# 编写配置文件
$ sudo vim /etc/systemd/system/frps.service
$ cat /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network-online.target syslog.target # 定义启动顺序: 当前服务要等到系统的网络相关服务, 日志系统相关服务启动之后再启动
Wants = network-online.target # 定义软依赖关系: 尽可能启动网络服务
# Requires = ... # 定义硬依赖关系: ...[Service]
Type = simple # 定义服务启动类型
ExecStart = <这里填入您的 frps 可执行程序的路径> -c <这里填入您的 frps.toml 配置文件的路径> # 启动 frps 的命令, 需修改为您的 frps 的安装路径
Restart = always # 设置总是启动
StartLimitInterval = 30s # 设置为 30s
StartLimitBurst = 5 # 在 StartLimitInterval 设置的时间内最多启动 5 次[Install] # 这个不再展开, 要细细研究 systemd 一系列的知识才能正确理解...
WantedBy = multi-user.target
# 在 private_server 上创建 frpc.service 配置文件
# 编写配置文件
$ sudo vim /etc/systemd/system/frpc.service
$ cat /etc/systemd/system/frpc.service
[Unit]
# 服务名称,可自定义
Description = frp client
After = network-online.target syslog.target # 定义启动顺序: 当前服务要等到系统的网络相关服务, 日志系统相关服务启动之后再启动
Wants = network-online.target # 定义软依赖关系: 尽可能启动网络服务
# Requires = ... # 定义硬依赖关系: ...[Service]
Type = simple # 定义服务启动类型
ExecStart = <这里填入您的 frpc 可执行程序的路径> -c <这里填入您的 frpc.toml 配置文件的路径> # 启动 frps 的命令, 需修改为您的 frpc 的安装路径[Install] # 这个不再展开, 要细细研究 systemd 一系列的知识才能正确理解...
WantedBy = multi-user.target

然后也是经典的 systemd 管理指令来进行管理。

# 管理 frps.service 服务
# 重载 frps.service 服务文件
$ sudo systemctl daemon-reload# 启动 frps.service 服务
sudo systemctl start frps.service# 设置 frps.service 服务为开机自启动
sudo systemctl enable frps.service# 查看 frps.service 状态
sudo systemctl status frps.service
# 管理 frpc.service 服务
# 重载 frpc.service 服务文件
$ sudo systemctl daemon-reload# 启动 frpc.service 服务
sudo systemctl start frpc.service# 设置 frpc.service 服务为开机自启动
sudo systemctl enable frpc.service# 查看 frpc.service 状态
sudo systemctl status frpc.service

然后使用 ssh private_server_user_name@123.123.123.123:6000self_server 上开始内网穿透,能输入密码并且访问到 bash 终端就说明穿透成功。

3.2.代理多个 ssh 服务访问多台内网机器

待补充...


[!NOTE]

结语:...

如果本系列文章对您有帮助,可以 star 一下我的 limou-learn-note,求求惹(๑> <)☆♡~


http://www.ppmy.cn/devtools/116470.html

相关文章

基于单片机的智能窗帘控制系统-设计说明书

设计摘要&#xff1a; 智能窗帘控制系统是一种利用单片机技术实现的智能化控制系统&#xff0c;可以实现窗帘的自动开合和定时控制功能。本系统的设计基于单片机技术&#xff0c;结合传感器、电机和执行器等硬件设备&#xff0c;实现对窗帘的智能化控制。通过传感器采集环境信…

基于量子通讯进行安全认证

8月16日,中国银行的一项发明专利“安全认证方法、装置、电子设备及计算机存储介质”授权公告。其申请于2022年6月29日,公布于2022年9月20日。据悉,该发明中应用了量子通讯/量子随机数相关技术。 事实上,近年来,有多家银行探索研究量子技术。在多家银行的2024半年报中,就…

华为云长江鲲鹏深度赋能,大势智慧稳居“实景三维+AI”领域排头兵

本文转自长江日报大武汉客户端 走出象牙塔第10年&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;已成长为国内三维技术创新及应用领域龙头企业&#xff0c;其自主研发的“重建大师”等三维测绘软件系统在各级测绘系统占有率达到87.5%。 这…

java项目之基于springboot的医院资源管理系统源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院资源管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

Java中的快速排序算法详解

快速排序是一种广泛使用的排序算法&#xff0c;以其高效的性能和简单的实现而闻名。它基于分治法的原理&#xff0c;通过一个基准值&#xff08;pivot&#xff09;将数组分为两个子数组&#xff0c;分别对子数组进行排序&#xff0c;最终达到整体排序的目的。本文将详细介绍快速…

字节面试:Redis为什么要持久化?有几种方式?

文章目录 Redis为什么需要持久化&#xff1f;持久化分类RDB&#xff08;快照snapshot&#xff09;AOF &#xff08;Append Only File&#xff09;AOF VS RDB混合持久化 扩展1&#xff1a;生成RDB快照命令对比扩展2&#xff1a;模拟断电恢复数据扩展3&#xff1a;设置持久化方式…

Spring MVC参数接收 总结

1. 简介 Spring MVC可以简化从前端接收参数的步骤。 2. Param传参 通过设定函数入参和添加标记来简化接受&#xff1a; //参数接收 RequestMapping("product") ResponseBody //接受/product?productgoods&id123 //1.名称必须相同&#xff0c;2.不传值不会不…

使用Python实现深度学习模型:智能宠物监控与管理

在现代家庭中,宠物已经成为许多家庭的重要成员。为了更好地照顾宠物,智能宠物监控与管理系统应运而生。本文将详细介绍如何使用Python实现一个智能宠物监控与管理系统,并结合深度学习模型来提升其功能。 一、准备工作 在开始之前,我们需要准备以下工具和材料: Python环境…