基于华为云服务器与frp实现内网穿透连接树莓派
最后更新时间:
文章总字数:
预计阅读时间:
放寒假了~ 买了好久的树莓派,终于可以开始玩了。
首先就是通过raspberry pi imager进行基本的系统下载,在下载系统时设置好wifi并打开ssh连接,然后树莓派开机连接wifi后就能用同一网络下的电脑使用ssh连接树莓派了,进一步的,如果下载的是有图形化界面的系统,就可以用VNC进行远程桌面操控。
接着,就想到这种方法只能在同一局域网下通过电脑连接树莓派,如果我在其他地方要远程控制树莓派就行不通了。因此,就需要内网穿透技术,下面我将基于华为云服务器实现内网穿透通过ssh连接树莓派。
补充:INI格式已过时,建议使用新格式TOML,出现问题的可能性会低很多,格式如下:
1
2
3
4
5
6
7
8
9
serverAddr = "你的服务器的IP地址"
serverPort = 你的服务器开放的端口
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 本地开放的端口
remotePort = 服务器转发到的端口
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
端口。
配置华为云安全组:
这一步是必须的,因为需要允许你的电脑通过服务器的6000端口访问树莓派。
登录华为云控制台,找到你的服务器实例
进入”安全组”配置,添加以下规则:
- 协议:TCP
- 端口范围:6000(SSH转发端口)
- 源地址:0.0.0.0/0(或限制为你的公网IP提高安全性)
保存规则
启动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 frpc
如果没有输出,说明 frp 客户端未运行,需要重新启动:
1
./frpc -c frpc.ini
补充:在ssh连接下可以用ctrl+D快速退出ssh连接,也能输入exit退出ssh连接
检查 frp 客户端日志:
查看 frp 客户端的日志文件:
1
cat frpc.log
如果连接成功,应该看到类似信息:
1
2login to server success
[ssh] start proxy success如果日志中有错误信息(如连接失败),请根据错误信息进行排查。
检查端口监听状态:
1
2# 在服务器上执行,检查6000端口是否被frps监听
netstat -tuln | grep 6000如果看到类似以下输出,说明端口已监听:
1
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
如果没有输出,说明frp服务端未正确监听转发端口。
4. 远程SSH连接树莓派
端口开放情况说明
- 服务器端开放端口:
- 7000端口:frp服务端控制端口,用于接收树莓派frp客户端的连接
- 6000端口:SSH转发端口,用于接收你的电脑的SSH连接
- 树莓派端开放端口:
- 22端口:本地SSH服务端口(仅限本地访问)
连接流程
1你的电脑 → 服务器:6000 → frp服务端 → frp客户端 → 树莓派:22
通过服务器连接树莓派:
在自己的电脑上使用以下命令通过服务器的公网IP和映射端口连接树莓派:
1
ssh -p 6000 pi@服务器公网IP
输入树莓派的用户名(默认
pi
)和密码即可登录。
直接连接(如果配置了DDNS):
如果服务器绑定了域名(如
mypi.ddns.net
),可以使用域名连接:1
ssh -p 6000 pi@mypi.ddns.net
连接成功验证
如果连接成功,你会看到树莓派的终端提示符:
1
pi@raspberrypi:~ $
连接失败排查
如果连接失败,请检查:
- 服务器安全组是否正确开放了6000和7000端口
- 树莓派frp客户端是否正常运行(
ps aux | grep frpc
) - 服务器frp服务端是否正常运行(
ps aux | grep frps
) - 查看frpc日志确认连接状态(
cat frpc.log
)
至此,应该就可以基于华为云与frp实现内网穿透连接树莓派了,下面给出一些实用性和安全性建议
5. 设置开机自启动
为了确保frp客户端在树莓派重启后自动运行,可以将其设置为系统服务。
创建systemd服务文件:
1
sudo nano /etc/systemd/system/frpc.service
添加以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[Unit]
Description=Frp Client Service
After=network.target
StartLimitInterval=0
[Service]
Type=simple
User=zenith
WorkingDirectory=/home/zenith/Desktop/frp_0.61.1_linux_arm
ExecStart=/home/pi/frp_0.61.1_linux_arm/frpc -c /home/pi/frp_0.61.1_linux_arm/frpc.ini
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target- 修改
ExecStart
路径为你的frp客户端实际路径。一般是将pi
改成你的树莓派的用户名即可,如果放在了Desktop
等地方也要进行相应的修改。
- 修改
启用并启动服务:
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
选择合适的模式
如果你的树莓派连接了物理显示器
你的目标是远程看到和物理屏幕一模一样的内容。你需要使用 Service Mode。
- 运行
sudo raspi-config
。 - 选择
Interfacing Options
->VNC
->Yes
启用。这默认启用的是 Service Mode。 - (可选,但推荐)为了获得最佳VNC兼容性,你可以强制系统使用X11:
- 在
raspi-config
中,选择Advanced Options
->A6 Wayland
-> 选择W1 X11
。 - 确认OK自动重启系统后,VNC正常工作。
- 在
如果你的树莓派没有连接物理显示器(无头模式)
你的目标是创建一个可以远程访问的虚拟桌面。你需要使用 Virtual Mode。
- 通过SSH连接到树莓派。
- 运行
sudo raspi-config
。 - 选择
Interfacing Options
->VNC
。 - 系统会检测到没有显示器,并弹出提示:“Cannot currently show the VNC desktop. Would you like to enable virtual mode instead? ”。
- 选择
Yes
启用。这启用的是 Virtual Mode。
- 运行
配置 VNC 客户端:
在你电脑上下载并安装 RealVNC Viewer。
打开 VNC 客户端。
在地址栏中输入树莓派的IP地址。
点击连接。
首次连接会有一个安全提示,选择
Continue
。输入树莓派的用户名(默认: pi)和密码(默认: raspberry)。
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) 详细对比
Virtual Mode 和 Service Mode 是 RealVNC Server 为适应不同使用场景而设计的两种运行模式。它们的核心区别在于是否依赖物理图形显示硬件。
1. Service Mode(服务模式 / X11 模式)
特点
- 适用场景:
- 用于远程访问当前正连接在树莓派上的物理显示器(如 HDMI 显示器或屏幕)所显示的桌面。
- 适合需要与本地物理屏幕进行完全相同交互的场景,例如调试图形界面应用程序或进行演示。
- 必须连接物理显示器才能正常工作,否则屏幕将为黑色或无法连接。
- 运行方式:
- 作为一个系统服务 (
vncserver-x11-serviced
) 在后台运行。- 直接共享当前的 X11 桌面会话。这意味着你看到的内容和物理显示器上的内容是完全一致的。
- 性能:
- 性能极佳,因为它可以直接利用树莓派的 GPU 进行硬件加速,处理图形渲染的效率很高。
- 延迟低,流畅度高,适合播放视频或运行图形密集型应用。
- 端口:
- 不固定使用 5900 端口。RealVNC 使用一种自动发现机制,通常通过 VNC Viewer 直接输入树莓派的主机名(如
raspberrypi.local
)进行连接,而非手动指定端口。- 如果必须使用端口,它通常显示为显示端口 0,对应的网络端口是 5900。
优点
- 提供与物理显示器完全一致的桌面体验。
- 图形性能优秀,延迟低。
- 无需创建新的桌面会话,开箱即用。
缺点
- 严重依赖物理显示器。如果显示器断电或被拔掉,远程连接可能会出现问题。
2. Virtual Mode(虚拟模式)
特点
- 适用场景:
- 用于为没有连接物理显示器的树莓派(即无头模式 / Headless Mode)创建一个虚拟的桌面环境。
- 适合纯粹的远程访问和管理,例如将树莓派作为服务器、家庭自动化主机或后台服务运行。
- 运行方式:
- 作为一个独立的系统服务 (
vncserver-virtuald
) 在后台运行。- 它会创建一个全新的虚拟桌面会话(默认使用 Wayland 或 X11),这个会话与物理显示器完全无关。
- 性能:
- 性能相对较差,因为它无法使用 GPU 硬件加速,所有图形渲染均由 CPU 完成,开销较大。
- 延迟较高,在运行图形化应用时可能感到卡顿。
- 端口:
- 同样通过自动发现机制连接。
- 它会创建新的显示端口(例如 :1),对应的网络端口为 5901。如果创建第二个虚拟模式会话,端口会变为 5902,以此类推。
优点
- 不需要物理显示器,是无头设置的理想选择。
- 可以随时随地远程访问树莓派的独立桌面环境。
- 可以创建多个独立的虚拟桌面会话。
缺点
- 图形性能较弱,不适合处理复杂的图形或视频。
- 是一个独立会话,无法看到物理显示器上的内容。
3. 对比总结
特性 Service Mode(服务模式) Virtual Mode(虚拟模式) 适用场景 需要访问物理显示器内容 无头模式,无需物理显示器 运行方式 共享现有的 X11 桌面会话 创建新的虚拟桌面会话 图形加速 支持 (GPU 硬件加速) 不支持 (纯 CPU 渲染) 性能 高,延迟低 较低,延迟较高 默认端口 :0
(端口 5900):1
(端口 5901)是否需要显示器 是 否 会话独立性 与物理显示会话一致 独立的虚拟会话 4. 如何选择?
- 选择 Service Mode:
- 树莓派连接了显示器,并且你希望远程看到和操作屏幕上正在显示的内容。
- 需要运行图形化应用、播放视频或进行任何需要良好图形性能的操作。
- 选择 Virtual Mode:
- 树莓派没有连接任何显示器。
- 你只需要一个远程桌面来安装软件、修改配置、运行基本程序,对图形性能要求不高。
5. 如何启用和切换模式?
这两种模式是互斥的。通常你只需要并只应启用其中一种。
通过
raspi-config
工具配置(推荐):
1sudo raspi-config
- 进入
3 Interface Options
-> **I3 VNC
**。- 选择是否启用 VNC Server。
- 这里启用的是 Service Mode,因为它是最常见的用法。
- 如果系统未检测到连接的显示器,它会提示你是否启用 Virtual Mode。
通过
systemctl
命令手动控制:
**启用 Service Mode (禁用 Virtual Mode)**:
1
2
3
4sudo systemctl enable vncserver-x11-serviced.service # 设置开机自启
sudo systemctl start vncserver-x11-serviced.service # 立即启动
sudo systemctl disable vncserver-virtuald.service # 禁止Virtual模式开机自启
sudo systemctl stop vncserver-virtuald.service # 立即停止Virtual模式**启用 Virtual Mode (禁用 Service Mode)**:
1
2
3
4sudo systemctl enable vncserver-virtuald.service # 设置开机自启
sudo systemctl start vncserver-virtuald.service # 立即启动
sudo systemctl disable vncserver-x11-serviced.service # 禁止Service模式开机自启
sudo systemctl stop vncserver-x11-serviced.service # 立即停止Service模式6. 注意事项
- 不要同时运行两种模式:虽然它们的端口不同,但同时运行会占用更多系统资源,且完全没必要。根据你的显示器连接情况选择一种即可。
- 无头模式首选 Virtual Mode:如果你的树莓派从不连接显示器,务必启用 Virtual Mode 并禁用 Service Mode。
- 连接方式:对于家庭网络用户,最简单的方式是使用 VNC Viewer 并输入树莓派的主机名(例如
raspberrypi.local
)。软件会自动发现可用的服务,无需手动指定端口。
打赏
