1630 字
8 分钟
Frp 跳板机建立

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.com

2. 阿里云安全组 / 防火墙配置#

需要开放以下端口:

端口协议用途
22TCP阿里云服务器自身 SSH 登录
7000TCPfrps 接收树莓派 frpc 连接
6000TCP外网 SSH 到树莓派的入口端口

如果是 ECS,在安全组中添加入站规则。阿里云 ECS 安全组用于控制实例入站和出站流量,SSH 场景通常需要放行对应 TCP 端口。

如果是 轻量应用服务器,在实例防火墙里添加端口规则。阿里云轻量应用服务器的防火墙规则用于控制入站流量。

建议:

22/tcp 来源限制为你的固定公网 IP
7000/tcp 来源可以先 0.0.0.0/0,后续最好限制为学校出口 IP 或保留 token 认证
6000/tcp 来源可以 0.0.0.0/0,但树莓派 SSH 必须使用密钥登录并禁用密码

3. 版本选择#

本文示例使用:

frp v0.69.1

GitHub Releases 页面显示 v0.69.1 为当前 Latest 版本,且提供 linux_amd64linux_arm64linux_arm 等构建包。

frp 从 v0.69.0 开始有明确的兼容策略,建议 frpsfrpc 尽量使用同一版本。

后续如果版本更新,只需要替换下面命令中的:

FRP_VERSION="0.69.1"

4. 阿里云服务器部署 frps#

4.1 登录阿里云服务器#

ssh root@ssh.example.com

或者:

ssh root@1.2.3.4

4.2 安装基础工具#

sudo apt update
sudo apt install -y wget tar vim curl openssl

4.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/frpsudo
cp "frp_${FRP_VERSION}_linux_amd64/frps" /opt/frp/sudo
chmod +x /opt/frp/frps

检查版本:

/opt/frp/frps --version

4.4 生成认证 token#

openssl rand -hex 32

示例输出:

6e8f7b0c0e2d8c0d7c6a9f5e2a1b3c4d5e6f7a8b9c0d1e2f33445566778899aa

后面 frps.tomlfrpc.toml 里的 auth.token 必须保持一致。

4.5 创建 frps 配置#

sudo vim /opt/frp/frps.toml

写入:

bindPort = 7000
auth.method = "token"
auth.token = "替换成你生成的随机token"
transport.tls.force = true

说明:

  • bindPort = 7000frps 监听 7000,等待树莓派上的 frpc 主动连接。
  • auth.method = "token":启用 token 认证。
  • transport.tls.force = true:强制 frpcfrps 的连接使用 TLS。

frp 官方 SSH 示例中,frps 侧通过 bindPort = 7000 接收内网客户端连接。

4.6 创建 systemd 服务#

frp 官方文档推荐在 Linux 上使用 systemd 管理 frps,用于后台运行、启动、停止和开机自启。

创建服务文件:

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

写入:

[Unit]
Description=frp server
After=network.target
[Service]
Type=simpleExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps

查看日志:

sudo journalctl -u frps -f

4.7 检查 frps 是否监听 7000#

sudo ss -lntp | grep 7000

预期能看到 frps 正在监听:

LISTEN 0 ... *:7000 ...

5. 树莓派部署 frpc#

5.1 登录树莓派#

在学校内网或已有方式登录树莓派:

ssh ubuntu@树莓派内网IP

5.2 安装基础工具#

sudo apt update
sudo apt install -y wget tar vim curl openssl

5.3 确认树莓派架构#

uname -m

常见结果:

输出使用包
aarch64linux_arm64
armv7llinux_arm
x86_64linux_amd64

大多数 64 位 Ubuntu 树莓派是:

aarch64

5.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/frp
sudo 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 = 7000
auth.method = "token"
auth.token = "替换成和frps完全一致的随机token"
transport.tls.enable = true
[[proxies]]
name = "raspi-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 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 client
After=network-online.target
Wants=network-online.target[Service]Type=simpleExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc

查看日志:

sudo journalctl -u frpc -f

如果连接成功,日志里应该能看到类似:

login to server successproxy added: raspi-sshstart proxy success

6. 外网 SSH 连接树莓派#

在任意外网电脑执行:

ssh -p 6000 ubuntu@ssh.example.com

其中:

ubuntu = 树莓派上的用户名ssh.example.com = 解析到阿里云服务器公网 IP 的域名6000 = frp 映射出来的公网端口

如果树莓派用户名是 pi

ssh -p 6000 pi@ssh.example.com

7. 配置 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-1

8. 推荐安全加固#

8.1 树莓派禁用密码登录#

确认你的公钥已经能登录树莓派后,再执行:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.baksudo
vim /etc/ssh/sshd_config

建议设置:

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no

重启 SSH:

sudo systemctl restart ssh || sudo systemctl restart sshd

重新测试:

ssh -p 6000 ubuntu@ssh.example.com
Frp 跳板机建立
https://ginwineli.cn/posts/common/service/frp-跳板机建立/
作者
琴酒Gin
发布于
2026-06-17
许可协议
CC BY-NC-SA 4.0