内网本地算力服务器如何通过 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 由 frpsfrpc 两个程序组成。为了避免版本不一致,建议云服务器和本地算力服务器使用同一个版本。

以 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_64 linux_amd64
aarch64 linux_arm64
armv7l linux_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 successlogin 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,但需要使用不同的 nameremotePort

例如:

内网服务器 SSH 本地端口 云服务器映射端口 登录命令
GPU 服务器 A 22 6001 ssh -p 6001 user@公网IP
GPU 服务器 B 22 6002 ssh -p 6002 user@公网IP
数据服务器 C 22 6003 ssh -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.tomlfrpc.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 不要使用 123456adminfrp 等弱 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 的场景。相比把所有计算任务迁移到云端,它能够充分利用本地算力资源,同时通过云服务器提供一个稳定的公网入口。


参考资料

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐