内网本地算力服务器如何通过 frp 实现任意电脑 SSH 访问

适用场景:实验室、校园网、公司内网、家庭宽带等环境下,本地 GPU/算力服务器没有公网 IP,外部电脑无法直接 SSH 登录。本文介绍如何借助一台有公网 IP 的云服务器,使用 frp 将内网服务器的 SSH 服务映射到公网端口,从而在任何电脑上远程连接本地算力服务器。


1. 为什么需要这个方案?

很多本地算力服务器部署在校园网、实验室内网或运营商 NAT 后面,虽然服务器本身能访问互联网,但外部电脑无法直接访问它的 22 端口。常见问题包括:

  • 本地算力服务器没有公网 IP;
  • 校园网或公司网络不允许外部主动访问内网机器;
  • 路由器没有权限做端口映射;
  • 希望在外出、宿舍、办公室或任意电脑上 SSH 登录算力服务器;
  • 不想把模型训练、ONNX 服务、数据集处理全部搬到云服务器。

解决思路是:让内网服务器主动连接云服务器,并在这条连接上建立反向代理隧道。外部电脑只需要访问云服务器的公网 IP 和指定端口,即可被转发到内网服务器的 SSH 服务。

注意:严格来说,云服务器上运行的是 frps,本地内网算力服务器上运行的是 frpc。很多人会把二者混淆。可以这样记:frps 中的 s 代表 server,部署在公网云服务器;frpc 中的 c 代表 client,部署在内网客户端机器。


2. 整体网络拓扑

在这里插入图片描述

核心链路如下:

ssh -p 6000 user@公网IP

主动连接 7000

公网 6000 端口转发

任意电脑
Windows / macOS / Linux

公网云服务器
frps

内网本地算力服务器
frpc + sshd

可以把它理解为三层结构:

角色所在位置运行程序作用
任意电脑外部网络SSH 客户端发起远程登录
公网云服务器公网 IP 环境frps接收外部 SSH 请求,并转发到内网隧道
本地算力服务器校园网/内网/NAT 后frpc + sshd主动连接云服务器,暴露本机 SSH 服务

3. 端口规划

为了便于理解,本文使用下面这组端口。实际部署时可以按需修改。

端口所在机器用途是否需要公网开放
22本地算力服务器本机 SSH 服务端口不需要
7000云服务器frpc 连接 frps 的控制端口需要
6000云服务器外部电脑 SSH 登录入口需要

连接命令最终会变成:

ssh -p 6000 用户名@云服务器公网IP

虽然命令中写的是云服务器公网 IP,但最终登录进去的是内网本地算力服务器。


4. 部署流程总览

在这里插入图片描述

本地 sshd:22 本地算力服务器 frpc 云服务器 frps 任意电脑 本地 sshd:22 本地算力服务器 frpc 云服务器 frps 任意电脑 主动连接 serverAddr:7000 ssh -p 6000 user@公网IP 通过 frp 隧道转发 TCP 流量 访问 127.0.0.1:22 返回 SSH 会话

5. 前置条件

开始之前,请准备:

  1. 一台云服务器:具有公网 IP,例如腾讯云、阿里云、华为云、轻量应用服务器等;
  2. 一台本地算力服务器:Ubuntu、Debian、CentOS、Rocky Linux 等均可;
  3. 云服务器安全组可开放端口;
  4. 本地算力服务器可以访问互联网;
  5. 本地算力服务器已经安装并启用 SSH 服务。

检查本地算力服务器 SSH 是否可用:

sudo systemctl status ssh
# 或者部分系统使用 sshd
sudo systemctl status sshd

如果没有安装 SSH 服务,可执行:

# Ubuntu / Debian
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh

# CentOS / Rocky Linux
sudo yum install -y openssh-server
sudo systemctl enable --now sshd

检查 22 端口是否监听:

sudo ss -lntp | grep ':22'

6. 下载 frp

frp 由 frps 和 frpc 两个程序组成。为了避免版本不一致,建议云服务器和本地算力服务器使用同一个版本。

以 Linux amd64 架构为例:

cd /tmp

FRP_VERSION=0.68.1
wget https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz

tar -zxvf frp_${FRP_VERSION}_linux_amd64.tar.gz
cd frp_${FRP_VERSION}_linux_amd64

如果你的机器是 ARM 架构,先检查架构:

uname -m

常见对应关系:

uname -m 输出建议下载版本
x86_64linux_amd64
aarch64linux_arm64
armv7llinux_arm

实际使用时,可以到 frp GitHub Releases 页面查看最新版本,并将上面的 FRP_VERSION 替换为最新版本号。


7. 在云服务器部署 frps

7.1 安装 frps

在云服务器上执行:

sudo mkdir -p /etc/frp /var/log/frp
sudo cp frps /usr/local/bin/frps
sudo chmod +x /usr/local/bin/frps

检查是否安装成功:

frps -v

7.2 编写 frps 配置文件

创建配置文件:

sudo nano /etc/frp/frps.toml

写入以下内容:

# /etc/frp/frps.toml

# frpc 连接 frps 的端口
bindPort = 7000

# 使用 token 认证,frps 和 frpc 必须保持一致
auth.method = "token"
auth.token = "请替换为一个足够复杂的随机字符串"

# 强制 frpc 使用 TLS 连接 frps
transport.tls.force = true

# 只允许 frpc 映射指定公网端口,避免端口被滥用
allowPorts = [
  { single = 6000 }
]

# 日志配置
log.to = "/var/log/frp/frps.log"
log.level = "info"
log.maxDays = 7

建议生成一个随机 token:

openssl rand -hex 32

将生成结果填入:

auth.token = "这里替换成生成的随机 token"

7.3 开放云服务器端口

需要在云服务器控制台的安全组中放行:

  • 7000/tcp:供内网算力服务器的 frpc 连接;
  • 6000/tcp:供外部电脑 SSH 登录。

如果云服务器系统本身启用了防火墙,也需要放行:

# Ubuntu / Debian: ufw
sudo ufw allow 7000/tcp
sudo ufw allow 6000/tcp
sudo ufw reload

# CentOS / Rocky Linux: firewalld
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=6000/tcp
sudo firewall-cmd --reload

安全建议:如果你的外部登录 IP 比较固定,建议在云服务器安全组中只允许自己的办公网、宿舍网或 VPN 出口 IP 访问 6000/tcp,不要无条件暴露给全网。

7.4 使用 systemd 管理 frps

创建服务文件:

sudo nano /etc/systemd/system/frps.service

写入:

[Unit]
Description=frp server service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps

查看日志:

journalctl -u frps -f

如果你的运行环境不支持 systemd,例如某些容器环境,可以临时使用:

nohup /usr/local/bin/frps -c /etc/frp/frps.toml > /var/log/frp/frps.out 2>&1 &

8. 在本地算力服务器部署 frpc

8.1 安装 frpc

在本地算力服务器上执行:

sudo mkdir -p /etc/frp /var/log/frp
sudo cp frpc /usr/local/bin/frpc
sudo chmod +x /usr/local/bin/frpc

检查版本:

frpc -v

8.2 编写 frpc 配置文件

创建配置文件:

sudo nano /etc/frp/frpc.toml

写入:

# /etc/frp/frpc.toml

# 云服务器公网 IP
serverAddr = "你的云服务器公网IP"

# 必须与 frps.toml 中的 bindPort 一致
serverPort = 7000

# 认证方式和 token 必须与 frps 完全一致
auth.method = "token"
auth.token = "与云服务器 frps.toml 中完全相同的 token"

# 使用 TLS 连接 frps
transport.tls.enable = true

[[proxies]]
name = "local-gpu-server-ssh"
type = "tcp"

# 本地 SSH 服务地址
localIP = "127.0.0.1"
localPort = 22

# 映射到云服务器的公网端口
remotePort = 6000

# 可选:对代理流量开启加密和压缩
transport.useEncryption = true
transport.useCompression = true

这里的含义是:

云服务器公网IP:6000  →  frp 隧道  →  本地算力服务器 127.0.0.1:22

8.3 检查 frpc 配置

启动前可以先验证配置:

frpc verify -c /etc/frp/frpc.toml

如果没有报错,再继续启动。

8.4 使用 systemd 管理 frpc

创建服务文件:

sudo nano /etc/systemd/system/frpc.service

写入:

[Unit]
Description=frp client service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc

查看日志:

journalctl -u frpc -f

如果看到类似 start proxy success、login to server success 的信息,说明本地算力服务器已经成功连接到云服务器。


9. 在任意电脑上 SSH 连接本地算力服务器

在任意一台电脑上执行:

ssh -p 6000 本地算力服务器用户名@云服务器公网IP

例如:

ssh -p 6000 peiguoquan@110.40.181.152

此时 SSH 请求流程是:

你的电脑
  →  云服务器公网IP:6000
  →  frps
  →  frpc 隧道
  →  本地算力服务器 127.0.0.1:22

如果希望简化命令,可以在本机电脑上配置 ~/.ssh/config:

Host gpu-server
    HostName 云服务器公网IP
    Port 6000
    User 本地算力服务器用户名
    ServerAliveInterval 60
    ServerAliveCountMax 3

以后只需要:

ssh gpu-server

10. 配置密钥登录,提高安全性

直接将 SSH 暴露到公网端口存在安全风险,建议使用 SSH 密钥登录,并关闭密码登录。

10.1 在外部电脑生成密钥

ssh-keygen -t ed25519 -C "gpu-server"

10.2 将公钥复制到本地算力服务器

由于 frp 已经映射了 SSH,可以直接通过公网端口复制:

ssh-copy-id -p 6000 本地算力服务器用户名@云服务器公网IP

如果 Windows 没有 ssh-copy-id,可以手动把本机的:

~/.ssh/id_ed25519.pub

内容追加到本地算力服务器的:

~/.ssh/authorized_keys

10.3 确认密钥可登录后再关闭密码登录

先测试:

ssh -p 6000 本地算力服务器用户名@云服务器公网IP

确认密钥登录成功后,在本地算力服务器编辑 SSH 配置:

sudo nano /etc/ssh/sshd_config

建议设置:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

重启 SSH 服务:

sudo systemctl restart ssh
# 或
sudo systemctl restart sshd

重要提醒:关闭密码登录前,一定要确认密钥登录已经成功,否则可能把自己锁在服务器外面。


11. 多台内网服务器如何配置?

如果有多台本地算力服务器,每台机器都可以运行一个 frpc,但需要使用不同的 name 和 remotePort。

例如:

内网服务器SSH 本地端口云服务器映射端口登录命令
GPU 服务器 A226001ssh -p 6001 user@公网IP
GPU 服务器 B226002ssh -p 6002 user@公网IP
数据服务器 C226003ssh -p 6003 user@公网IP

云服务器 frps.toml 可以放宽端口范围:

allowPorts = [
  { start = 6001, end = 6010 }
]

每台内网服务器的 frpc.toml 类似:

serverAddr = "云服务器公网IP"
serverPort = 7000

auth.method = "token"
auth.token = "相同的 token"
transport.tls.enable = true

[[proxies]]
name = "gpu-server-a-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001

第二台机器只需要改:

name = "gpu-server-b-ssh"
remotePort = 6002

12. 常见问题排查

12.1 外部电脑连接超时

现象:

ssh: connect to host 云服务器公网IP port 6000: Connection timed out

优先检查:

# 在云服务器检查端口是否监听
sudo ss -lntp | grep 6000
sudo ss -lntp | grep 7000

# 在云服务器查看 frps 日志
journalctl -u frps -f

# 在本地算力服务器查看 frpc 日志
journalctl -u frpc -f

常见原因:

  • 云服务器安全组没有开放 6000/tcp;
  • 云服务器系统防火墙没有开放 6000/tcp;
  • frpc 没有成功连接 frps;
  • remotePort 写错;
  • 云服务器公网 IP 写错。

12.2 frpc 认证失败

日志可能出现:

authentication failed

通常是 frps.toml 和 frpc.toml 中的 token 不一致。请检查:

auth.method = "token"
auth.token = "两边必须完全一致"

注意不要多复制空格、中文引号或换行符。


12.3 端口被占用

现象:

bind: address already in use

检查端口占用:

sudo ss -lntp | grep 6000
sudo ss -lntp | grep 7000

解决方法:

  • 修改 remotePort,例如改为 6001;
  • 修改云服务器安全组放行新端口;
  • 同步修改外部 SSH 命令中的 -p 参数。

12.4 SSH 提示 Permission denied

现象:

Permission denied (publickey,password)

这说明 frp 隧道基本已经通了,问题在 SSH 账号、密码或密钥上。检查:

  • 用户名是否是本地算力服务器上的用户名,而不是云服务器用户名;
  • 密钥是否已经写入本地算力服务器的 ~/.ssh/authorized_keys;
  • 本地算力服务器的 /etc/ssh/sshd_config 是否允许对应登录方式;
  • 是否误用了 root 登录,而服务器禁止 root 登录。

13. 推荐安全策略

为了长期稳定使用,建议至少做到以下几点:

安全措施建议
使用强 token不要使用 123456、admin、frp 等弱 token
限制映射端口在 frps.toml 中配置 allowPorts
SSH 密钥登录推荐使用 ed25519 密钥
禁止 root 远程登录PermitRootLogin no
关闭密码登录确认密钥可用后设置 PasswordAuthentication no
限制安全组来源 IP如果固定办公 IP,建议只允许白名单访问
定期查看日志检查异常登录和爆破尝试

如果对安全性要求更高,可以进一步使用:

  • WireGuard / Tailscale / ZeroTier 等组网方案;
  • frp 的 STCP 模式;
  • 云服务器安全组 IP 白名单;
  • Fail2ban 防暴力破解;
  • 单独创建普通用户,不开放 root 登录。

14. 一键命令速查

云服务器 frps

sudo mkdir -p /etc/frp /var/log/frp
sudo cp frps /usr/local/bin/frps
sudo chmod +x /usr/local/bin/frps
sudo nano /etc/frp/frps.toml
sudo systemctl daemon-reload
sudo systemctl enable --now frps
journalctl -u frps -f

本地算力服务器 frpc

sudo mkdir -p /etc/frp /var/log/frp
sudo cp frpc /usr/local/bin/frpc
sudo chmod +x /usr/local/bin/frpc
sudo nano /etc/frp/frpc.toml
frpc verify -c /etc/frp/frpc.toml
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
journalctl -u frpc -f

任意电脑 SSH 登录

ssh -p 6000 用户名@云服务器公网IP

15. 总结

通过 frp 可以把无公网 IP 的本地算力服务器变成可远程 SSH 访问的开发环境。整体思路并不复杂:

本地算力服务器 frpc 主动连接云服务器 frps
外部电脑访问云服务器公网端口
frps 将 SSH 流量转发给 frpc
frpc 再连接本机 127.0.0.1:22
最终实现远程登录内网算力服务器

这个方案特别适合本地部署了 GPU、模型服务、数据集或训练环境,但又无法直接暴露公网 IP 的场景。相比把所有计算任务迁移到云端,它能够充分利用本地算力资源,同时通过云服务器提供一个稳定的公网入口。


参考资料

更多推荐