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

基于frp工具实现内网穿透,跨局域网远程SSH登录

文章目录

  • 一.概述
    • 1.1 为什么要内网穿透?
    • 1.2 什么是frp?
  • 二.frp安装管理流程
    • 2.1 frp下载
    • 2.2 部署
    • 2.3 通过systemd系统服务管理启动程序
  • 三.frp配置测试(通过SSH访问内网机器C)
    • 3.1 服务端配置文件frps.toml修改
    • 3.2 客户端配置文件frpc.toml修改
    • 3.3 启动 frps 和 frpc
  • 四 .一切就绪,执行测试
  • 五 .补充:测试网络端口工具
  • 六.参考链接

一.概述

1.1 为什么要内网穿透?

在这里插入图片描述

  如上图,假设我们想要通过主机A访问主机C(通过SSH登录),但是主机A和主机C在不同的局域网中,绑定的都是私有ip地址,所以它们之间是无法直接进行通信的。要想使得A和C能够进行通信,就需要用到内网穿透的技术。使得局域网内的设备C能够被“穿透”到公网中,被其他设备所访问,这就要用到内网穿透技术。
  内网穿透是一种网络技术,通常用于将位于局域网内部的服务、设备、或者应用程序暴露到公共网络(互联网)中,使得外部网络可以访问局域网内的资源。比如上图中,我们把公网中的服务器B作为代理桥梁沟通A和C,由于B是公网ip,因此A和C都可以主动访问到B,那么我们就可以在B和C之间建立通信信道,在A需要访问C时,将访问请求发给B,由B作为代理转发给C,这样就实现了A与C之间的通信,也就实现了C的内网穿透。
  现在有多种工具可以提供内网穿透服务,如ngrok,花生壳,frp等,本文将介绍通过frp实现内网穿透,简单免费、配置方便。

1.2 什么是frp?

  frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。

  通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,并享受以下专业特性

  • 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
  • TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
  • 代理组间的负载均衡。
  • 端口复用:多个服务可以通过同一个服务端端口暴露。
  • P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
  • 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。
  • 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
  • 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。

代理类型: 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。

二.frp安装管理流程

2.1 frp下载

  frp 采用 Go 语言编写,支持跨平台,只需下载适用于您平台的二进制文件即可执行,无需额外依赖。您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明,我的linux系统下载的是这个版本:

在这里插入图片描述
  下载并解压之后有如下文件几个文件,其中frpcfrpc.toml是客户端的执行程序和配置文件(仅在客户端使用),而frpsfrps.toml是服务端的执行程序和配置文件(仅在服务端使用);;
在这里插入图片描述

2.2 部署

  1. 解压下载的压缩包。
  2. frpcfrpc.toml复制到内网服务所在的机器上(客户端)。
  3. frpsfrps.toml复制到拥有公网 IP 地址的机器上(服务端),并将它们放在任意目录。

2.3 通过systemd系统服务管理启动程序

  在 Linux 系统下可以使用 systemd 来管理 frps 服务,包括启动停止配置后台运行设置开机自启动功能,非常方便。

1.安装 systemd

  如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:

# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd

2.创建 frps.service 文件

  使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件(同理,客户端是frpc.service),用于配置 frps 服务。

sudo vim /etc/systemd/system/frps.service   # 服务端sudo vim /etc/systemd/system/frpc.service   # 客户端

3.写入内容(以服务端为例)

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml[Install]
WantedBy = multi-user.target

4.使用 systemd 命令管理 frps 服务(以服务端为例)

# 启动frps
sudo systemctl start frps
# 停止frps
sudo systemctl stop frps
# 重启frps
sudo systemctl restart frps
# 查看frps状态
sudo systemctl status frps

5.设置 frps 开机自启动

sudo systemctl enable frps

  命令执行结果如下,可以看出设置开机启动实际就是在/etc/systemd/system/multi-user.target.wants/目录下面创建一个符号链接,即可实现开机自启动,不难分析出开机时系统加载会扫描改目录下的服务配置,从而实现开机自启动,实现原理简单,举一反三,对于自己的服务程序也可以封装成systemd管理方式,这样维护起来更加方便高效。

通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。

三.frp配置测试(通过SSH访问内网机器C)

  在客户端和服务器分别部署好frp程序之后,下一步需要修改配置文件,即在服务端修改frps.toml,客户端修改frpc.toml

3.1 服务端配置文件frps.toml修改

  在公网服务器上部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

bindPort = 7000      # 用来接收客户端(被代理机器C)连接的端口

  默认配置就是7000,不用改动。

3.2 客户端配置文件frpc.toml修改

  在需要被访问的内网机器(客户端C)上部署 frpc,并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为124.156.15.247,以下是示例配置:

serverAddr = "124.156.15.247"      # 公网服务器(服务端B)ip
serverPort = 7000                  # 公网服务器(服务端B)端口,上面设置的[[proxies]]
name = "ssh"
type = "tcp-test"
localIP = "127.0.0.1"              # 客户端C本地ip,不用改,就是localhost地址
localPort = 22                     # 客户端C SSH监听端口,默认是22,通常都不用改
remotePort = 6000                  # 需要在服务端B上请求开通的监听端口,很关键,这个端口是给登录方A用的
  • localIPlocalPort配置为需要从公网访问的内网服务C的地址和端口。
  • remotePort 表示在 frp 服务端B监听的端口,访问此端口的流量将被转发到本地服务的相应端口,一定要注意公网服务端B的端口防火墙是否开启!!!。

3.3 启动 frps 和 frpc

  一定要先启动公网服务端B,在启动客户端C,不然C的启动会失败(因为连不上B)。
1.通过命令启动服务端Bfrps服务程序:

# 启动frps
sudo systemctl start frps

2.通过命令查看服务端frps运行状态:

# 查看frps状态
sudo systemctl status frps

结果如下则表示frps启动成功。
在这里插入图片描述
3.通过命令启动客户端Cfrpc服务程序:

# 启动frpc
sudo systemctl start frpc

4.通过命令查看客户端Cfrpc运行状态:

# 查看frpc状态
sudo systemctl status frpc

结果如下则表示frpc启动成功。
在这里插入图片描述
备注:只要客户端能启动成功,就说明连上了服务端B,就说明B和C之间的通信信道是打通的!!!

四 .一切就绪,执行测试

  在客户端和服务端程序都按照上述步骤启动成功后,就说明客户端C借助服务端B完成了内网穿透功能,接下来就可以在需要访问的机器A上进行远程SSH登录,访问局域网主机C,在A上执行以下程序:

ssh -p 6000 username@124.156.15.247    

注意,这里的6000是在frpc.toml中设置的服务端B监听端口,username是C的用户名,而不是B的,IP填的是B的公网IP(124.156.15.247)。由此完成B将端口6000的请求转发给C,完成内网穿透下的SSH登录!!!

五 .补充:测试网络端口工具

  可以通过一些端口或者网络命令来测试刚刚设置的一些网络端口是否能正常工作(6000,7000),包括:

sudo lsof -i:端口号   # 测试端口是否处在监听状态
netstat -tunlp |grep 端口号 # 用于查看指定的端口号的进程情况
telnet ip 端口号 # 用于测试网络端口是否可达

一些测试实例如下:
在这里插入图片描述
在这里插入图片描述
通过网络端口测试,可以辅助我们查找哪些端口没打开,方便我们查找问题,一定得学会用哦。

六.参考链接

  • https://gofrp.org/zh-cn/docs/overview/
  • https://blog.csdn.net/jiuweideqixu/article/details/120167410

相关文章:

  • Spring Boot整合Redis的高效数据缓存实践
  • 《30天自制操作系统》 第一周(D1-D7) 笔记
  • GraphicsMagick 的 OpenCL 开发记录(二十五)
  • Vue2 - keep-alive 作用和原理
  • Sql server强制走索引
  • 【工具变量】中国各省市级是否属于“知识产权示范区”匹配数据(2010-2024年)
  • 强化学习 - Trust Region Policy Optimization (TRPO)
  • 2、互信息(Mutual Information)
  • CSS探索浏览器兼容性
  • 【C++干货铺】C++中的IO流和文件操作
  • Java基础知识-异常
  • Delphi 7 IdHTTP POST 中文乱码得解决
  • k8s实例
  • 【Linux 基础】常用基础指令(上)
  • Impala依赖组件的客户端源码下载
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【5+】跨webview多页面 触发事件(二)
  • Akka系列(七):Actor持久化之Akka persistence
  • FineReport中如何实现自动滚屏效果
  • JS函数式编程 数组部分风格 ES6版
  • k8s如何管理Pod
  • Netty源码解析1-Buffer
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Shadow DOM 内部构造及如何构建独立组件
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 编写符合Python风格的对象
  • 工程优化暨babel升级小记
  • 猴子数据域名防封接口降低小说被封的风险
  • 后端_ThinkPHP5
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我的业余项目总结
  • 移动端解决方案学习记录
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Linux权限管理(week1_day5)--技术流ken
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###C语言程序设计-----C语言学习(6)#
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (33)STM32——485实验笔记
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (k8s中)docker netty OOM问题记录
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (理论篇)httpmoudle和httphandler一览
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)3D模板阴影原理
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)虚函数剖析
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 中的路径问题