校园网/内网服务器远程登录指南:frp + 云服务器实现 SSH 穿透
没有公网 IP,也能远程登录实验室算力服务器。本文通过 frp 内网穿透方案,将本地服务器的 SSH 服务安全映射到公网云服务器端口,实现任意电脑远程访问内网机器。教程从云服务器端口放行、frps/frpc 配置到 SSH 测试与故障排查,完整演示一套适用于校园网、局域网和实验室算力服务器的远程运维方案。
内网本地算力服务器如何通过 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 -p 6000 用户名@云服务器公网IP
虽然命令中写的是云服务器公网 IP,但最终登录进去的是内网本地算力服务器。
4. 部署流程总览

5. 前置条件
开始之前,请准备:
- 一台云服务器:具有公网 IP,例如腾讯云、阿里云、华为云、轻量应用服务器等;
- 一台本地算力服务器:Ubuntu、Debian、CentOS、Rocky Linux 等均可;
- 云服务器安全组可开放端口;
- 本地算力服务器可以访问互联网;
- 本地算力服务器已经安装并启用 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_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 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 服务器 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.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 的场景。相比把所有计算任务迁移到云端,它能够充分利用本地算力资源,同时通过云服务器提供一个稳定的公网入口。
参考资料
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)