FRP 安全内网穿透配置:TCP 与 STCP 两种安全 SSH 穿透方案

文章目录

    • [一、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 需要开放哪些端口?)
    • 五、配置安全组与防火墙
      • [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)
  • 方案 B(D 演示,更安全):stcp

    • 访问方式 :A 先运行 frpc visitor,把 D 的 SSH 映射到本机端口(例如 127.0.0.1:22022),再 ssh -p 22022 user@127.0.0.1
    • 特点 :B 不需要为 D 开放 SSH 的对外端口,公网扫描不到入口;但 A 需要额外运行一个 frpc(visitor)

怎么选?

  • 你希望"只用 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
    • 可选LICENSElogs/
    • 通常可删除 (避免误启动):/usr/local/frp/frpc/usr/local/frp/frpc.toml
  • C / D(内网目标机,跑 frpc)

    • 必须/usr/local/frp/frpc/usr/local/frp/frpc.toml
    • 可选LICENSElogs/
    • 通常可删除 (避免误启动):/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.0TOML 配置为准(字段多为驼峰/点号分层)。不要把旧版 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 上放行端口
  • 防火墙/安全组 :除了已有的 70006000,再放行 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.tokensecretKey,还需要同步修改 A(visitor)并重启 A 的 frpc(见下一节)。

4.4.2 在 A(Windows)上准备 frpc(STCP Visitor)

你需要在 A 上也放一份 frpc(Windows 版),并创建一个 frpc.toml(仅用于 visitor)。

(1) 下载 Windows 版 FRP

你可以从 FRP 的 GitHub Release 下载(版本与服务器一致即可):

也可以直接用 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.exe
    • frpc.toml(改成你自己的 visitor 配置)
    • LICENSE(可保留)
  • 建议删除(不影响使用,避免误启动服务端)

    • frps.exe
    • frps.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.exefrpc.toml 同目录下运行 frpc.exe -c frpc.toml,并保持进程运行(需要连接 D 时别关闭)。

如果你修改了 A 的 frpc.toml(例如 auth.tokensecretKeybindPort),需要先停止正在运行的 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.56B的IP,usernameC的用户名

这将通过 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.exefrpc.toml(如果你放在某个目录里,例如 D:\frp\ 就删掉该目录)。
  • (可选)删除 SSH 快捷方式 :如果你设置过 ssh configHost 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 且曾经对公网放行过)

九、注意事项

  1. 安全性(强烈建议) :为 frps/frpc 启用 auth.token(两端必须一致)。Dashboard 建议仅监听 127.0.0.1,确需公网访问时再改为 0.0.0.0 并配合安全组限制来源 IP。
  2. 日志管理:FRP 会生成日志文件,您可以在配置文件中配置日志路径和日志级别,以便进行问题排查。
  3. 更新 FRP:定期检查 FRP 的更新,获取最新的功能和安全补丁。
  4. 监控:使用 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 配置。请在配置过程中注意安全性,合理设置防火墙和安全组,保障系统的安全运行。

相关推荐
Chengbei112 小时前
推送POC汇总 — 2026年3月多产品多类型vulnerability速递与应急建议
安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
yugi9878383 小时前
基于STM32F107和DP83848的TCP服务器数据收发方案
服务器·stm32·tcp/ip
2501_922678433 小时前
bugku qsnctf
安全
guslegend3 小时前
3月29日(openclaw安全保障)
人工智能·安全·大模型
桌面运维家3 小时前
Nginx服务器安全:高级访问控制与流量清洗实战
服务器·nginx·安全
FPGA小迷弟4 小时前
FPGA工程师面试题汇总(九)
网络协议·tcp/ip·fpga开发·面试·verilog·fpga
AI周红伟4 小时前
周红伟:关于OpenClaw安全使用提醒
大数据·数据库·人工智能·安全·腾讯云·openclaw
不灭锦鲤4 小时前
网络安全学习第162天
学习·安全·web安全