当前位置: 首页 > news >正文

frp内网穿透部署

如果本系列文章对您有帮助,可以 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,求求惹(๑> <)☆♡~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MATLAB软件开发通用控制的软件架构参考
  • 【第十四章:Sentosa_DSML社区版-机器学习之时间序列】
  • 【Docker安装RabbitMQ】
  • Python中的数据可视化:从基础图表到高级可视化
  • 什么是绩效改进计划?
  • python request库的使用
  • 《C++编程魔法:构建绿色主题的奇幻游戏世界》
  • T检验:一种通俗易懂的统计分析方法
  • 渗透测试类 面试题
  • 在spring boot项目中使用jaxb实现Java Bean与XML互转
  • Note_XML学习笔记
  • 【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
  • C++学习笔记(41)
  • 计算机毕业设计hadoop+hive航班预测系统 飞机票航班数据分析可视化大屏 机票预测 机票爬虫 飞机票推荐系统 大数据毕业设计
  • 多媒体领域格式汇总
  • AHK 中 = 和 == 等比较运算符的用法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SegmentFault 2015 Top Rank
  • Service Worker
  • SpringBoot 实战 (三) | 配置文件详解
  • 安卓应用性能调试和优化经验分享
  • 七牛云假注销小指南
  • 前端面试题总结
  • 巧用 TypeScript (一)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序测试方案初探
  • 找一份好的前端工作,起点很重要
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ### RabbitMQ五种工作模式:
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #图像处理
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (10)ATF MMU转换表
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (补充)IDEA项目结构
  • (附源码)计算机毕业设计ssm电影分享网站
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Redis的秒杀Dome和异步执行
  • .net 获取url的方法
  • .net 流——流的类型体系简单介绍
  • .net和jar包windows服务部署
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /bin/rm: 参数列表过长"的解决办法
  • :class的用法及应用
  • @SentinelResource详解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [20140403]查询是否产生日志