用 FRP 给内网设备做 SSH 穿透:Ubuntu ARM64 客户端实战
🛠️ 工具 ubuntu frp 内网穿透 11

TL;DR:在机器人/边缘计算场景里,设备(比如 NVIDIA Jetson Orin)常躲在内网,没法直接 SSH。这篇记录我在 Ubuntu ARM64(aarch64)上装 frpc 客户端、用 TOML 新格式配 SSH 穿透、再做成 systemd 开机自启的完整流程。命令都可直接抄,文末附排错。

为什么要做这件事

我在搞机器人开发时,设备(Jetson Orin 这类 ARM64 板子)一般挂在内网,公司或家里的网络又没有公网 IP。每次想远程 SSH 上去调试都很麻烦。FRP(Fast Reverse Proxy)就是干这个的:在一台有公网 IP 的服务器上跑 frps 服务端,内网设备上跑 frpc 客户端,把内网的 22 端口反向映射到公网某个端口,从此随时随地 SSH。

本文只讲**客户端(frpc)**这一侧,以 NVIDIA Jetson(aarch64)为例,frp 版本 v0.58.1+。

1. 环境确认

先确认 CPU 架构,免得下错安装包:

uname -m
# 输出 aarch64 → ARM64 架构(常见于 Jetson、树莓派)
# 输出 x86_64 → AMD64 架构(常见于普通 PC/服务器)

本文以 aarch64 为例;如果你是 x86_64,把下面下载包名里的 arm64 换成 amd64 即可。

2. 下载与安装

FRP GitHub Releases 找版本号,把下面的 v0.58.1 换成你要的版本即可(注意 URL 路径里的版本号和文件名里的版本号要一致——这是我当初踩的坑,复制粘贴时很容易写错):

# 1. 下载 ARM64 版本安装包(以 v0.58.1 为例)
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_arm64.tar.gz

# 2. 解压
tar -zxvf frp_0.58.1_linux_arm64.tar.gz

# 3. 进入目录
cd frp_0.58.1_linux_arm64

# 4. 安装:把二进制丢到系统路径
sudo cp frpc /usr/bin/
sudo chmod +x /usr/bin/frpc

# 5. 准备配置目录
sudo mkdir -p /etc/frp

3. 配置文件(TOML 格式)

新版 FRP(v0.52.0+)推荐用 .toml 替代旧的 .ini。创建并编辑:

sudo vim /etc/frp/frpc.toml

按实际情况改 serverAddrauth.token 和端口:

# ================= 基础配置 =================
# FRP 服务端公网 IP
serverAddr = "182.150.xx.xx"
# FRP 服务端监听端口(默认 7000,按你服务端的实际配置填)
serverPort = 8001

# ================= 鉴权配置 =================
auth.method = "token"
# 鉴权密钥(必须与服务端 frps.toml 里的 token 完全一致)
auth.token = "这里填写你的复杂Token字符串"

# ================= 代理配置 =================
[[proxies]]
# 代理名称(必须唯一,建议带上设备名好区分)
name = "ssh-orin-dev"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
# 远程访问端口(之后 SSH 连接用的就是这个端口)
remotePort = 8003

先跑一把验证./frpc -c /etc/frp/frpc.toml 临时运行,看到 start proxy success 就说明配置通了,再去做自启。

4. 设置开机自启(systemd)

让 frpc 后台稳定运行、随系统启动,做成 systemd 服务。创建服务文件:

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

写入(注意 ExecStart 的路径要和第 2 步安装位置一致):

[Unit]
Description=Frp Client Service
Documentation=https://github.com/fatedier/frp
# 确保网络就绪后再启动
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.toml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

5. 启动服务

# 重载 systemd 配置
sudo systemctl daemon-reload

# 启动 frpc
sudo systemctl start frpc

# 设置开机自启(注意是 enable,不是 start——这步是让它开机自动拉起)
sudo systemctl enable frpc

# 查看运行状态
sudo systemctl status frpc

状态显示绿色的 active (running) 就成了。

6. 远程连接测试

现在就能用公网 IP + 映射端口(remotePort)SSH 上去了:

# 端口对应配置里的 remotePort = 8003
ssh -p 8003 username@182.150.xx.xx

排错(Troubleshooting)

  • 连接超时:检查云服务器(服务端)的防火墙 / 安全组,确保 serverPort(8001)和 remotePort(8003)都放行了。
  • 鉴权失败 / 起不来:确保客户端和服务端的 auth.token 完全一致;frpc.serviceType=simple 后面别多敲冒号,否则 systemd 解析会失败。
  • 重启后没自动连:确认第 5 步执行的是 systemctl enable frpc 而不是只 start

小结

FRP 客户端这套配下来,关键就三步:架构对版本、TOML 配代理、systemd 托管。配好之后内网设备就像有了公网地址,随时 SSH。我自己这套自托管玩法(包括博客)很大程度上就是靠 FRP 把家里几台设备暴露出来的。如果你也在折腾 Linux 服务器,可以顺手看看我另一篇 打造顺手的终端:Oh My Zsh + Powerlevel10k 配置,远程上去之后终端用着也舒服。

用 FRP 给内网设备做 SSH 穿透:Ubuntu ARM64 客户端实战
http://localhost:8090/archives/ubuntu-frp-client-setup
作者
fnidore
发布于
更新于
许可