FRP 实现树莓派公网访问配置教程
适用场景:家里的树莓派没有公网 IP,希望通过一台有公网 IP 的云服务器,从外网 SSH 登录树莓派,或者以后访问树莓派上的网站、摄像头等服务。
一、我们要实现什么?
家里的树莓派通常位于路由器后面,没有公网 IPv4,所以人在外面时不能直接:
外网电脑 → 家里树莓派我们使用一台有公网 IP 的云服务器作为“中转站”。
安装 FRP 后:
外面的电脑
│
│ SSH
▼
┌───────────────┐
│ 云服务器 │
│ frps 服务端 │
└───────┬───────┘
│
│ FRP 隧道
│
┌───────▼───────┐
│ 家里树莓派 │
│ frpc 客户端 │
└───────┬───────┘
│
▼
SSH :22简单理解:
云服务器负责接客,FRP 负责把连接送回家里的树莓派。
二、准备条件
需要:
一台拥有公网 IPv4 的 Linux 云服务器
一台树莓派
两边都能正常访问互联网
树莓派已经开启 SSH
本次使用:
云服务器:
Ubuntu 24.04
x86_64
树莓派:
Debian 13
ARM64 / aarch64
FRP:
0.70.1为了保护隐私,下面统一使用:
<SERVER_PUBLIC_IP> = 云服务器公网 IP
<FRP_TOKEN> = 自己生成的 FRP 密钥
<PI_USER> = 树莓派用户名本教程示例端口:
7000 = FRP 客户端连接服务器
6000 = 外网 SSH 访问树莓派三、第一部分:云服务器安装 FRP 服务端
FRP 分成两个程序:
frps = Server = 安装在云服务器
frpc = Client = 安装在树莓派先配置云服务器。
1. 查看服务器架构
执行:
uname -m如果显示:
x86_64就使用 FRP 的:
linux_amd64版本。
2. 下载 FRP
进入临时目录:
cd /tmp下载:
wget https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_amd64.tar.gz解压:
tar -xzf frp_0.70.1_linux_amd64.tar.gz进入目录:
cd frp_0.70.1_linux_amd64查看:
ls -lh应该能看到:
frpc
frpc.toml
frps
frps.toml
LICENSE我们现在只需要服务端程序:
frps安装:
sudo install -m 755 frps /usr/local/bin/frps确认:
frps --version应该显示:
0.70.1四、生成 FRP Token
FRP Token 可以理解成:
树莓派连接云服务器时使用的“接头暗号”。
生成随机 Token:
openssl rand -hex 32会得到一长串随机字符。
把它保存好。
后面:
云服务器 frps
↕
必须使用相同 Token
↕
树莓派 frpc不要把 Token 发给别人。
文档里也不要保存真实 Token,统一写:
<FRP_TOKEN>五、配置云服务器 frps
创建配置目录:
sudo mkdir -p /etc/frp创建配置:
sudo nano /etc/frp/frps.toml填写:
bindAddr = "0.0.0.0"
bindPort = 7000
auth.method = "token"
auth.token = "<FRP_TOKEN>"注意:
<FRP_TOKEN>实际配置的时候要替换成刚才生成的真实 Token。
保存后设置权限:
sudo chmod 600 /etc/frp/frps.toml这样普通用户不能随便读取 Token。
六、第一次启动 FRP 服务端
执行:
sudo frps -c /etc/frp/frps.toml如果看到类似:
frps tcp listen on 0.0.0.0:7000
frps started successfully说明 FRP 服务端正常。
可以按:
Ctrl + C结束测试。
七、让 frps 开机自动启动
如果不设置这一步,服务器一重启,FRP 就没了。
创建:
sudo nano /etc/systemd/system/frps.service填写:
[Unit]
Description=FRP Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target保存。
然后:
sudo systemctl daemon-reload启动:
sudo systemctl start frps设置开机启动:
sudo systemctl enable frps检查:
sudo systemctl status frps --no-pager如果看到:
enabled
active (running)说明成功。
八、这里有一个容易踩的坑
systemd 配置必须严格换行。
例如:
[Unit]
Description=FRP Server不能写成:
[Unit] Description=FRP Server否则可能出现:
Bad message之类的错误。
如果怀疑配置写错,可以:
sudo cat -n /etc/systemd/system/frps.service检查每一行。
九、开放云服务器 7000 端口
这一步非常重要。
FRP 服务虽然启动了,但防火墙如果不允许 7000,树莓派还是连不上。
需要检查两层防火墙。
第一层:云厂商安全组/防火墙
增加:
协议:TCP
端口:7000
来源:全部 IPv4
操作:允许第二层:Ubuntu UFW
检查:
sudo ufw status如果 UFW 是:
Status: active就需要:
sudo ufw allow 7000/tcp再次:
sudo ufw status确认出现:
7000/tcp ALLOW这一点很容易忘。
我们实际配置时就遇到过:
云服务器安全组:7000 ✅
Ubuntu UFW:7000 ❌结果树莓派一直:
i/o timeout所以以后看到:
i/o timeout第一反应就是检查:
公网安全组 + 系统防火墙。
十、第二部分:树莓派安装 FRP 客户端
现在开始配置树莓派。
查看架构:
uname -m如果显示:
aarch64使用:
linux_arm64版本。
进入:
cd /tmp下载:
wget https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_arm64.tar.gz解压:
tar -xzf frp_0.70.1_linux_arm64.tar.gz进入:
cd frp_0.70.1_linux_arm64安装客户端:
sudo install -m 755 frpc /usr/local/bin/frpc检查:
frpc --version应该显示:
0.70.1十一、配置树莓派连接云服务器
创建:
sudo mkdir -p /etc/frp编辑:
sudo nano /etc/frp/frpc.toml先只写:
serverAddr = "<SERVER_PUBLIC_IP>"
serverPort = 7000
auth.method = "token"
auth.token = "<FRP_TOKEN>"实际使用时:
<SERVER_PUBLIC_IP>换成自己的云服务器公网 IP。
<FRP_TOKEN>换成服务器配置里使用的 Token。
两个 Token 必须完全一致。
然后:
sudo chmod 600 /etc/frp/frpc.toml十二、测试树莓派能不能连接服务器
先测试服务器 7000:
nc -vz <SERVER_PUBLIC_IP> 7000如果出现:
Connection to <SERVER_PUBLIC_IP> 7000 port succeeded!说明网络已经打通。
然后:
sudo frpc -c /etc/frp/frpc.toml如果看到:
login to server success恭喜。
说明:
树莓派
│
│ 7000
▼
互联网
│
▼
云服务器 frps已经连通。
十三、把树莓派 SSH 映射到公网
现在只是 FRP 连上了,还不能 SSH。
先检查树莓派 SSH:
sudo ss -lntp | grep ':22'只要能看到:
:22说明 SSH 正常。
然后编辑:
sudo nano /etc/frp/frpc.toml完整配置改成:
serverAddr = "<SERVER_PUBLIC_IP>"
serverPort = 7000
auth.method = "token"
auth.token = "<FRP_TOKEN>"
[[proxies]]
name = "raspberrypi-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000这里最重要的是:
localPort = 22
remotePort = 6000意思就是:
云服务器 :6000
↓
FRP
↓
树莓派 :22十四、测试 SSH 映射
运行:
sudo frpc -c /etc/frp/frpc.toml如果看到:
login to server success
proxy added: [raspberrypi-ssh]
[raspberrypi-ssh] start proxy success说明 SSH 映射已经建立。
十五、开放公网 SSH 端口
现在还需要允许外网访问云服务器的:
6000/TCP云厂商安全组增加:
协议:TCP
端口:6000
操作:允许Ubuntu:
sudo ufw allow 6000/tcp云服务器检查:
sudo ss -lntp | grep 6000应该能看到 6000 正在监听。
十六、从外网登录树莓派
在外面的 Windows 电脑:
ssh -p 6000 <PI_USER>@<SERVER_PUBLIC_IP>第一次可能出现:
Are you sure you want to continue connecting?确认主机信息/指纹符合预期后输入:
yes然后输入树莓派密码。
成功后:
Windows
│
│ ssh -p 6000
▼
云服务器
│
│ FRP
▼
家里的树莓派这样即使树莓派没有公网 IP,也能从互联网登录。
十七、让树莓派 FRP 自动启动
现在还差最后一步。
如果树莓派重启,我们不希望每次手动执行:
frpc -c ...创建:
sudo nano /etc/systemd/system/frpc.service填写:
[Unit]
Description=FRP Client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/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 --no-pager看到:
enabled
active (running)就完成了。
十八、最终结构
全部配置完成以后:
Internet
│
│
SSH 公网端口 6000
│
▼
┌────────────────┐
│ 云服务器 │
│ │
│ frps │
│ :7000 │
└───────┬────────┘
│
│ FRP 隧道
│
┌───────▼────────┐
│ 树莓派 │
│ │
│ frpc │
│ SSH :22 │
└────────────────┘云服务器:
frps.service
enabled
active树莓派:
frpc.service
enabled
active因此正常情况下:
云服务器重启 → FRP 自动恢复
树莓派重启 → FRP 自动恢复
家里公网 IP 改变 → 不影响
家里路由器重启 → 树莓派联网后 FRP 自动重连
十九、平时怎么使用?
在家里
同一局域网内不需要走 FRP:
ssh <PI_USER>@<PI_LAN_IP>这是最直接的方式。
在外面
使用:
ssh -p 6000 <PI_USER>@<SERVER_PUBLIC_IP>FRP 会自动把连接转给家里的树莓派。
二十、以后怎么检查 FRP?
云服务器
查看状态:
sudo systemctl status frps --no-pager查看日志:
sudo journalctl -u frps -n 30 --no-pager实时日志:
sudo journalctl -u frps -f重启:
sudo systemctl restart frps检查端口:
sudo ss -lntp | grep -E '6000|7000'树莓派
查看:
sudo systemctl status frpc --no-pager日志:
sudo journalctl -u frpc -n 30 --no-pager实时:
sudo journalctl -u frpc -f重启:
sudo systemctl restart frpc二十一、如果突然连不上了怎么办?
不要乱改配置。
按照这个顺序检查:
树莓派能不能上网?
↓
frpc 是否 active?
↓
frpc 有没有 login to server success?
↓
云服务器 frps 是否 active?
↓
7000 是否监听?
↓
云服务器安全组是否开放 7000?
↓
UFW 是否开放 7000?
↓
raspberrypi-ssh 是否 start proxy success?
↓
6000 是否监听?
↓
安全组是否开放 6000?
↓
UFW 是否开放 6000?
↓
树莓派 SSH 是否监听 22?最常用的两个检查命令:
树莓派:
sudo systemctl status frpc --no-pager云服务器:
sudo systemctl status frps --no-pager二十二、以后还能拿 FRP 做什么?
现在 FRP 基础设施已经搭好了,以后不用重新安装 FRP。
例如树莓派运行一个网站:
树莓派 Web
:8080可以增加:
[[proxies]]
name = "raspberrypi-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8082然后:
sudo systemctl restart frpc就可以把树莓派 8080 服务送到云服务器。
同样可以用于:
树莓派网站
摄像头 Web 页面
Home Assistant
开发测试服务
NAS 管理页面
自己写的 Web 程序不过 Web 服务更推荐:
https://<YOUR_DOMAIN>
│
▼
云服务器 Nginx
│
▼
FRP 隧道
│
▼
树莓派网站这样访问者只看到:
https://<YOUR_DOMAIN>而不需要:
http://IP:8082并且 HTTPS、域名、访问认证等都可以放在云服务器 Nginx 上处理。
二十三、安全注意事项
目前这种方案非常方便,但要注意:
7000 是 FRP 通信端口。
它必须使用强随机 Token:
openssl rand -hex 32不要把真实 Token 写进教程、截图或公开仓库。
6000 是树莓派 SSH 的公网入口。
虽然不是默认 22,但仍然可能被互联网扫描到。
因此至少应该:
树莓派使用强密码
密码不要与其他网站共用
不允许 root 直接 SSH 登录
FRP Token 保密
不需要的公网端口不要开放
有需要时可以配置 SSH 密钥
有大量恶意登录时可以增加 Fail2ban
尤其是:
摄像头、家庭管理页面等涉及隐私的 Web 服务,不要在没有身份认证的情况下直接公开到互联网。
二十四、最容易忘记的几个地方
以后重新部署时,重点记住这几个坑:
① frps 装在云服务器
② frpc 装在树莓派
③ 两边 FRP 版本尽量保持一致
④ 两边 Token 必须完全相同
⑤ 7000 要同时通过:
云厂商安全组
Ubuntu UFW
⑥ 6000 同样要同时通过:
云厂商安全组
Ubuntu UFW
⑦ systemd 配置中的:
[Unit]
[Service]
[Install]
必须正确换行
⑧ frps.service 设置 enabled
⑨ frpc.service 设置 enabled
⑩ 配置修改后记得重启对应服务一句话总结
整套系统实际上就是:
外网设备
↓
云服务器公网 IP
↓
frps
↓
FRP 隧道
↓
frpc
↓
家里的树莓派第一次配置看起来步骤很多,但FRP 一旦搭好,后面增加树莓派的新服务通常只需要增加一个 [[proxies]] 配置即可。
这份文档里没有保存真实 IP、域名、用户名、密码或 Token,可以放心作为长期配置笔记保存。