0. 目标
采用 模式 B:
- 阿里云服务器部署
frps - 树莓派部署
frpc - 域名
ssh.example.com解析到阿里云服务器公网 IP - 阿里云服务器自己的 SSH 继续使用
22端口 - 树莓派 SSH 映射到阿里云服务器的
6000端口 - 最终外网连接方式:
ssh -p 6000 ubuntu@ssh.example.com说明:DNS 只能解析域名到 IP,不能解析端口。因此模式 B 不能直接省略 -p 6000。可以通过本机 ~/.ssh/config 做别名,最终使用 ssh lab-pi 简化连接。
frp 的官方 SSH 示例就是:在公网服务器部署 frps,内网机器部署 frpc,用 tcp 类型代理把公网端口转发到内网 SSH 服务。
1. 域名配置
假设:
域名:ssh.example.com阿里云服务器公网 IPv4:1.2.3.4在阿里云 DNS 控制台添加解析记录:
记录类型:A主机记录:ssh记录值:1.2.3.4 TTL:默认或 600 秒阿里云 DNS 文档说明,A 记录用于把域名解析到指定 IPv4 地址;添加记录的位置是 Public Zone 页面中的目标域名设置页。
验证解析:
dig ssh.example.com +short预期输出:
1.2.3.4如果没有 dig:
nslookup ssh.example.com2. 阿里云安全组 / 防火墙配置
需要开放以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
22 | TCP | 阿里云服务器自身 SSH 登录 |
7000 | TCP | frps 接收树莓派 frpc 连接 |
6000 | TCP | 外网 SSH 到树莓派的入口端口 |
如果是 ECS,在安全组中添加入站规则。阿里云 ECS 安全组用于控制实例入站和出站流量,SSH 场景通常需要放行对应 TCP 端口。
如果是 轻量应用服务器,在实例防火墙里添加端口规则。阿里云轻量应用服务器的防火墙规则用于控制入站流量。
建议:
22/tcp 来源限制为你的固定公网 IP7000/tcp 来源可以先 0.0.0.0/0,后续最好限制为学校出口 IP 或保留 token 认证6000/tcp 来源可以 0.0.0.0/0,但树莓派 SSH 必须使用密钥登录并禁用密码3. 版本选择
本文示例使用:
frp v0.69.1GitHub Releases 页面显示 v0.69.1 为当前 Latest 版本,且提供 linux_amd64、linux_arm64、linux_arm 等构建包。
frp 从 v0.69.0 开始有明确的兼容策略,建议 frps 和 frpc 尽量使用同一版本。
后续如果版本更新,只需要替换下面命令中的:
FRP_VERSION="0.69.1"4. 阿里云服务器部署 frps
4.1 登录阿里云服务器
ssh root@ssh.example.com或者:
ssh root@1.2.3.44.2 安装基础工具
sudo apt updatesudo apt install -y wget tar vim curl openssl4.3 下载 frp
阿里云服务器一般是 x86_64 / amd64 架构,先确认:
uname -m如果输出是:
x86_64执行:
cd /tmpFRP_VERSION="0.69.1"wget "https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz"tar -xzf "frp_${FRP_VERSION}_linux_amd64.tar.gz"sudo mkdir -p /opt/frpsudocp "frp_${FRP_VERSION}_linux_amd64/frps" /opt/frp/sudochmod +x /opt/frp/frps检查版本:
/opt/frp/frps --version4.4 生成认证 token
openssl rand -hex 32示例输出:
6e8f7b0c0e2d8c0d7c6a9f5e2a1b3c4d5e6f7a8b9c0d1e2f33445566778899aa后面 frps.toml 和 frpc.toml 里的 auth.token 必须保持一致。
4.5 创建 frps 配置
sudo vim /opt/frp/frps.toml写入:
bindPort = 7000auth.method = "token"auth.token = "替换成你生成的随机token"
transport.tls.force = true说明:
bindPort = 7000:frps监听7000,等待树莓派上的frpc主动连接。auth.method = "token":启用 token 认证。transport.tls.force = true:强制frpc到frps的连接使用 TLS。
frp 官方 SSH 示例中,frps 侧通过 bindPort = 7000 接收内网客户端连接。
4.6 创建 systemd 服务
frp 官方文档推荐在 Linux 上使用 systemd 管理 frps,用于后台运行、启动、停止和开机自启。
创建服务文件:
sudo vim /etc/systemd/system/frps.service写入:
[Unit]Description=frp serverAfter=network.target
[Service]Type=simpleExecStart=/opt/frp/frps -c /opt/frp/frps.tomlRestart=alwaysRestartSec=5
[Install]WantedBy=multi-user.target启动服务:
sudo systemctl daemon-reloadsudo systemctl enable --now frpssudo systemctl status frps查看日志:
sudo journalctl -u frps -f4.7 检查 frps 是否监听 7000
sudo ss -lntp | grep 7000预期能看到 frps 正在监听:
LISTEN 0 ... *:7000 ...5. 树莓派部署 frpc
5.1 登录树莓派
在学校内网或已有方式登录树莓派:
ssh ubuntu@树莓派内网IP5.2 安装基础工具
sudo apt updatesudo apt install -y wget tar vim curl openssl5.3 确认树莓派架构
uname -m常见结果:
| 输出 | 使用包 |
|---|---|
aarch64 | linux_arm64 |
armv7l | linux_arm |
x86_64 | linux_amd64 |
大多数 64 位 Ubuntu 树莓派是:
aarch645.4 下载 frpc
如果树莓派是 aarch64:
cd /tmpFRP_VERSION="0.69.1"wget "https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_arm64.tar.gz"tar -xzf "frp_${FRP_VERSION}_linux_arm64.tar.gz"sudo mkdir -p /opt/frpsudo cp "frp_${FRP_VERSION}_linux_arm64/frpc" /opt/frp/sudo chmod +x /opt/frp/frpc检查版本:
/opt/frp/frpc --version如果树莓派是 armv7l,把下载包改成:
wget "https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_arm.tar.gz"tar -xzf "frp_${FRP_VERSION}_linux_arm.tar.gz"sudo cp "frp_${FRP_VERSION}_linux_arm/frpc" /opt/frp/5.5 确认树莓派 SSH 服务正常
sudo systemctl status ssh || sudo systemctl status sshd确认本机 22 端口监听:
sudo ss -lntp | grep ':22'本机测试:
ssh localhost如果树莓派本机 ssh localhost 都失败,先修复树莓派 SSH 服务。
5.6 创建 frpc 配置
sudo vim /opt/frp/frpc.toml写入:
serverAddr = "ssh.example.com"serverPort = 7000auth.method = "token"auth.token = "替换成和frps完全一致的随机token"transport.tls.enable = true
[[proxies]]name = "raspi-ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000说明:
serverAddr = "ssh.example.com":连接阿里云服务器域名。serverPort = 7000:连接阿里云服务器frps的控制端口。localIP = "127.0.0.1":树莓派本地。localPort = 22:树莓派本地 SSH 服务端口。remotePort = 6000:阿里云服务器公网暴露的端口。- 最终外网访问
ssh.example.com:6000,会被转发到树莓派127.0.0.1:22。
frp 官方文档说明,通过简单的 tcp 类型代理配置,可以从外部访问内网机器的 SSH 服务;示例也是将公网服务器端口转发到内网机器的 22。
5.7 创建 systemd 服务
sudo vim /etc/systemd/system/frpc.service写入:
[Unit]Description=frp clientAfter=network-online.targetWants=network-online.target[Service]Type=simpleExecStart=/opt/frp/frpc -c /opt/frp/frpc.tomlRestart=alwaysRestartSec=5
[Install]WantedBy=multi-user.target启动服务:
sudo systemctl daemon-reloadsudo systemctl enable --now frpcsudo systemctl status frpc查看日志:
sudo journalctl -u frpc -f如果连接成功,日志里应该能看到类似:
login to server successproxy added: raspi-sshstart proxy success6. 外网 SSH 连接树莓派
在任意外网电脑执行:
ssh -p 6000 ubuntu@ssh.example.com其中:
ubuntu = 树莓派上的用户名ssh.example.com = 解析到阿里云服务器公网 IP 的域名6000 = frp 映射出来的公网端口如果树莓派用户名是 pi:
ssh -p 6000 pi@ssh.example.com7. 配置 SSH 别名
为了避免每次输入 -p 6000,在你的外网电脑上编辑:
vim ~/.ssh/config加入:
Host lab-pi HostName ssh.example.com Port 6000 User ubuntu ServerAliveInterval 30 ServerAliveCountMax 3之后可以直接:
ssh lab-pi如果还要通过树莓派跳到实验室内网其他服务器,例如 192.168.1.100:
Host lab-pi HostName ssh.example.com Port 6000 User ubuntu ServerAliveInterval 30 ServerAliveCountMax 3
Host lab-server-1 HostName 192.168.1.100 User your_user ProxyJump lab-pi连接内网服务器:
ssh lab-server-18. 推荐安全加固
8.1 树莓派禁用密码登录
确认你的公钥已经能登录树莓派后,再执行:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.baksudovim /etc/ssh/sshd_config建议设置:
PubkeyAuthentication yesPasswordAuthentication noPermitRootLogin no重启 SSH:
sudo systemctl restart ssh || sudo systemctl restart sshd重新测试:
ssh -p 6000 ubuntu@ssh.example.com