目录
- [一. frp简介](#一. frp简介)
- [二. 服务器端提前准备](#二. 服务器端提前准备)
-
- [2.1 下载](#2.1 下载)
- [2.2 创建`frps`命令的目录,并配置](#2.2 创建
frps命令的目录,并配置) - [2.3 创建用来运行frps的用户和组](#2.3 创建用来运行frps的用户和组)
- [2.4 创建`frps`命令的配置文件夹](#2.4 创建
frps命令的配置文件夹) - [2.5 创建`frps`命令的配置文件](#2.5 创建
frps命令的配置文件)
- [三. 服务器端配置](#三. 服务器端配置)
-
- [3.1 简单配置测试](#3.1 简单配置测试)
- [3.2 配置为系统服务](#3.2 配置为系统服务)
- [3.3 caddy配置反向代理](#3.3 caddy配置反向代理)
- [四. 客户端](#四. 客户端)
-
- [4.1 下载](#4.1 下载)
- [4.2 配置](#4.2 配置)
- [4.3 启动](#4.3 启动)
-
- [4.3.1 客户端在8080端口启动服务](#4.3.1 客户端在8080端口启动服务)
- [4.3.2 客户端启动sshd服务](#4.3.2 客户端启动sshd服务)
一. frp简介
🔷frp(Fast Reverse Proxy)是一个高性能的反向代理工具,主要用于内网穿透。frp可以帮助将内网的服务暴露到公网,使得外部用户可以访问内网中的服务。
主要特点:
- 高性能:使用 Go 语言编写,性能优秀
- 跨平台:支持 Windows、Linux、macOS 等多种操作系统
- 配置简单:通过简单的配置文件即可完成设置
- 多种协议支持:支持 TCP、UDP、HTTP、HTTPS 等协议
- 安全传输:支持 TLS 加密传输
- 灵活扩展:支持多种插件和扩展功能
FRP 由两部分组成:
- frps(FRP Server):运行在公网服务器上
- frpc(FRP Client):运行在内网机器上
bash
Internet
│
│
https://域名.com
│
▼
┌─────────────┐
│caddy或nginx │
│ :443 │
└──────┬──────┘
│
reverse_proxy反向代理
│
▼
┌─────────────┐
│ frps服务端 │
│ 127.0.0.1 │
│ :18080 │
└──────┬──────┘
│
FRP Tunnel通道
│
▼
┌─────────────┐
│ frpc客户端 │
│ Windows或nas│
└──────┬──────┘
│
▼
127.0.0.1:8080
│
▼
内网服务
二. 服务器端提前准备
2.1 下载
- 查看系统架构 → x86_64:下载Linux amd64 版本
bash
[ec2-user@ip-172-31-25-58 ~]$ uname -m
x86_64
[ec2-user@ip-172-31-25-58 ~]$
- 截止到
2026/09/09,最新版本为v0.71.0
bash
cd /tmp
curl -LO https://github.com/fatedier/frp/releases/download/v0.71.0/frp_0.71.0_linux_amd64.tar.gz
tar -xzf frp_0.71.0_linux_amd64.tar.gz
frps: 是服务端程序frpc: 是客户端程序
bash
[ec2-user@ip-172-31-25-58 tmp]$ ls -l frp_0.71.0_linux_amd64/
-rw-r--r--. 1 ec2-user ec2-user 11358 Aug 14 15:35 LICENSE
-rwxr-xr-x. 1 ec2-user ec2-user 16593080 Aug 14 15:31 frpc
-rw-r--r--. 1 ec2-user ec2-user 142 Aug 14 15:35 frpc.toml
-rwxr-xr-x. 1 ec2-user ec2-user 20332728 Aug 14 15:31 frps
-rw-r--r--. 1 ec2-user ec2-user 16 Aug 14 15:35 frps.toml
[ec2-user@ip-172-31-25-58 tmp]$
2.2 创建frps命令的目录,并配置
- 创建存放
frps命令的目录
bash
sudo mkdir -p /opt/frp
sudo cp /tmp/frp_*/frps /opt/frp/
- 配置权限
bash
sudo chown root:root /opt/frp/frps
sudo chmod 755 /opt/frp/frps
bash
[ec2-user@ip-172-31-25-58 ~]$ ls -l /opt/frp/frps
-rwxr-xr-x. 1 root root 20332728 Sep 9 08:36 /opt/frp/frps
[ec2-user@ip-172-31-25-58 ~]$
2.3 创建用来运行frps的用户和组
- frp用户是一个专门用来运行frp服务的系统用户,没有home目录
- 禁止使用frp用户使用shell进行登录
bash
sudo groupadd --system frp
sudo useradd --system --gid frp --no-create-home --shell /sbin/nologin frp
2.4 创建frps命令的配置文件夹
bash
sudo mkdir -p /etc/frp
sudo chown root:frp /etc/frp
sudo chmod 750 /etc/frp
bash
[ec2-user@ip-172-31-25-58 ~]$ ls -ld /etc/frp/
drwxr-x---. 2 root frp 23 Sep 9 08:40 /etc/frp/
[ec2-user@ip-172-31-25-58 ~]$
2.5 创建frps命令的配置文件
bash
sudo touch /etc/frp/frps.toml
sudo chown root:frp /etc/frp/frps.toml
####### 640 #######
# root用户:可以读写
# frp组:可以读
# 其他:无权限
###################
sudo chmod 640 /etc/frp/frps.toml
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo ls -l /etc/frp/frps.toml
-rw-r-----. 1 root frp 99 Sep 9 08:40 /etc/frp/frps.toml
[ec2-user@ip-172-31-25-58 ~]$
三. 服务器端配置
3.1 简单配置测试
- 生成随机字符串
bash
[ec2-user@ip-172-31-25-58 ~]$ openssl rand -base64 32
ZmSJ/wnLkFCOyqh9XaXKV6UdWYpL2lvxSG5V/E1tmno=
[ec2-user@ip-172-31-25-58 ~]$
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo cat /etc/frp/frps.toml
# frp服务要绑定的端口
bindPort = 7000
auth.method = "token"
auth.token = "ZmSJ/wnLkFCOyqh9XaXKV6UdWYpL2lvxSG5V/E1tmno="
[ec2-user@ip-172-31-25-58 ~]$
- 简单测试,服务端可以正常运行
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo /opt/frp/frps -c /etc/frp/frps.toml
2026-09-09 08:47:13.927 [I] [frps/root.go:115] frps uses config file: /etc/frp/frps.toml
2026-09-09 08:47:14.094 [I] [server/service.go:253] frps tcp listen on 0.0.0.0:7000
2026-09-09 08:47:14.094 [I] [frps/root.go:124] frps started successfully
- 7000端口也正常被占用了
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo ss -lntp | grep 7000
LISTEN 0 4096 *:7000 *:* users:(("frps",pid=547265,fd=4))
[ec2-user@ip-172-31-25-58 ~]$
3.2 配置为系统服务
- 配置
frps系统服务
bash
[ec2-user@ip-172-31-25-58 ~]$ sudo cat /etc/systemd/system/frps.service
[Unit]
# 服务描述:FRP 服务器(用于内网穿透的反向代理服务)
Description=FRP Server
# 官方文档地址
Documentation=https://gofrp.org/
# 在网络在线后再启动该服务
After=network-online.target
# 声明依赖 network-online.target,确保网络完全就绪
Wants=network-online.target
[Service]
# 服务类型:
# simple 表示 ExecStart 启动的进程就是主进程
Type=simple
# 以 frp 用户身份运行服务(安全考虑,避免使用 root)
User=frp
# 以 frp 用户组身份运行服务
Group=frp
# 启动命令:
# 运行 frps 服务器程序
# -c 指定配置文件路径
ExecStart=/opt/frp/frps -c /etc/frp/frps.toml
# 服务异常退出时自动重启
Restart=on-failure
# 重启间隔时间(秒)
RestartSec=5s
# 提高文件描述符限制,避免高并发时文件句柄不够用
LimitNOFILE=1048576
[Install]
# 指定在哪个运行级别启动(multi-user.target 表示多用户命令行模式)
WantedBy=multi-user.target
[ec2-user@ip-172-31-25-58 ~]$
frps管理的相关命令
bash
sudo systemctl start frps
sudo systemctl stop frps
sudo systemctl restart frps
sudo systemctl status frps
# 实时查看日志
sudo journalctl -u frps -f
3.3 caddy配置反向代理
uri strip_prefix /frp:- Caddy 的路径重写功能,用于移除 URL 中的指定前缀,让后端服务能正确识别路径。
- 相当于访问
https://fengyehong.dpdns.org/frp/→ip地址:18080
bash
[ec2-user@ip-172-31-25-58 ~]$ cat /etc/caddy/conf.d/fengyehong.dpdns.org.conf
fengyehong.dpdns.org {
encode gzip
# frp内网穿透
handle /frp/* {
uri strip_prefix /frp
reverse_proxy 127.0.0.1:18080
}
log {
output file /var/log/caddy/fengyehong_access.log {
roll_size 60mb
roll_keep 3
roll_keep_for 7d
}
}
}
[ec2-user@ip-172-31-25-58 ~]$
四. 客户端
4.1 下载
- 下载服务器对应的客户端版本

4.2 配置
- 解压后,找到
frpc.toml的配置文件后,进行如下配置 - ⚡注意:
- 服务器侧已经使用caddy进行了端口代理,所有不需要打开
18080端口 - 如果想要远程ssh到本地电脑的话,服务器侧的
10022端口还是需要打开的
- 服务器侧已经使用caddy进行了端口代理,所有不需要打开
bash
# 服务器地址与端口号
serverAddr = "服务器ip地址"
serverPort = 7000
# 服务器认证token
auth.method = "token"
auth.token = "ZmSJ/wnLkFCOyqh9XaXKV6UdWYpL2lvxSG5V/E1tmno="
# ================ Web服务 ================
[[proxies]]
name = "windows-web"
type = "tcp"
# 本机客户端内部ip和端口号
localIP = "127.0.0.1"
localPort = 8080
# 服务器端口号
remotePort = 18080
# ================ SSH服务 ================
[[proxies]]
name = "windows-ssh"
type = "tcp"
# 本机客户端内部ip和端口号
localIP = "127.0.0.1"
localPort = 22
# 服务器端口号
remotePort = 10022
4.3 启动
- 通过
.\frpc.exe -c .\frpc.toml启动客户端

4.3.1 客户端在8080端口启动服务
- 客户端通过
python3 -m http.server 8080启动建议的程序 - 然后外部网络就可以使用域名来访问内网提供的服务了

4.3.2 客户端启动sshd服务
🔷通过管理员权限打开Powershell
- 获取windows端的ssh服务的名称 →
sshd
powershell
PS C:\WINDOWS\system32> Get-Service | Where-Object Name -like '*ssh*'
Status Name DisplayName
------ ---- -----------
Stopped ssh-agent OpenSSH Authentication Agent
Stopped sshd OpenSSH SSH Server
- 查看服务的状态 → 停止的状态
powershell
PS C:\WINDOWS\system32> Get-Service sshd
Status Name DisplayName
------ ---- -----------
Stopped sshd OpenSSH SSH Server
- 启动sshd服务之后,服务的状态 → 运行中的状态
powershell
PS C:\WINDOWS\system32> Start-Service sshd
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> Get-Service sshd
Status Name DisplayName
------ ---- -----------
Running sshd OpenSSH SSH Server
- windows上的sshd服务启动之后,就可以通过ssh远程访问windows了
