基于华为云与frp实现内网穿透连接树莓派
Last Update:
Word Count:
Read Time:
放寒假了~ 买了好久的树莓派,终于可以开始玩了。
首先就是通过raspberry pi imager进行基本的系统下载,在下载系统时设置好wifi并打开ssh连接,然后树莓派开机连接wifi后就能用同一网络下的电脑使用ssh连接树莓派了,进一步的,如果下载的是有图形化界面的系统,就可以用VNC进行远程桌面操控。
接着,就想到这种方法只能在同一局域网下通过电脑连接树莓派,如果我在其他地方要远程控制树莓派就行不通了。因此,就需要内网穿透技术,下面我将基于华为云服务器实现内网穿透通过ssh连接树莓派。
1.准备工作
一台具有公网IP的服务器:
用于运行frp服务端(例如华为云服务器)。
- 在购买华为云服务器时需要购买并绑定相应的弹性公网ip才能有网络连接
- 华为云服务器的安全组的对应端口要打开,后面会提到
树莓派:
确保树莓派已连接到网络,并启用SSH。
下载frp:
访问 frp GitHub Releases 下载适合树莓派和服务器的版本。
- 树莓派(ARM架构):
frp_0.xx.0_linux_arm.tar.gz
(我下载时最新的版本是frp_0.61.1_linux_arm.tar.gz
) - 服务器(x86架构):
frp_0.xx.0_linux_amd64.tar.gz
(我下载时最新的版本是frp_0.61.1_linux_amd64.tar.gz
)
- 树莓派(ARM架构):
2.在服务器上配置frp服务端
登录服务器:
使用SSH连接到你的公网服务器。
下载并解压frp:
1
2
3wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
tar -zxvf frp_0.61.1_linux_amd64.tar.gz
cd frp_0.61.1_linux_amd64注意,
wget
在尝试下载frp
时有几率遇到连接问题,可能是由于网络问题或 GitHub 的访问限制。此时可以在自己的电脑上下载,下载完后通过winSCP将文件传给华为云服务器,或者通过scp命令将文件传给服务器。1
scp frp_0.61.1_linux_amd64.tar.gz root@服务器公网IP:/root/
配置frp服务端:
编辑
frps.ini
文件:1
nano frps.ini
添加以下内容:
1
2[common]
bind_port = 7000bind_port
是frp服务端监听的端口。注意,此处的7000可以改成其他的端口,只要不冲突就行,也建议进行修改,在后续的安全组配置中要改成对应的端口号。
保存并退出:
保存文件:
按下
Ctrl + O
(即按住Ctrl
键,然后按O
键)。按
Enter
确认保存。退出
nano
:按下
Ctrl + X
退出编辑器。
启动frp服务端:
1
./frps -c frps.ini
服务端会监听
7000
端口,等待客户端连接。保持服务端运行:
可以使用
nohup
或systemd
让frp服务端在后台运行:1
nohup ./frps -c frps.ini > frps.log 2>&1 &
配置华为云安全组:
登录华为云控制台,找到你的服务器实例。
进入“安全组”配置,添加以下规则:
- 协议:TCP
- 端口范围:7000(或者更改为其他的合法端口)
- 源地址:0.0.0.0/0(或限制为你的电脑IP)
保存规则。
7.检查服务端是否运行:
1 |
|
如果没有输出,说明 frp 服务端未运行,需要重新启动:
1 |
|
补充:在ssh连接下可以用ctrl+D快速退出ssh连接,也能输入exit退出ssh连接
3. 在树莓派上配置frp客户端
登录树莓派:
使用SSH连接到树莓派。
下载并解压frp:
1
2
3wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm.tar.gz
tar -zxvf frp_0.61.1_linux_arm.tar.gz
cd frp_0.61.1_linux_arm注意,此处和上面的问题一样,在下载frp时可能会有一些问题,此时可以在自己的电脑上下载,下载完后通过winSCP将文件传给树莓派,或者通过scp命令将文件传给树莓派。
使用
scp
上传文件scp
是一个基于 SSH 的文件传输工具,可以将本地文件上传到远程服务器(如树莓派)。在本地电脑上执行以下命令:
Mac/Linux:
打开终端,运行以下命令:
1
scp /path/to/frp_0.61.1_linux_arm.tar.gz pi@树莓派IP:/home/pi/
- 将
/path/to/frp_0.61.1_linux_arm.tar.gz
替换为文件的实际路径。 - 将
树莓派IP
替换为树莓派的局域网 IP 地址(如192.168.1.100
)。 - 默认上传到树莓派的
/home/pi/
目录。
- 将
Windows:
如果你使用的是 PowerShell,可以运行以下命令:
1
scp C:\Users\username\Downloads\frp_0.61.1_linux_arm.tar.gz pi@树莓派IP:/home/pi/
- 将
C:\Users\username\Downloads\frp_0.61.1_linux_arm.tar.gz
替换为文件的实际路径。 - 将
树莓派IP
替换为树莓派的局域网 IP 地址。
- 将
输入密码:
- 系统会提示你输入树莓派的密码(默认密码是
raspberry
)。 - 输入密码后,文件会上传到树莓派。
- 系统会提示你输入树莓派的密码(默认密码是
配置frp客户端:
编辑
frpc.ini
文件:1
nano frpc.ini
添加以下内容:
1
2
3
4
5
6
7
8
9[common]
server_addr = 服务器公网IP
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000server_addr
:填写你的服务器公网IP。server_port
:与服务端的bind_port
一致(默认7000,如果之前有修改,此处也要进行相应的修改)。[ssh]
:定义一个SSH隧道,将服务器的6000
端口映射到树莓派的22
端口。
启动frp客户端:
1
./frpc -c frpc.ini
客户端会连接到服务器,并将服务器的
6000
端口映射到树莓派的SSH服务。保持客户端运行:
可以使用
nohup
或systemd
让frp客户端在后台运行:1
nohup ./frpc -c frpc.ini > frpc.log 2>&1 &
检查服务端是否运行:
1
ps aux | grep frps
如果没有输出,说明 frp 客户端未运行,需要重新启动:
1
./frpc -c frpc.ini
补充:在ssh连接下可以用ctrl+D快速退出ssh连接,也能输入exit退出ssh连接
检查端口监听状态:
运行以下命令,检查
7000
端口是否被 frp 服务端监听:1
sudo netstat -tuln | grep 7000
如果看到类似以下输出,说明端口已监听:
1
tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN
如果没有输出,说明 frp 服务端未正确监听端口。
检查 frp 客户端日志:
查看 frp 客户端的日志文件:
1
cat frpc.log
如果日志中有错误信息(如连接失败),请根据错误信息进行排查。
4. 远程SSH连接树莓派
通过服务器连接树莓派:
在自己的电脑上使用以下命令通过服务器的公网IP和映射端口连接树莓派:
1
ssh -p 6000 pi@服务器公网IP
输入树莓派的用户名(默认
pi
)和密码即可登录。
直接连接(如果配置了DDNS):
如果服务器绑定了域名(如
mypi.ddns.net
),可以使用域名连接:1
ssh -p 6000 [email protected]
至此,应该就可以基于华为云与frp实现内网穿透连接树莓派了,下面给出一些实用性和安全性建议
5. 设置开机自启动
为了确保frp客户端在树莓派重启后自动运行,可以将其设置为系统服务。
创建systemd服务文件:
1
sudo nano /etc/systemd/system/frpc.service
添加以下内容:
1
2
3
4
5
6
7
8
9
10[Unit]
Description=Frp Client Service
After=network.target
[Service]
ExecStart=/home/pi/frp_0.61.1_linux_arm/frpc -c /home/pi/frp_0.61.1_linux_arm/frpc.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target- 修改
ExecStart
路径为你的frp客户端实际路径。
- 修改
启用并启动服务:
1
2sudo systemctl enable frpc
sudo systemctl start frpc检查服务状态:
1
sudo systemctl status frpc
6. 安全性建议
修改默认SSH端口:
在树莓派上修改SSH端口(如
2222
),并在frp客户端配置中同步修改local_port
。使用密钥认证:
禁用密码登录,使用SSH密钥认证。
限制访问IP:
在服务器防火墙中限制
6000
端口的访问IP。
7**. 同一局域网下使用VNC连接树莓派桌面**
打开树莓派配置工具:
运行以下命令打开
raspi-config
:1
sudo raspi-config
启用X11模式
- 在
raspi-config
菜单中,选择 Advanced Options。 - 选择A6 Wayland。
- 选择W1 X11模式。
- 确认OK自动重启系统。
- 在
启用 VNC:
- 在
raspi-config
菜单中,选择 Interfacing Options。 - 选择 VNC,然后选择 Yes 启用 VNC。
- 在
配置 VNC 客户端:
打开 VNC 客户端。
在地址栏中输入树莓派的IP地址。
点击连接。
8. 使用VNC远程连接树莓派桌面
打开树莓派配置工具:
运行以下命令打开
raspi-config
:1
sudo raspi-config
启用 VNC:
- 在
raspi-config
菜单中,选择 Interfacing Options。 - 选择 VNC,然后选择 Yes 启用 VNC。
- 在
设置分辨率(可选):
- 在
raspi-config
菜单中,选择 Display Options。 - 选择 Resolution,然后选择一个适合的分辨率(例如
1920x1080
)
- 在
完成配置:
退出
raspi-config
并重启树莓派:1
sudo reboot
启动 Virtual Mode 服务:
运行以下命令启动 Virtual Mode 服务:
1
sudo /etc/vnc/vncservice start vncserver-virtuald
检查 Virtual Mode 状态:
运行以下命令检查 Virtual Mode 服务是否正常运行:
1
sudo /etc/vnc/vncservice status vncserver-virtuald
如果服务未运行,尝试重启:
1
sudo /etc/vnc/vncservice restart vncserver-virtuald
确认 Virtual Mode 端口:
Virtual Mode 默认使用
5901
端口。运行以下命令检查端口是否监听:1
sudo netstat -tuln | grep 5901
如果看到类似以下输出,说明 Virtual Mode 正在监听:
1
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN
如果端口未监听:
可能是 Virtual Mode 服务未正确启动。尝试重启服务:
1
sudo /etc/vnc/vncservice restart vncserver-virtuald
在本地计算机上创建 SSH 隧道:
运行以下命令,将树莓派的
5901
端口转发到本地的5901
端口:1
ssh -L 5901:localhost:5901 -p 6000 pi@服务器公网ip
保持 SSH 隧道连接:
- 不要关闭这个 SSH 连接,保持它运行以维持隧道。
配置 VNC 客户端:
- 打开 VNC 客户端。
- 在地址栏中输入
localhost:5901
。 - 点击连接。
Virtual Mode 和 Service Mode 是 RealVNC 提供的两种不同的运行模式,它们的主要区别在于 适用场景、运行方式 和 性能表现。以下是它们的详细对比:
1. Service Mode(服务模式)
特点
- 适用场景:
- 用于直接访问树莓派的物理显示器(即连接了 HDMI 显示器或屏幕)。
- 适合需要与物理显示器交互的场景,例如调试图形界面或运行图形化应用程序。
- 运行方式:
- 作为一个系统服务运行,由
vncserver-x11-serviced
管理。- 直接连接到树莓派的物理显示器(X11 会话)。
- 性能:
- 性能较好,因为直接使用物理显示器的硬件加速。
- 延迟较低,适合图形密集型应用。
- 端口:
- 默认使用
5900
端口。优点
- 直接访问物理显示器,适合需要与本地屏幕交互的场景。
- 性能较好,延迟较低。
缺点
- 需要连接物理显示器,否则无法使用。
- 如果没有物理显示器,Service Mode 可能无法正常工作。
2. Virtual Mode(虚拟模式)
特点
- 适用场景:
- 用于在没有物理显示器的情况下远程访问树莓派桌面。
- 适合纯远程访问的场景,例如服务器或无头模式(Headless Mode)下的树莓派。
- 运行方式:
- 作为一个虚拟显示器运行,由
vncserver-virtuald
管理。- 不需要物理显示器,即使树莓派没有连接屏幕也可以使用。
- 性能:
- 性能稍差,因为没有硬件加速。
- 延迟较高,尤其是在图形密集型应用中。
- 端口:
- 默认使用
5901
端口。优点
- 不需要物理显示器,适合无头模式(Headless Mode)下的树莓派。
- 可以随时随地远程访问树莓派桌面。
缺点
- 性能较差,延迟较高。
- 不支持硬件加速,图形性能有限。
3. 对比总结
特性 Service Mode(服务模式) Virtual Mode(虚拟模式) 适用场景 需要物理显示器,适合本地调试 不需要物理显示器,适合纯远程访问 运行方式 直接连接到物理显示器(X11 会话) 虚拟显示器,无需物理显示器 性能 性能较好,延迟较低 性能较差,延迟较高 端口 默认 5900
默认 5901
是否需要显示器 需要 不需要 适合场景 图形化应用、本地调试 无头模式、远程访问
4. 如何选择?
选择 Service Mode:
- 如果你连接了物理显示器(如 HDMI 屏幕),并且需要与本地屏幕交互。
- 如果你需要较高的图形性能(例如运行图形化应用程序或游戏)。
选择 Virtual Mode:
- 如果你的树莓派没有连接物理显示器(无头模式)。
- 如果你只需要远程访问树莓派桌面,且对图形性能要求不高。
5. 如何切换模式?
启用 Service Mode:
- 运行以下命令启动 Service Mode:
1
sudo /etc/vnc/vncservice start vncserver-x11-serviced
- 确保在
raspi-config
中启用了 VNC:
1
sudo raspi-config
- 选择 Interfacing Options -> VNC -> Enable。
启用 Virtual Mode:
- 运行以下命令启动 Virtual Mode:
1
sudo /etc/vnc/vncservice start vncserver-virtuald
- 确保 Virtual Mode 服务已启用:
1
sudo /etc/vnc/vncservice enable vncserver-virtuald
切换模式:
- 如果需要从 Service Mode 切换到 Virtual Mode,先停止 Service Mode:
1
sudo /etc/vnc/vncservice stop vncserver-x11-serviced
- 然后启动 Virtual Mode:
1
sudo /etc/vnc/vncservice start vncserver-virtuald
6. 注意事项
- 端口冲突:
- Service Mode 和 Virtual Mode 默认使用不同的端口(
5900
和5901
),因此可以同时运行,但通常不建议这样做。- 性能优化:
- 在 Virtual Mode 下,可以通过降低分辨率或启用压缩来优化性能。
- 无头模式:
- 如果你的树莓派没有连接显示器,建议使用 Virtual Mode。
总结
- Service Mode 适合连接物理显示器的场景,性能较好。
- Virtual Mode 适合无头模式下的远程访问,无需物理显示器。