文章目录
-
- [一、FRP 基础概念](#一、FRP 基础概念)
- 二、系统架构与角色定位
-
- [2.1 本教程会演示两种 SSH 访问方式(先看这个再往下做)](#2.1 本教程会演示两种 SSH 访问方式(先看这个再往下做))
- [三、下载与解压 FRP](#三、下载与解压 FRP)
-
- [0. 解压后目录里都有啥?需要保留/删除什么?(重要)](#0. 解压后目录里都有啥?需要保留/删除什么?(重要))
- [1. 在 B 服务器(CentOS)上下载 FRP Server](#1. 在 B 服务器(CentOS)上下载 FRP Server)
- [2. 在 C 服务器(Ubuntu)上下载 FRP Client](#2. 在 C 服务器(Ubuntu)上下载 FRP Client)
- [四、配置 FRP](#四、配置 FRP)
-
- [1. 配置 frps(在 B 服务器)](#1. 配置 frps(在 B 服务器))
- [2. 配置 frpc(在 C 服务器)](#2. 配置 frpc(在 C 服务器))
- [3. 端口关系说明](#3. 端口关系说明)
- [4. 新增另一个目标服务器 D(第二台内网 Ubuntu)](#4. 新增另一个目标服务器 D(第二台内网 Ubuntu))
-
- [4.0 两种方案怎么选?](#4.0 两种方案怎么选?)
- [4.1 在 D 上部署 frpc](#4.1 在 D 上部署 frpc)
- [4.2 方案 A:在 D 上配置 `frpc.toml`(示例:把 D 的 SSH 暴露到 B:6001)](#4.2 方案 A:在 D 上配置
frpc.toml(示例:把 D 的 SSH 暴露到 B:6001)) - [4.3 在 B 上放行端口](#4.3 在 B 上放行端口)
- [4.4 方案 B(推荐):使用 STCP,把 D 的 SSH "隐藏"起来](#4.4 方案 B(推荐):使用 STCP,把 D 的 SSH “隐藏”起来)
-
- [4.4.1 在 D 上配置 `frpc.toml`(STCP Server)](#4.4.1 在 D 上配置
frpc.toml(STCP Server)) - [4.4.2 在 A(Windows)上准备 frpc(STCP Visitor)](#4.4.2 在 A(Windows)上准备 frpc(STCP Visitor))
- [4.4.3 方案 B 需要开放哪些端口?](#4.4.3 方案 B 需要开放哪些端口?)
- [4.4.1 在 D 上配置 `frpc.toml`(STCP Server)](#4.4.1 在 D 上配置
- 五、配置安全组与防火墙
-
- [1. 在 B 服务器(CentOS)上配置防火墙](#1. 在 B 服务器(CentOS)上配置防火墙)
- [2. 在 C 服务器(Ubuntu)上配置防火墙](#2. 在 C 服务器(Ubuntu)上配置防火墙)
- [3. 安全组配置(如果 B 服务器在云服务商上)](#3. 安全组配置(如果 B 服务器在云服务商上))
- [六、设置 FRP 为系统服务](#六、设置 FRP 为系统服务)
-
- [1. 在 B 服务器(CentOS)上设置 frps 为系统服务](#1. 在 B 服务器(CentOS)上设置 frps 为系统服务)
- [2. 在 C / D 服务器(Ubuntu)上设置 frpc 为系统服务](#2. 在 C / D 服务器(Ubuntu)上设置 frpc 为系统服务)
- [七、在 A(Windows)访问内网服务器的服务(C / D)](#七、在 A(Windows)访问内网服务器的服务(C / D))
-
- [1. 访问 C 服务器的 SSH](#1. 访问 C 服务器的 SSH)
- [1.1 访问 D 服务器的 SSH(新增 D 的示例)](#1.1 访问 D 服务器的 SSH(新增 D 的示例))
- 八、删除所有配置
-
- [1. 停止并禁用系统服务](#1. 停止并禁用系统服务)
-
- [在 B 服务器(CentOS)上:](#在 B 服务器(CentOS)上:)
- [在 C 服务器(Ubuntu)上:](#在 C 服务器(Ubuntu)上:)
- [在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):](#在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):)
- [2. 删除 FRP 文件和目录](#2. 删除 FRP 文件和目录)
-
- [在 B 服务器(CentOS)上:](#在 B 服务器(CentOS)上:)
- [在 C 服务器(Ubuntu)上:](#在 C 服务器(Ubuntu)上:)
- [在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):](#在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):)
- [3. 移除防火墙规则](#3. 移除防火墙规则)
-
- [在 B 服务器(CentOS)上:](#在 B 服务器(CentOS)上:)
- [在 C 服务器(Ubuntu)上:](#在 C 服务器(Ubuntu)上:)
- [4. 移除安全组规则(如果适用)](#4. 移除安全组规则(如果适用))
- 九、注意事项
- 十、完整示例配置文件
-
- [frps.toml(B 服务器)](#frps.toml(B 服务器))
- [frpc.toml(C 服务器)](#frpc.toml(C 服务器))
- [frpc.toml(D 服务器,新增示例)](#frpc.toml(D 服务器,新增示例))
- [frpc.toml(D 服务器,STCP 更安全示例)](#frpc.toml(D 服务器,STCP 更安全示例))
- [frpc.toml(A 本地,STCP Visitor 示例)](#frpc.toml(A 本地,STCP Visitor 示例))
- 十一、总结
一、FRP 基础概念
FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透,可以将内网中的服务暴露到公网。其核心组件包括:
- frps(FRP Server):部署在有公网 IP 的服务器上,负责管理和转发客户端的连接。
- frpc(FRP Client) :部署在需要暴露服务的内网机器上,通过
frps进行连接和转发。
二、系统架构与角色定位
- A:本地 Windows 机器(访问端),通过中转服务器访问内网目标服务器(C / D)。
- B :中转服务器,运行 CentOS,IP 为
117.62.206.56,部署frps。 - C :目标服务器 1(Ubuntu),部署
frpc,需要将其服务通过frps暴露给 A(示例使用tcp + remotePort)。 - D :目标服务器 2(Ubuntu),同样部署
frpc,需要将其服务通过frps暴露给 A(示例使用更安全的stcp)。
2.1 本教程会演示两种 SSH 访问方式(先看这个再往下做)
为了让你能按自己的场景选择,本教程把"通过 B 访问内网 SSH"分成两种方案,并分别用 C/D 做演示:
-
方案 A(C 演示):
tcp + remotePort- 访问方式 :A 直接连
B的公网IP:remotePort(例如ssh -p 6000 user@B_IP) - 特点:最直观、只要有 SSH 客户端就能用;但 B 上会多一个对公网可见端口(remotePort)
- 访问方式 :A 直接连
-
方案 B(D 演示,更安全):
stcp- 访问方式 :A 先运行
frpcvisitor,把 D 的 SSH 映射到本机端口(例如127.0.0.1:22022),再ssh -p 22022 user@127.0.0.1 - 特点 :B 不需要为 D 开放 SSH 的对外端口,公网扫描不到入口;但 A 需要额外运行一个
frpc(visitor)
- 访问方式 :A 先运行
怎么选?
- 你希望"只用 SSH 客户端、随时随地临时连接"(但要接受公网端口暴露与更严格的防火墙策略)→ 选 方案 A
- 你经常换公网 IP、且更在意不暴露 SSH 入口(电脑相对固定,能跑 visitor)→ 选 方案 B
三、下载与解压 FRP
0. 解压后目录里都有啥?需要保留/删除什么?(重要)
你下载的 frp_0.61.0_linux_amd64.tar.gz 是 完整发行包,里面默认就同时包含:
frps+frps.toml:服务端程序与示例配置(用于公网中转服务器 B)frpc+frpc.toml:客户端程序与示例配置(用于内网目标服务器 C/D)LICENSE:许可证文件(可保留)
所以你在 C/D 上解压后看到 frps/frps.toml 是正常的,只是 C/D 通常不会用到。
各机器建议保留哪些文件?
-
B(公网中转,跑 frps)
- 必须 :
/usr/local/frp/frps、/usr/local/frp/frps.toml - 可选 :
LICENSE、logs/ - 通常可删除 (避免误启动):
/usr/local/frp/frpc、/usr/local/frp/frpc.toml
- 必须 :
-
C / D(内网目标机,跑 frpc)
- 必须 :
/usr/local/frp/frpc、/usr/local/frp/frpc.toml - 可选 :
LICENSE、logs/ - 通常可删除 (避免误启动):
/usr/local/frp/frps、/usr/local/frp/frps.toml
- 必须 :
1. 在 B 服务器(CentOS)上下载 FRP Server
bash
# 登录到 B 服务器
ssh your_user@117.62.206.56
# 下载 FRP
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
# 解压压缩包
tar -zxvf frp_0.61.0_linux_amd64.tar.gz
# 移动到 /usr/local/frp 目录
sudo mkdir -p /usr/local/frp
sudo mv frp_0.61.0_linux_amd64/* /usr/local/frp/
# 创建日志目录(与后续 log.to 路径一致)
sudo mkdir -p /usr/local/frp/logs
# 切换到 frp 目录
cd /usr/local/frp
# (可选)只做 SSH 穿透时,建议删除 frpc,避免误启动
sudo rm -f frpc frpc.toml
在 B 服务器上的目录结构示例(仅保留 frps)如下:
.
├── /usr/local/frp/
│ ├── frps
│ ├── frps.toml
│ └── logs/
│ └── frps.log
2. 在 C 服务器(Ubuntu)上下载 FRP Client
bash
# 登录到 C 服务器
ssh your_user@your_ubuntu_server_ip
# 下载 FRP
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
# 解压压缩包
tar -zxvf frp_0.61.0_linux_amd64.tar.gz
# 移动到 /usr/local/frp 目录
sudo mkdir -p /usr/local/frp
sudo mv frp_0.61.0_linux_amd64/* /usr/local/frp/
# 创建日志目录(与后续 log.to 路径一致)
sudo mkdir -p /usr/local/frp/logs
# 切换到 frp 目录
cd /usr/local/frp
# (可选)只做 SSH 穿透时,建议删除 frps,避免误启动
sudo rm -f frps frps.toml
在 C 服务器上的目录结构示例(仅保留 frpc)如下:
.
├── /usr/local/frp/
│ ├── frpc
│ ├── frpc.toml
│ └── logs/
│ └── frpc.log
四、配置 FRP
1. 配置 frps(在 B 服务器)
在 /usr/local/frp 目录下创建或编辑 frps.toml 配置文件:
toml
bindAddr = "0.0.0.0"
bindPort = 7000
# Dashboard(可选)
# - 默认只允许本机访问(更安全):webServer.addr = "127.0.0.1"
# - 如果确实需要公网访问,再改成 "0.0.0.0" 并配合防火墙/安全组限制来源 IP
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "请改成强密码"
# 日志
log.to = "/usr/local/frp/logs/frps.log"
log.level = "info"
log.maxDays = 3
# 鉴权(强烈建议启用;frpc 端必须使用相同 token)
auth.method = "token"
auth.token = "请替换成随机长字符串(C/D/A 都要一致)"
改完 frps.toml 后,在 B 上执行(让配置生效):
bash
sudo systemctl restart frps
sudo systemctl status frps
如果你修改了
auth.token,所有连接到该 frps 的机器(C/D/A)也必须同步修改并重启各自的 frpc,否则会出现 token 不匹配导致登录失败。
关于 Dashboard(管理页面)是什么?(可选)
当你配置了 webServer.port 后,frps 会额外启动一个 Web 管理页面 (通常称为 Dashboard)。它的作用是让你在浏览器里查看 frps 的运行状态,例如:
- 当前有哪些客户端(frpc)连上来了
- 当前有哪些代理(proxies)在工作、对应的端口是什么
- 连接数、流量等运行信息(用于排查"为什么连不上/端口不通")
访问方式通常是:在浏览器打开 http://B的IP:7500(或你自定义的端口)。访问时会弹出登录框,账号密码来自 webServer.user/webServer.password。
安全建议(强烈建议按此做)
- 默认只监听本机 :保持
webServer.addr = "127.0.0.1",不要直接暴露到公网。 - 如果你需要在本地 A 查看 Dashboard,可以使用 SSH 转发临时访问(不用开放 7500):
bash
ssh -L 7500:127.0.0.1:7500 your_user@117.62.206.56
然后在本地浏览器访问 http://127.0.0.1:7500。
说明:本文档以
frp v0.61.0的 TOML 配置为准(字段多为驼峰/点号分层)。不要把旧版 INI 风格(如[common]、bind_port)写进.toml,否则可能不生效或启动失败。
2. 配置 frpc(在 C 服务器)
在 /usr/local/frp 目录下创建或编辑 frpc.toml 配置文件:
toml
serverAddr = "117.62.206.56" # 此处换成自己中转服务器B的IP即可
serverPort = 7000
# 日志
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
# 鉴权(必须与 frps.toml 一致)
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
改完 C 的 frpc.toml 后,在 C 上执行(让配置生效):
bash
sudo systemctl restart frpc
sudo systemctl status frpc
如果你修改了
auth.token,需要与 B 的frps.toml保持一致,否则 frpc 会登录失败。
3. 端口关系说明
- frps 控制端口(必须):7000(C 的 frpc 主动连到 B 的这个端口)
- 对外服务端口(按需) :例如 6000(这是你在
frpc.toml里配置的remotePort,A 访问的是它) - Dashboard 端口(可选) :7500(由
webServer.port决定;是否开放取决于你是否需要远程访问) - STCP 本地访问端口(按需) :例如 22022(仅当你使用
stcp并在 A 上配置 visitor;A 实际连接的是127.0.0.1:22022)
4. 新增另一个目标服务器 D(第二台内网 Ubuntu)
当你已经用 B 访问 C 后,如果还想通过同一个中转服务器 B 再访问另一台内网服务器 D,做法是:D 再部署一份 frpc。下面提供两种方案:
- 方案 A(简单直观) :
tcp + remotePort(需要在 B 上对公网开放一个端口,例如 6001) - 方案 B(更安全,推荐) :
stcp(B 不对公网开放 D 的 SSH 端口;但需要 A 本地也运行 frpc 的 visitor)
4.0 两种方案怎么选?
两种方案的区别与选择建议已在「2.1 本教程会演示两种 SSH 访问方式」中说明,这里不再重复。
4.1 在 D 上部署 frpc
在 D 上执行以下步骤,安装 frpc 到 /usr/local/frp/:
bash
# 登录到 D 服务器
ssh your_user@your_ubuntu_server_ip
# 下载 FRP
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
# 解压压缩包
tar -zxvf frp_0.61.0_linux_amd64.tar.gz
# 移动到 /usr/local/frp 目录
sudo mkdir -p /usr/local/frp
sudo mv frp_0.61.0_linux_amd64/* /usr/local/frp/
# 创建日志目录(与后续 log.to 路径一致)
sudo mkdir -p /usr/local/frp/logs
# (可选)只做 SSH 穿透时,建议删除 frps,避免误启动
cd /usr/local/frp
sudo rm -f frps frps.toml
4.2 方案 A:在 D 上配置 frpc.toml(示例:把 D 的 SSH 暴露到 B:6001)
toml
# /usr/local/frp/frpc.toml (D 服务器)
serverAddr = "117.62.206.56"
serverPort = 7000
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001
4.3 在 B 上放行端口
- 防火墙/安全组 :除了已有的
7000与6000,再放行6001/tcp(或你为 D 选择的其它remotePort)。 - 关键规则 :不同内网服务器暴露到 B 的
remotePort不能重复,否则会端口占用/代理注册失败。
4.4 方案 B(推荐):使用 STCP,把 D 的 SSH "隐藏"起来
STCP 的思路是:不在 B 上为 D 暴露 remotePort 。D 把 SSH 注册为一个"需要密钥的内网服务",A 本地再通过 visitor 把这个服务"映射到本机端口",最后 A 只需连接 127.0.0.1:本机端口。
4.4.1 在 D 上配置 frpc.toml(STCP Server)
toml
# /usr/local/frp/frpc.toml (D 服务器,STCP server)
serverAddr = "117.62.206.56"
serverPort = 7000
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "d-ssh"
type = "stcp"
secretKey = "请替换成强随机串"
localIP = "127.0.0.1"
localPort = 22
改完 D 的 frpc.toml(STCP server)后,需要重启/重新启动 D 上的 frpc 才会生效:
- 如果你已经按第六章把 D 的 frpc 配置成了 systemd 服务,在 D 上执行:
bash
sudo systemctl restart frpc
sudo systemctl status frpc
- 如果你还没创建
frpc.service,可以先用前台方式启动验证(保持进程运行):
bash
sudo /usr/local/frp/frpc -c /usr/local/frp/frpc.toml
如果你修改了
auth.token或secretKey,还需要同步修改 A(visitor)并重启 A 的 frpc(见下一节)。
4.4.2 在 A(Windows)上准备 frpc(STCP Visitor)
你需要在 A 上也放一份 frpc(Windows 版),并创建一个 frpc.toml(仅用于 visitor)。
(1) 下载 Windows 版 FRP
你可以从 FRP 的 GitHub Release 下载(版本与服务器一致即可):
- Release 页面:
https://github.com/fatedier/frp/releases/tag/v0.61.0 - Windows 64 位压缩包(推荐):
frp_0.61.0_windows_amd64.zip
也可以直接用 PowerShell 下载并解压(示例把文件放到 C:\frp\):
powershell
mkdir C:\frp -Force
cd C:\frp
Invoke-WebRequest -Uri "https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_windows_amd64.zip" -OutFile "frp_0.61.0_windows_amd64.zip"
Expand-Archive -Path "frp_0.61.0_windows_amd64.zip" -DestinationPath "." -Force
解压后你会在目录中看到 frpc.exe(以及一些示例配置文件)。
解压后文件很多,需要删吗?(建议)
Windows 的压缩包同样是完整发行包,通常会同时包含 frpc.exe/frps.exe 以及对应的示例配置 frpc.toml/frps.toml。
-
在 A(Windows)只作为访问端(STCP visitor)时,建议保留
frpc.exefrpc.toml(改成你自己的 visitor 配置)LICENSE(可保留)
-
建议删除(不影响使用,避免误启动服务端)
frps.exefrps.toml
(2) 编辑/覆盖 frpc.toml
解压包里通常会自带一个 frpc.toml 示例文件,但它只是模板,需要按你的实际情况修改。
你可以直接编辑解压出来的 frpc.toml,也可以新建同名文件覆盖它。把下面内容保存为 C:\frp\frpc.toml(与 frpc.exe 放同一个目录更方便)。
示例:
toml
# frpc.toml (A 本地,STCP visitor)
serverAddr = "117.62.206.56"
serverPort = 7000
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[visitors]]
name = "d-ssh-visitor"
type = "stcp"
serverName = "d-ssh"
secretKey = "与 D 保持一致"
bindAddr = "127.0.0.1"
bindPort = 22022
启动 A 的 frpc 后,A 上的 127.0.0.1:22022 就等价于 "连 D 的 SSH"。
Windows 启动示例:在
frpc.exe与frpc.toml同目录下运行frpc.exe -c frpc.toml,并保持进程运行(需要连接 D 时别关闭)。
如果你修改了 A 的 frpc.toml(例如 auth.token、secretKey、bindPort),需要先停止正在运行的 frpc.exe,再重新启动一次,修改才会生效。
4.4.3 方案 B 需要开放哪些端口?
- 必须开放 :B 的
7000/tcp(frps 控制端口) - 不需要开放 :
6001/tcp(因为 STCP 不使用 remotePort)
五、配置安全组与防火墙
1. 在 B 服务器(CentOS)上配置防火墙
假设使用 firewalld:
bash
# 开放 frps 控制端口(frpc 连接用)
sudo firewall-cmd --permanent --add-port=7000/tcp
# 开放对外服务端口(remotePort:A 访问用,比如把 SSH 映射到 6000)
sudo firewall-cmd --permanent --add-port=6000/tcp
# 如果你采用「方案 A(tcp + remotePort)」新增其它内网服务器(例如 D),按需继续放行 remotePort(例如 6001)
# 如果你采用「方案 B(stcp)」则不需要对公网开放 6001
# sudo firewall-cmd --permanent --add-port=6001/tcp
# Dashboard 端口 7500(可选)
# - 如果保持 webServer.addr = "127.0.0.1"(本教程默认),则不需要对公网开放 7500
# - 只有当你把 webServer.addr 改成 "0.0.0.0" 且需要公网访问时,才按需放行
# sudo firewall-cmd --permanent --add-port=7500/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
2. 在 C 服务器(Ubuntu)上配置防火墙
假设使用 ufw:
bash
# 启用 ufw(如果未启用)
sudo ufw enable
# 允许 frpc 连接到 frps(通常不需要额外开放,因为是出站连接)
# 注意:frp 转发到本机服务一般走 127.0.0.1(如 localIP = "127.0.0.1"),
# frp 本身并不要求你在 C/D 上对外开放 22/80 入站。
# 只有当你还需要从"其他机器"直连 C/D 的 SSH/HTTP 时,才按需放行:
# sudo ufw allow 22/tcp
# sudo ufw allow 80/tcp
# 重新加载 ufw 规则
sudo ufw reload
3. 安全组配置(如果 B 服务器在云服务商上)
确保在云服务商的控制台中,为 B 服务器的安全组添加以下入站规则:
- TCP 7000:frpc 连接 frps 的控制端口(必须)
- TCP 6000:对外服务端口示例(remotePort:A 访问 SSH 用,按你实际配置增减)
- TCP 6001:对外服务端口示例(仅当你采用「方案 A(tcp + remotePort)」新增 D 时需要)
- TCP 7500 :Dashboard(仅当你把
webServer.addr改成0.0.0.0且需要公网访问时;否则无需放行) 
六、设置 FRP 为系统服务
1. 在 B 服务器(CentOS)上设置 frps 为系统服务
创建 frps.service 文件在 /etc/systemd/system/ 目录下:
bash
sudo vim /etc/systemd/system/frps.service
添加以下内容:
ini
[Unit]
Description=FRP Server Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
Restart=on-failure
RestartSec=30
User=root
[Install]
WantedBy=multi-user.target
然后,重新加载 systemd 并启动服务:
bash
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动 frps 服务
sudo systemctl start frps
# 设置开机自启
sudo systemctl enable frps
# 检查服务状态
sudo systemctl status frps
在 B 服务器上的目录结构如下:
.
├── /usr/local/frp/
│ ├── frps
│ ├── frps.toml
│ └── logs/
│ └── frps.log
└── /etc/systemd/system/
└── frps.service
2. 在 C / D 服务器(Ubuntu)上设置 frpc 为系统服务
在 C 或 D 上创建 frpc.service 文件到 /etc/systemd/system/ 目录下:
bash
sudo vim /etc/systemd/system/frpc.service
添加以下内容:
ini
[Unit]
Description=FRP Client Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStartPre=/bin/sleep 30
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
Restart=on-failure
RestartSec=60
User=root
[Install]
WantedBy=multi-user.target
然后,重新加载 systemd 并启动服务:
bash
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动 frpc 服务
sudo systemctl start frpc
# 设置开机自启
sudo systemctl enable frpc
# 检查服务状态
sudo systemctl status frpc
在 C 服务器上的目录结构如下:
.
├── /usr/local/frp/
│ ├── frpc
│ ├── frpc.toml
│ └── logs/
│ └── frpc.log
└── /etc/systemd/system/
└── frpc.service
七、在 A(Windows)访问内网服务器的服务(C / D)
1. 访问 C 服务器的 SSH
假设你在 A 上使用 SSH 客户端(如 PuTTY),可以连接到 B 服务器的 IP 和远程端口 6000:
bash
ssh -p 6000 username@117.62.206.56
其中117.62.206.56是B的IP,username是C的用户名
这将通过 FRP 隧道连接到 C 服务器的 SSH 服务。
1.1 访问 D 服务器的 SSH(新增 D 的示例)
如果你按「四-4」的**方案 A(tcp + remotePort)**把 D 的 SSH 映射到了 remotePort = 6001,那么在 A 上访问 D 的方式如下:
bash
ssh -p 6001 username@117.62.206.56
其中 117.62.206.56 是 B 的公网 IP,username 是 D 的用户名。
如果你按「四-4」的**方案 B(stcp)**配置,那么你应当先在 A 上启动 frpc visitor(监听 127.0.0.1:22022),再用下面命令连接:
bash
ssh -p 22022 username@127.0.0.1
八、删除所有配置
在某些情况下,您可能需要完全移除 FRP 的配置。以下是删除配置的步骤:
1. 停止并禁用系统服务
在 B 服务器(CentOS)上:
bash
# 停止 frps 服务
sudo systemctl stop frps
# 禁用 frps 开机自启
sudo systemctl disable frps
# 移除 frps.service 文件
sudo rm /etc/systemd/system/frps.service
# 重新加载 systemd
sudo systemctl daemon-reload
在 C 服务器(Ubuntu)上:
bash
# 停止 frpc 服务
sudo systemctl stop frpc
# 禁用 frpc 开机自启
sudo systemctl disable frpc
# 移除 frpc.service 文件
sudo rm /etc/systemd/system/frpc.service
# 重新加载 systemd
sudo systemctl daemon-reload
如果你还有 D(或更多内网目标机)也部署了 frpc,那么在对应服务器上重复以上 frpc 的停止/禁用/删除步骤即可。
在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):
- 关闭 A 上运行的
frpc.exe进程(visitor)。如果你是用命令行前台启动的,直接关闭窗口即可;如果你做成了服务/计划任务,则停止对应任务即可。
2. 删除 FRP 文件和目录
在 B 服务器(CentOS)上:
bash
# 删除 FRP 目录
sudo rm -rf /usr/local/frp
# 删除 FRP 日志(如果存在于其他位置)
# sudo rm -rf /path/to/other/logs
在 C 服务器(Ubuntu)上:
bash
# 删除 FRP 目录
sudo rm -rf /usr/local/frp
# 删除 FRP 日志(如果存在于其他位置)
# sudo rm -rf /path/to/other/logs
如果你还有 D(或更多内网目标机)也部署了 frpc,那么在对应服务器上同样删除
/usr/local/frp即可。
在 A(Windows,本教程的 STCP visitor)上(如果你使用了 STCP):
- 删除 A 上的 frpc 文件 :删除你保存的
frpc.exe、frpc.toml(如果你放在某个目录里,例如D:\frp\就删掉该目录)。 - (可选)删除 SSH 快捷方式 :如果你设置过
ssh config的Host miao指向127.0.0.1:22022,按需从C:\Users\<你>\.ssh\config中移除对应段落。
3. 移除防火墙规则
在 B 服务器(CentOS)上:
bash
# 移除对外服务端口(remotePort 示例;仅当你使用 tcp + remotePort 时需要)
sudo firewall-cmd --permanent --remove-port=6000/tcp
# 如果你还放行过其它 remotePort(例如 6001/8081),按需继续移除(STCP 不需要这些端口)
# sudo firewall-cmd --permanent --remove-port=6001/tcp
# 移除 frps 控制端口
sudo firewall-cmd --permanent --remove-port=7000/tcp
# 移除 Dashboard 端口 7500(可选;只有你曾经放行过才需要移除)
# sudo firewall-cmd --permanent --remove-port=7500/tcp
# 重新加载防火墙规则
sudo firewall-cmd --reload
在 C 服务器(Ubuntu)上:
bash
# 注意:如果你之前并没有放行 22/80(本教程默认不要求),这里无需执行。
# 如果你确实放行过,再按需移除:
# sudo ufw delete allow 22/tcp
# sudo ufw delete allow 80/tcp
# 如果有其他规则,按需删除
# sudo ufw delete allow <port>/tcp
# 重新加载 ufw 规则
sudo ufw reload
4. 移除安全组规则(如果适用)
如果 B 服务器位于云服务商上,确保在云服务商的控制台中,删除之前添加的安全组入站规则:
- TCP 7000
- TCP 6000、6001(或你配置的其它 remotePort;仅当你使用 tcp + remotePort 时需要)
- TCP 7500(可选;仅当你把
webServer.addr改成0.0.0.0且曾经对公网放行过)
九、注意事项
- 安全性(强烈建议) :为
frps/frpc启用auth.token(两端必须一致)。Dashboard 建议仅监听127.0.0.1,确需公网访问时再改为0.0.0.0并配合安全组限制来源 IP。 - 日志管理:FRP 会生成日志文件,您可以在配置文件中配置日志路径和日志级别,以便进行问题排查。
- 更新 FRP:定期检查 FRP 的更新,获取最新的功能和安全补丁。
- 监控:使用 FRP Dashboard 可以实时监控连接状态和流量,帮助您了解 FRP 的运行情况。
快速排错(启动后访问不到时)
- B(frps) :
sudo systemctl status frps,查看/usr/local/frp/logs/frps.log - C/D(frpc) :
sudo systemctl status frpc,查看/usr/local/frp/logs/frpc.log - 最常见原因 :两端
auth.token不一致;或你使用了tcp + remotePort但 B 的防火墙/安全组没放行对应端口(例如 6000/6001);或你使用了stcp但 A 的 visitor 没启动/没监听到本机端口(例如 22022)
十、完整示例配置文件
frps.toml(B 服务器)
toml
# /usr/local/frp/frps.toml
bindAddr = "0.0.0.0"
bindPort = 7000
# Dashboard(可选)
# - 默认只允许本机访问(更安全):webServer.addr = "127.0.0.1"
# - 如果确实需要公网访问,再改成 "0.0.0.0" 并配合防火墙/安全组限制来源 IP
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "请改成强密码"
# 日志
log.to = "/usr/local/frp/logs/frps.log"
log.level = "info"
log.maxDays = 3
# 鉴权(强烈建议启用;frpc 端必须使用相同 token)
auth.method = "token"
auth.token = "请替换成随机长字符串(C/D/A 都要一致)"
frpc.toml(C 服务器)
toml
# /usr/local/frp/frpc.toml
serverAddr = "117.62.206.56" # 此处换成自己中转服务器B的IP即可
serverPort = 7000
# 日志
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
# 鉴权(必须与 frps.toml 一致)
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
frpc.toml(D 服务器,新增示例)
toml
# /usr/local/frp/frpc.toml
serverAddr = "117.62.206.56"
serverPort = 7000
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001
frpc.toml(D 服务器,STCP 更安全示例)
toml
# /usr/local/frp/frpc.toml
serverAddr = "117.62.206.56"
serverPort = 7000
log.to = "/usr/local/frp/logs/frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[proxies]]
name = "d-ssh"
type = "stcp"
secretKey = "请替换成强随机串"
localIP = "127.0.0.1"
localPort = 22
frpc.toml(A 本地,STCP Visitor 示例)
toml
# C:\frp\frpc.toml
serverAddr = "117.62.206.56"
serverPort = 7000
auth.method = "token"
auth.token = "请替换成与 frps 相同的 token"
[[visitors]]
name = "d-ssh-visitor"
type = "stcp"
serverName = "d-ssh"
secretKey = "与 D 保持一致"
bindAddr = "127.0.0.1"
bindPort = 22022
请根据您的实际需求调整配置文件中的端口和域名。
十一、总结
通过上述步骤,您可以在 A(本地 Windows)、B(中转服务器 CentOS)和内网目标服务器(C / D 等 Ubuntu)之间配置 FRP,实现内网穿透和服务的远程访问。同时,指南中提供了完整的删除操作,确保您能够在需要时彻底移除 FRP 配置。请在配置过程中注意安全性,合理设置防火墙和安全组,保障系统的安全运行。