折腾记录 | 基于frp,使用公网服务器为树莓派做内网穿透

Bruce
2025-01-01 / 0 评论 / 15 阅读 / 正在检测是否收录...

树莓派,初听起来有些像某种水果派,但实际上是一块巴掌一般大的计算机。除了没有鼠标、键盘、显示器外,一个计算机该有的功能它都有。

第一代树莓派诞生于2012年2月29日,发明者是英国工程师Eben Upton。在当时,学校里使用的“BBC Micro model B”计算机高达350英镑,费用十分高昂,学校难以为所有学生都购买一台作为教学使用。这也间接导致计算机专业报名学生人数较少且计算机基础一般。因此,Eben Upton希望研发一款价格亲民、耐用且便携的电脑,让所有学生都能用得起。

Eben Upton, Raspberry Pi co-founder

第一代树莓派价格仅35美元,一经推出便爆火,发布在网上的树莓派操作系统就被下载了50000次,远远超过树莓派计划投入生产的数量。

2013年,树莓派获得了INDEX设计奖;2017年,又获得英国历史最悠久的工程创新奖——英国皇家工程院MacRobert奖。

img

有宅男调侃称,考虑到成本、适配性、易理解度、能耗、多任务处理性能,树莓派的所有指标都胜出女友。

最近准备转正答辩压力很大,突发奇想入了一台树莓派5,在休息的空隙折腾了一番。

我买的是官方套件,包含主板、外壳、电源适配器、散热风扇、HDMI转接线、32GB内存卡、读卡器。

image-20250101190829495

按照 说明书 第六感,直接上手组装,不过在装好外壳后插拔SD卡时还是需要小心一点。

Step 1、安装系统

第1步、下载Raspberry Pi Imager
前往树莓派官网下载Raspberry Pi Imager,它可以理解为系统安装工具,官网提供了Windows、Mac和Ubuntu系统的版本。

image-20250101192205367

第2步、下载树莓派操作系统
树莓派操作系统分为带桌面版和无桌面版,作为懒人直接选择带桌面和推荐软件的版本。

image-20250101192545705

第3步、安装操作系统
将SD卡插入读卡器,然后将读卡器插入到电脑接口,启动Raspberry Pi Imager,点击“选择需要写入的操作系统”后,选择 “Use Custom”,勾选第一步下载的镜像,然后按照引导的流程一步步配置,开启SSH,设置热点名称和密码、设置树莓派用户名和密码、语言和时区。

image-20250101193517125

Step 2、使用SSH登录后台

第1步、树莓派开机

将SD卡从读卡器上取下,然后插入到树莓派主板,连接上电源。登录家里路由器后台,查看树莓派的本地IP。

image-20250101194448593

第2步、使用SSH工具连接树莓派

在SSH工具中填写树莓派本地IP、用户名、密码后直接连接,连接成功后即可进入。

image-20250101195230665

Windows系统可以使用“远程桌面连接”工具,输入树莓派IP、用户名和密码后即可登录树莓派桌面。

image-20250101195520971

树莓派会自动适配屏幕分辨率,如果显示不正常可以前往手动设置,详细设置步骤可在网上搜索教程。

image-20250101195520972

此外,可以检查下树莓派系统时间是否正确,如果系统时间不准确会导致后续无法正常下载文件

#查看当前时间
date

# 校准时间
sudo ntpd -s -d

Step 3、内网穿透

现在我们的树莓派已经可以实现本地访问,但要想被互联网上的其他用户访问就需要做内网穿透。

我自己有一台轻量云服务器,所以内网穿透的方案选择了比较主流的frp项目,项目地址见:https://github.com/fatedier/frp

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

frp由客户端frpc和服务端frps组成,客户端部署在本地树莓派,服务端部署在公网服务器。

第1步、配置frp客户端

需要根据树莓派CPU下载对应版本的frp软件:

# 查看树莓派cpu配置
lscpu

image-20250101202454182

在release中选择合适的版本下载,下载链接见https://github.com/fatedier/frp/releases/tag/v0.61.1

image-20250101202650826

# 下载frp
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm_hf.tar.gz

# 解压文件
tar -xzvf frp_0.61.1_linux_arm_hf.tar.gz

# 删除文件夹下的frps相关文件
sudo rm frps.toml
sudo rm frps

接下来修改客户端配置文件frpc.toml

# 进入frp文件夹
cd frp_0.61.0_linux_arm_hf

# 修改frpc.toml文件
sudo nano frpc.toml

# 在frpc.toml中写入下列内容
serverAddr = "XXX.XX.XX.XX" #公网服务器ip
serverPort = 7000 #公网服务器端口

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "192.168.2.69" #树莓派本地ip
localPort = 22
remotePort = 6000

# 保存文件后退出

前往公网服务器,放行6000、7000端口

# 进入frp文件夹
cd frp_0.61.0_linux_arm_hf

# 启动frpc
./frpc -c frpc.toml

第2步、配置frp服务端

# 查看公网服务器cpu信息
lscpu

image-20250101203729112

在release中选择合适的版本下载,下载链接见https://github.com/fatedier/frp/releases/tag/v0.61.1

# 下载frp
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm64.tar.gz

# 解压文件
tar -xzvf frp_0.61.1_linux_arm64.tar.gz

# 删除文件夹下的frpc相关文件
sudo rm frpc.toml
sudo rm frpc

# 修改frps配置文件
sudo nano frps.toml

# 在frps.toml写入以下信息
[common]
bind_port = 7000

# 保存后退出,启动frps
./frps -c frps.toml

配置公网服务器的frps.toml

# 进入frps.toml
cd /etc/frp
sudo vim frps.toml

在配置中添加下面内容后保存
bindPort = 7000 # 通过frps服务端7000端口的请求都会被转发到树莓派SSH服务
vhostHTTPPort = 8082 # 来自互联网的访问都通过8082

以上流程完成后,服务端和客户端就连接起来了。

在外网,可以在命令行中输入下面内容访问树莓派

ssh -oPort=6000 pi@xxx.xxx.xx.xxx

image-20250101222630008

pi是树莓派的用户名,如果你在烧录系统时使用了其他的用户名,需要修改对应的用户名

@xxx.xxx.xx.xxx是公网服务器ip

Step 4、配置frp开机自启

由于断电、断网、公网服务器故障等各种因素,可能会导致frp异常断开,需要手动重新启动。但这样非常不方便,为了能让服务器恢复后frp也恢复正常,因此配置frp自启动。

开机自启动主要就是运用 systemd 功能,要把 service文件创建在/lib/systemd/system 目录下。

第1步、配置frps自启动

# 复制frps文件到 /usr/bin/ 目录下
sudo cp frps /usr/bin/frps

# 复制frps.toml文件到 /etc/frp 目录下,不存在该目录就先创建
sudo mkdir /etc/frp
sudo cp frps.toml /etc/frp/frps.toml

# 创建一个frps.service文件
sudo nano frps.service

# 在frps.service文件中写入下面内容
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=1min
ExecStart=/usr/bin/frps -c /etc/frp/frps.toml

[Install]
WantedBy=multi-user.target

# 复制frps.service文件到 /lib/systemd/system 目录下
sudo cp frps.service /lib/systemd/system/frps.service

# 使用systemctl的命令启动并设置自启
sudo systemctl start frps # 启动frps
sudo systemctl status frps # 查看目前的运行状态
sudo systemctl stop frps # 停止frps
sudo systemctl enable frps # 设置开机自启动

# 设置好后重启服务器看下效果
sudo reboot
sudo systemctl status frps

第2步、配置frpc自启动

# 复制frpc文件到 /usr/bin/ 目录下
sudo cp frpc /usr/bin/frpc

# 复制frpc.toml文件到 /etc/frp 目录下,不存在该目录就先创建
sudo mkdir /etc/frp
sudo cp frpc.toml /etc/frp/frpc.toml

# 创建一个 frpc.service 文件
sudo nano frpc.service

# 在frpc.service文件中写入下面内容
[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
TimeoutStartSec=30
Restart=always
RestartSec=1min
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.toml

[Install]
WantedBy=multi-user.target

# 复制frpc.service文件到 /lib/systemd/system 目录下
sudo cp frpc.service /lib/systemd/system/frpc.service

使用systemctl的命令启动并设置自启
sudo systemctl start frpc # 启动frpc
sudo systemctl status frpc # 查看目前的运行状态
sudo systemctl stop frpc # 停止frpc
sudo systemctl enable frpc # 设置开机自启动

设置好后重启树莓派看下效果
sudo reboot
sudo systemctl status frpc

Step 5、通过域名访问树莓派网站

在本地部署网站后,只能通过公网ip+端口访问网站,这样不便于用户记忆,因此为网站绑定域名

第1步、安装网站运行时依赖的软件:nginx、php、MariaDB

第2步、创建一个网页文件
网页文件名称设置为域名,例如www.example.com

# 进入root权限
sudo -i

# 在www文件夹下创建一个网站文件夹
cd /var/www
mkdir www.example.com

在网站文件夹www.example.com下创建index.php
nano index.php

# 文件中写入下面内容并保存
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PHP Environment Test Page</title>
</head>
<body>
    <h1>PHP Environment Test Page by Bruce</h1>
    <p>This page is generated by PHP to test the environment.</p>

    <h2>Current Date and Time</h2>
    <p><?php echo date('Y-m-d H:i:s'); ?></p>

    <h2>PHP Version</h2>
    <p><?php echo phpversion(); ?></p>

    <h2>Server Information</h2>
    <ul>
        <li>Server Software: <?php echo $_SERVER['SERVER_SOFTWARE']; ?></li>
        <li>Server Name: <?php echo $_SERVER['SERVER_NAME']; ?></li>
        <li>Server Address: <?php echo $_SERVER['SERVER_ADDR']; ?></li>
        <li>Server Port: <?php echo $_SERVER['SERVER_PORT']; ?></li>
        <li>Remote Address: <?php echo $_SERVER['REMOTE_ADDR']; ?></li>
    </ul>
</body>

第3步、配置树莓派nginx

# 在树莓派nginx上配置sites-available和sites-enable文件

#在nginx的sites-available文件夹下创建一个名称为该网页的文件
sudo nano /etc/nginx/sites-available/www.example.com

# 在文件中写入下面配置,监听8081端口
server {
    listen 8081;
    server_name www.example.com;

    root /var/www/www.example.com;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

# 创建一个指向新配置文件的符号链接,以便Nginx能够识别并启用它
sudo ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/

# 修改nginx配置后,测试Nginx的配置以确保没有语法错误
sudo nginx -t

# 如果配置测试成功,重启Nginx服务以使更改生效
sudo systemctl restart nginx

备注: 如果在树莓派上部署的网站已经默认选择了端口,则无需再次配置树莓派的nginx。例如通过一个脚本直接在树莓派部署了一个网站,这个网站有默认端口,可以通过内网ip+端口访问到,那这种情况就不用配置nginx。

第4步、配置frp客户端配置文件

frpc.toml文件中添加下面的配置,目的是为了让外部用户能够通过访问www.example.com这个域名,间接访问到运行在树莓派8081端口的网站

# 在etc文件夹下的frpc.toml中添加配置
cd /etc/frp
sudo nano frpc.toml

# 在frpc.toml文件尾部添加下面内容
[[proxies]]
name = "Raspberry Pi"
type = "http"
localPort = 8081
customDomains = ["www.example.com"]

第5步、域名解析配置
将www.example.com解析到公网服务器ip

第6步、配置公网服务器的nginx或添加反向代理

由于我的公网服务器使用了宝塔面板,因此直接使用宝塔面板的反代服务

image-20250101222848149

网站名称自定义,8082端口是固定的。最后建议在宝塔面板中申请SSL证书,实现加密连接。

一些常用的命令

#修改frpc.toml
cd /etc/frp
sudo nano frpc.toml
sudo systemctl restart frpc.service
sudo systemctl status frpc.service

# 修改frps.toml
cd /etc/frp
sudo vim frps.toml
sudo systemctl restart frps.service
sudo systemctl status frps.service

## 修改nginx配置文件(部署网站时要记得修改哦)
cd /etc/nginx/sites-available/
cd /etc/nginx/sites-enabled/

# 创建一个指向新配置文件的符号链接,以便Nginx能够识别并启用它
sudo ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/

# 检查nginx语法后重启
sudo nginx -t
sudo systemctl restart nginx

写在最后

以上便是整个折腾过程,使用frp项目,借助公网服务器为树莓派做内网穿透,然后解析域名实现域名访问内网网站。

作为小白,对linux命令和服务器通信原理一窍不通,所以在折腾的过程中遇到的问题很多,但通过GPT查询和搜索一个个都还是解决了。这里主要记录了思路和主要操作步骤,作为备忘未来查询,或者供感兴趣的朋友们参考。

主要参考来源

  1. The Epic Story of the Raspberry Pi,https://raspberrytips.com/raspberry-pi-history/
  2. 树莓派的前世今生:10年,售出4600万台!https://shumeipai.nxez.com/2022/03/01/raspberry-pis-tenth-birthday.html
  3. 使用frp内网穿透,实现远程访问树莓派,https://blog.csdn.net/weixin_44614230/article/details/127611454
  4. 树莓派(Raspberry Pi)日期时间不准的修正方法,https://blog.csdn.net/weixin_37706204/article/details/130078414
1

评论 (0)

取消