前言
前段时间,某云厂商活动,99购买了1台2核2G的云服务器,买了之后,发现貌似什么都跑不了… 只能搭建博客 跑跑docker emmmm…
与其吃灰,不过发现网速还行(或许是没怎么用上),但我本地还有2台台式机(8C32G),我可以使用Vmware虚拟机,然后就想到了frp,就网上扒拉扒拉搜文档,然后就形成了这篇笔记
frp 介绍
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
通过在具有公网 IP 的节点上部署 frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性(介绍来自官网):
- 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
- TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
- 代理组间的负载均衡。
- 端口复用:多个服务可以通过同一个服务端端口暴露。
- P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
- 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。
- 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
- 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。
frp ssh原理
frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。
本次测试版本及服务器IP
-
frp版本:frp_0.58.0_linux_amd64 (需要根据操作系统和硬件版本选择) -
go版本:go version go1.22.3 linux/amd64 (采用go语言编写,所以需要安装go) -
服务器:本机192.168.31.102 (本地虚拟机)、云服务器8.137.99.4(云服务器公网IP) - 步骤1:Go安装(如已安装,则跳过Go安装步骤):
参考文档:https://go.dev/doc/install#requirements
1.Download go1.22.3.linux-amd64.tar.gz
- 2.Remove any previous Go installation by deleting the /usr/local/go folder (if it exists), then extract the archive you just downloaded into /usr/local, creating a fresh Go tree in /usr/local/go:
local/go && tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz rm -rf /usr/
(You may need to run the command as root or through sudo).
Do not untar the archive into an existing /usr/local/go tree. This is known to produce broken Go installations.
3.Add /usr/local/go/bin to the PATH environment variable.
You can do this by adding the following line to your $HOME/.profile or /etc/profile (for a system-wide installation):
export PATH=$PATH:/usr/local/go/bin
Note: Changes made to a profile file may not apply until the next time you log into your computer. To apply the changes immediately, just run the shell commands directly or execute them from the profile using a command such as source $HOME/.profile.
For example:
- Verify that you’ve installed Go by opening a command prompt and typing the following command:
go version
4.Confirm that the command prints the installed version of Go.
[ ]
go version go1.22.3 linux/amd64
步骤2:frp安装
2.1 下载frp_0.58.0_linux_amd64.tar.gz 后,上传到两台服务器,并解压
以本机192.168.31.102 (本地虚拟机)为例子:
解压frp_0.58.0_linux_amd64.tar.gz到/usr/local/
tar -C /usr/local/ -zxf frp_0.58.0_linux_amd64.tar.gz
步骤2:frp安装
2.1 下载frp_0.58.0_linux_amd64.tar.gz 后,上传到两台服务器,并解压
以本机192.168.31.102 (本地虚拟机)为例子:
解压frp_0.58.0_linux_amd64.tar.gz到/usr/local/
tar -C /usr/local/ -zxf frp_0.58.0_linux_amd64.tar.gz
同理下载安装包到云服务器8.137.99.4(云服务器公网IP)并解压到/usr/local/
2.2 在具有公网 IP 的机器上部署 frps (服务端)
部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:
[common]
# 这个默认端口是7000,就是客户端和服务端通信的,不是你转发的那个端口
# 如果这个要改了,客户端的7000也要改成和这里一样。
bind_port = 7000
# 这个是frp的web管理控制台的用户名密码和登录端口
dashboard_user = admin
dashboard_pwd = Passwdxxx_define
dashboard_port = 6080
# 这个token之后在客户端会用到,相当于客户端登录服务器端,毕竟这个东西不能随便给人用,自己随便输入一串字符串就行
#token = IFYOUWANTTOKOWN
# 心跳连接:必须得有,frp 0.43.0版本如果不加,60秒就会自动断开连接!
# 服务器就加这一条,客户机每台都要加。
heartbeat_timeout = 30
使用systemd启动服务
在 Linux 系统下,使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。
以下是具体的操作步骤:
1.安装 systemd(如有相关服务则无需安装)
如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd
# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
2.创建 frps.service 文件
使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。
sudo vim /etc/systemd/system/frps.service
写入内容
[Unit]
# 服务名称,可自定义
Description = frps server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
# ExecStart = /path/to/frps -c /path/to/frps.toml
ExecStart = /usr/local/frp_0.58.0_linux_amd64/frps -c /usr/local/frp_0.58.0_linux_amd64/frps.toml
[Install]
WantedBy = multi-user.target
一键启动并开启自启动
systemctl enable --now frps.service
查看状态
[root@aliyun_data01 frp_0.58.0_linux_amd64]# systemctl status frps.service
● frps.service - frps server
Loaded: loaded (/etc/systemd/system/frps.service; enabled; vendor preset: disabled)
Active: active (running) since 二 2024-05-14 21:17:02 CST; 1h 17min ago
Main PID: 23726 (frps)
CGroup: /system.slice/frps.service
└─23726 /usr/local/frp_0.58.0_linux_amd64/frps -c /usr/local/frp_0.58.0_linu
frps部署完成
2.3 在云主机映射对应端口
云主机 -> 安全组 -> 入方向 -> 手动添加
增加所需要的端口,目前我们frp server使用的有bind_port 7000端口、dashboard_port 6080端口、后续SSH 10022端口(预设),所以至少需要开放这三个端口(具体方法如不会可咨询云厂商)
- 添加完成后,即可通过云服务器8.137.99.4(云服务器公网IP)的6080端口访问web url
访问地址:8.137.99.4:6080 (需要换成自己的地址),输入账号密码admin/Passwdxxx_define
如图所示:
- 即可通过web url管理界面查看目前情况
2.3 在需要被访问的内网机器上部署 frpc (客户端)
部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置:
[common]
# 你frp服务器的公网ip地址
server_addr = 8.137.99.4
server_port = 7000
# token与frps.ini 相同 可以先不用
# token = wertyoqazxcvbnjhgfcvbn
# 这里取名随意,一般有意义就行
[ssh]
# 穿透协议类型,可选:tcp,udp,http,https,stcp,xtcp,这个设置之前必须自行搞清楚应该是什么
type = "tcp"
# 你当前内网服务器的网卡IP地址,不要用127.0.0.1
local_ip = "192.168.31.102"
# 你要转发的服务端口
local_port = 22
# 你要映射到公网上的那个端口
remote_port = 10022
# 服务器与客户机之间的心跳连接:如果没有,每隔60秒就会自动断开连接!!!
# heartbeat_timeout = 90
- localIP 和 localPort 配置为需要从公网访问的内网服务的地址和端口。
- remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。
使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frpc.service 文件,用于配置 frps 服务。
vim /etc/systemd/system/frpc.service
#写入内容 1,1 全部
# 在frpc.service里添加以下内容
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
#
[Service]
Type=simple
# # 启动服务的命令(此处写你的frpc的实际安装目录)
ExecStart = /usr/local/frp_0.58.0_linux_amd64/frpc -c /usr/local/frp_0.58.0_linux_amd64/frpc.toml
#
[Install]
WantedBy=multi-user.target
启动frpc.service服务
systemctl daemon-reload
systemctl enable --now frpc
systemctl status frpc
- 启动完成后,则ssh frp内网穿透搭建完成
2.4 SSH验证使用
web管理平台查看状态:
- 证使用:
ssh -oPort=6000 root@x.x.x.x
frp 会将请求 8.137.99.4:6000 的流量转发到内网机器的 22 端口。
ssh -o Port=6000 root@8.137.99.4