内网本地算力服务器如何通过 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 客户端 | 发起远程登录 |
| 公网云服务器 | 公网 IP 环境 | frps | 接收外部 SSH 请求,并转发到内网隧道 |
| 本地算力服务器 | 校园网/内网/NAT 后 | frpc+sshd | 主动连接云服务器,暴露本机 SSH 服务 |
3. 端口规划
为了便于理解,本文使用下面这组端口。实际部署时可以按需修改。
| 端口 | 所在机器 | 用途 | 是否需要公网开放 |
|---|---|---|---|
22 | 本地算力服务器 | 本机 SSH 服务端口 | 不需要 |
7000 | 云服务器 | frpc连接frps的控制端口 | 需要 |
6000 | 云服务器 | 外部电脑 SSH 登录入口 | 需要 |
连接命令最终会变成:
ssh-p6000用户名@云服务器公网IP虽然命令中写的是云服务器公网 IP,但最终登录进去的是内网本地算力服务器。
4. 部署流程总览
5. 前置条件
开始之前,请准备:
- 一台云服务器:具有公网 IP,例如腾讯云、阿里云、华为云、轻量应用服务器等;
- 一台本地算力服务器:Ubuntu、Debian、CentOS、Rocky Linux 等均可;
- 云服务器安全组可开放端口;
- 本地算力服务器可以访问互联网;
- 本地算力服务器已经安装并启用 SSH 服务。
检查本地算力服务器 SSH 是否可用:
sudosystemctl statusssh# 或者部分系统使用 sshdsudosystemctl status sshd如果没有安装 SSH 服务,可执行:
# Ubuntu / Debiansudoaptupdatesudoaptinstall-yopenssh-serversudosystemctlenable--nowssh# CentOS / Rocky Linuxsudoyuminstall-yopenssh-serversudosystemctlenable--nowsshd检查22端口是否监听:
sudoss-lntp|grep':22'6. 下载 frp
frp 由frps和frpc两个程序组成。为了避免版本不一致,建议云服务器和本地算力服务器使用同一个版本。
以 Linuxamd64架构为例:
cd/tmpFRP_VERSION=0.68.1wgethttps://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gztar-zxvffrp_${FRP_VERSION}_linux_amd64.tar.gzcdfrp_${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
在云服务器上执行:
sudomkdir-p/etc/frp /var/log/frpsudocpfrps /usr/local/bin/frpssudochmod+x /usr/local/bin/frps检查是否安装成功:
frps-v7.2 编写 frps 配置文件
创建配置文件:
sudonano/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-hex32将生成结果填入:
auth.token = "这里替换成生成的随机 token"7.3 开放云服务器端口
需要在云服务器控制台的安全组中放行:
7000/tcp:供内网算力服务器的frpc连接;6000/tcp:供外部电脑 SSH 登录。
如果云服务器系统本身启用了防火墙,也需要放行:
# Ubuntu / Debian: ufwsudoufw allow7000/tcpsudoufw allow6000/tcpsudoufw reload# CentOS / Rocky Linux: firewalldsudofirewall-cmd--permanent--add-port=7000/tcpsudofirewall-cmd--permanent--add-port=6000/tcpsudofirewall-cmd--reload安全建议:如果你的外部登录 IP 比较固定,建议在云服务器安全组中只允许自己的办公网、宿舍网或 VPN 出口 IP 访问
6000/tcp,不要无条件暴露给全网。
7.4 使用 systemd 管理 frps
创建服务文件:
sudonano/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启动并设置开机自启:
sudosystemctl daemon-reloadsudosystemctlenable--nowfrpssudosystemctl status frps查看日志:
journalctl-ufrps-f如果你的运行环境不支持 systemd,例如某些容器环境,可以临时使用:
nohup/usr/local/bin/frps-c/etc/frp/frps.toml>/var/log/frp/frps.out2>&1&8. 在本地算力服务器部署 frpc
8.1 安装 frpc
在本地算力服务器上执行:
sudomkdir-p/etc/frp /var/log/frpsudocpfrpc /usr/local/bin/frpcsudochmod+x /usr/local/bin/frpc检查版本:
frpc-v8.2 编写 frpc 配置文件
创建配置文件:
sudonano/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:228.3 检查 frpc 配置
启动前可以先验证配置:
frpc verify-c/etc/frp/frpc.toml如果没有报错,再继续启动。
8.4 使用 systemd 管理 frpc
创建服务文件:
sudonano/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启动并设置开机自启:
sudosystemctl daemon-reloadsudosystemctlenable--nowfrpcsudosystemctl status frpc查看日志:
journalctl-ufrpc-f如果看到类似start proxy success、login to server success的信息,说明本地算力服务器已经成功连接到云服务器。
9. 在任意电脑上 SSH 连接本地算力服务器
在任意一台电脑上执行:
ssh-p6000本地算力服务器用户名@云服务器公网IP例如:
ssh-p6000peiguoquan@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以后只需要:
sshgpu-server10. 配置密钥登录,提高安全性
直接将 SSH 暴露到公网端口存在安全风险,建议使用 SSH 密钥登录,并关闭密码登录。
10.1 在外部电脑生成密钥
ssh-keygen-ted25519-C"gpu-server"10.2 将公钥复制到本地算力服务器
由于 frp 已经映射了 SSH,可以直接通过公网端口复制:
ssh-copy-id-p6000本地算力服务器用户名@云服务器公网IP如果 Windows 没有ssh-copy-id,可以手动把本机的:
~/.ssh/id_ed25519.pub内容追加到本地算力服务器的:
~/.ssh/authorized_keys10.3 确认密钥可登录后再关闭密码登录
先测试:
ssh-p6000本地算力服务器用户名@云服务器公网IP确认密钥登录成功后,在本地算力服务器编辑 SSH 配置:
sudonano/etc/ssh/sshd_config建议设置:
PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin no重启 SSH 服务:
sudosystemctl restartssh# 或sudosystemctl restart sshd重要提醒:关闭密码登录前,一定要确认密钥登录已经成功,否则可能把自己锁在服务器外面。
11. 多台内网服务器如何配置?
如果有多台本地算力服务器,每台机器都可以运行一个frpc,但需要使用不同的name和remotePort。
例如:
| 内网服务器 | 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 = 600212. 常见问题排查
12.1 外部电脑连接超时
现象:
ssh: connect tohost云服务器公网IP port6000: Connection timed out优先检查:
# 在云服务器检查端口是否监听sudoss-lntp|grep6000sudoss-lntp|grep7000# 在云服务器查看 frps 日志journalctl-ufrps-f# 在本地算力服务器查看 frpc 日志journalctl-ufrpc-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检查端口占用:
sudoss-lntp|grep6000sudoss-lntp|grep7000解决方法:
- 修改
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
sudomkdir-p/etc/frp /var/log/frpsudocpfrps /usr/local/bin/frpssudochmod+x /usr/local/bin/frpssudonano/etc/frp/frps.tomlsudosystemctl daemon-reloadsudosystemctlenable--nowfrps journalctl-ufrps-f本地算力服务器 frpc
sudomkdir-p/etc/frp /var/log/frpsudocpfrpc /usr/local/bin/frpcsudochmod+x /usr/local/bin/frpcsudonano/etc/frp/frpc.toml frpc verify-c/etc/frp/frpc.tomlsudosystemctl daemon-reloadsudosystemctlenable--nowfrpc journalctl-ufrpc-f任意电脑 SSH 登录
ssh-p6000用户名@云服务器公网IP15. 总结
通过 frp 可以把无公网 IP 的本地算力服务器变成可远程 SSH 访问的开发环境。整体思路并不复杂:
本地算力服务器 frpc 主动连接云服务器 frps 外部电脑访问云服务器公网端口 frps 将 SSH 流量转发给 frpc frpc 再连接本机 127.0.0.1:22 最终实现远程登录内网算力服务器这个方案特别适合本地部署了 GPU、模型服务、数据集或训练环境,但又无法直接暴露公网 IP 的场景。相比把所有计算任务迁移到云端,它能够充分利用本地算力资源,同时通过云服务器提供一个稳定的公网入口。
参考资料
- fatedier/frp GitHub 仓库
- frp 官方网站
- frp Release 下载页面