frp内网穿透部署

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

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

[TOC]

[!NOTE]

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

资源:...


1.frp 的安装运行

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

[!CAUTION]

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

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

shell 复制代码
# 安装 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
shell 复制代码
# 查看 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" 上进行处理)
shell 复制代码
# 运行 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 来管理服务端或客户端的。

shell 复制代码
# public_server
$ vim frps.toml
$ cat frps.toml
bindPort = 7000 # 保持不变即可, 不过注意 public_server 服务器需要开启这个端口
shell 复制代码
# 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 服务,提高可用性。

shell 复制代码
# 在 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
shell 复制代码
# 在 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 管理指令来进行管理。

shell 复制代码
# 管理 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
shell 复制代码
# 管理 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,求求惹(๑> <)☆♡~

相关推荐
yaosheng_VALVE19 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
Roc-xb2 天前
Eclipse2024无法创建Dynamic Web project解决方法
java·eclipse
玖疯子3 天前
解释 RESTful API,以及如何使用它构建 web 应用程序。
python·eclipse·restful
.生产的驴4 天前
SpringBoot 开启热部署 项目热启动 一键调试无需 无需重启
java·运维·开发语言·spring boot·后端·spring·eclipse
难以触及的高度9 天前
Hadoop删除HDFS文件
hadoop·hdfs·eclipse
刘飞强丶Conan9 天前
Eclipse MAT(Memory Analyzer Tool) 使用手册
java·ide·eclipse
开发者联盟league10 天前
eclipse rcp-创建rcp-创建target
java·ide·eclipse
debug_cat11 天前
Android断点调试异常Please close other application using ADB: Monitor, DDMS,Eclipse
android·adb·eclipse
web1511736022311 天前
怎样使用Eclipse创建Maven的Java WEB 项目
java·前端·eclipse
MXsoft61813 天前
Hadoop系统-中间件监控
java·ide·eclipse