侧边栏壁纸
博主头像
未完待续

记录电影、影像、生活,以及偶尔的折腾。

  • 累计撰写 6 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

FPR内网穿透|仅需一台云服务器,十分钟即可访问家里的树莓派

有心人无名氏
2026-08-27 / 0 评论 / 0 点赞 / 10 阅读 / 0 字

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,可以放心作为长期配置笔记保存。

0
博主关闭了所有页面的评论