基于华为云服务器与frp实现内网穿透连接树莓派

文章发布时间:

最后更新时间:

文章总字数:
4.8k

预计阅读时间:
18 分钟

放寒假了~ 买了好久的树莓派,终于可以开始玩了。

首先就是通过raspberry pi imager进行基本的系统下载,在下载系统时设置好wifi并打开ssh连接,然后树莓派开机连接wifi后就能用同一网络下的电脑使用ssh连接树莓派了,进一步的,如果下载的是有图形化界面的系统,就可以用VNC进行远程桌面操控。

因为没有显示屏,所以不得不使用这种方法连接树莓派咳咳

接着,就想到这种方法只能在同一局域网下通过电脑连接树莓派,如果我在其他地方要远程控制树莓派就行不通了。

没有公网ip 悲 如果有公网ip就不用这么麻烦了。

因此,就需要内网穿透技术,下面我将基于华为云服务器实现内网穿透通过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.准备工作

  1. 一台具有公网IP的服务器

    用于运行frp服务端(例如华为云服务器)。

    • 在购买华为云服务器时需要购买并绑定相应的弹性公网ip才能有网络连接
    • 华为云服务器的安全组的对应端口要打开,后面会提到
  2. 树莓派

    确保树莓派已连接到网络,并启用SSH。

  3. 下载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

2.在服务器上配置frp服务端

  1. 登录服务器

    使用SSH连接到你的公网服务器。

  2. 下载并解压frp

    1
    2
    3
    wget 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/
  3. 配置frp服务端

    编辑 frps.ini 文件:

    1
    nano frps.ini

    添加以下内容:

    1
    2
    [common]
    bind_port = 7000
    • bind_port 是frp服务端监听的端口。

    • 注意,此处的7000可以改成其他的端口,只要不冲突就行,也建议进行修改,在后续的安全组配置中要改成对应的端口号。

    保存并退出:

    1. 保存文件:

      按下 Ctrl + O(即按住 Ctrl 键,然后按 O 键)。

      Enter 确认保存。

    2. 退出 nano

      按下 Ctrl + X 退出编辑器。

  4. 启动frp服务端

    1
    ./frps -c frps.ini

    服务端会监听 7000 端口,等待客户端连接。

  5. 保持服务端运行

    可以使用 nohupsystemd 让frp服务端在后台运行:

    1
    nohup ./frps -c frps.ini > frps.log 2>&1 &
  6. 配置华为云安全组

    这一步是必须的,因为云服务商为了安全,默认会封锁所有入站端口。虽然你的云服务器系统内部的端口可能已经监听,但华为云的网络层面防火墙(安全组)会阻止外部访问。

    • 登录华为云控制台,找到你的服务器实例。

    • 进入“安全组”配置,添加以下规则:

      • 协议:TCP
      • 端口范围:7000(或者更改为其他的合法端口)
      • 源地址:0.0.0.0/0(或限制为你的电脑IP)
    • 保存规则。

7.检查服务端是否运行

1
ps aux | grep frps

如果没有输出,说明 frp 服务端未运行,需要重新启动:

1
./frps -c frps.ini

补充:在ssh连接下可以用ctrl+D快速退出ssh连接,也能输入exit退出ssh连接

3. 在树莓派上配置frp客户端

  1. 登录树莓派

    使用SSH连接到树莓派。

  2. 下载并解压frp

    1
    2
    3
    wget 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 的文件传输工具,可以将本地文件上传到远程服务器(如树莓派)。

    在本地电脑上执行以下命令

    1. 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/ 目录。
    2. 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 地址。
    3. 输入密码

      • 系统会提示你输入树莓派的密码(默认密码是 raspberry)。
      • 输入密码后,文件会上传到树莓派。
  3. 配置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 = 6000
    • server_addr:填写你的服务器公网IP。
    • server_port:与服务端的 bind_port 一致(默认7000,如果之前有修改,此处也要进行相应的修改)。
    • [ssh]:定义一个SSH隧道,将服务器的 6000 端口映射到树莓派的 22 端口。
  4. 配置华为云安全组

    这一步是必须的,因为需要允许你的电脑通过服务器的6000端口访问树莓派。

    • 登录华为云控制台,找到你的服务器实例

    • 进入”安全组”配置,添加以下规则:

      • 协议:TCP
      • 端口范围:6000(SSH转发端口)
      • 源地址:0.0.0.0/0(或限制为你的公网IP提高安全性)
    • 保存规则

  5. 启动frp客户端

    1
    ./frpc -c frpc.ini

    客户端会连接到服务器,并将服务器的 6000 端口映射到树莓派的SSH服务。

  6. 保持客户端运行

    可以使用 nohupsystemd 让frp客户端在后台运行:

    1
    nohup ./frpc -c frpc.ini > frpc.log 2>&1 &
  7. 检查客户端是否运行

    1
    ps aux | grep frpc

    如果没有输出,说明 frp 客户端未运行,需要重新启动:

    1
    ./frpc -c frpc.ini

    补充:在ssh连接下可以用ctrl+D快速退出ssh连接,也能输入exit退出ssh连接

  8. 检查 frp 客户端日志

    查看 frp 客户端的日志文件:

    1
    cat frpc.log

    如果连接成功,应该看到类似信息:

    1
    2
    login to server success
    [ssh] start proxy success

    如果日志中有错误信息(如连接失败),请根据错误信息进行排查。

  9. 检查端口监听状态

    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
  1. 通过服务器连接树莓派

    • 在自己的电脑上使用以下命令通过服务器的公网IP和映射端口连接树莓派:

      1
      ssh -p 6000 pi@服务器公网IP
    • 输入树莓派的用户名(默认 pi)和密码即可登录。

  2. 直接连接(如果配置了DDNS)

    • 如果服务器绑定了域名(如 mypi.ddns.net),可以使用域名连接:

      1
      ssh -p 6000 pi@mypi.ddns.net
  3. 连接成功验证

    如果连接成功,你会看到树莓派的终端提示符:

    1
    pi@raspberrypi:~ $
  4. 连接失败排查

    如果连接失败,请检查:

    1. 服务器安全组是否正确开放了6000和7000端口
    2. 树莓派frp客户端是否正常运行(ps aux | grep frpc
    3. 服务器frp服务端是否正常运行(ps aux | grep frps
    4. 查看frpc日志确认连接状态(cat frpc.log

至此,应该就可以基于华为云与frp实现内网穿透连接树莓派了,下面给出一些实用性和安全性建议

5. 设置开机自启动

为了确保frp客户端在树莓派重启后自动运行,可以将其设置为系统服务。

  1. 创建systemd服务文件

    1
    sudo nano /etc/systemd/system/frpc.service
  2. 添加以下内容

    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 等地方也要进行相应的修改。
  3. 启用并启动服务

    1
    2
    sudo systemctl enable frpc
    sudo systemctl start frpc
  4. 检查服务状态

    1
    sudo systemctl status frpc

6. 安全性建议

  1. 修改默认SSH端口

    在树莓派上修改SSH端口(如 2222),并在frp客户端配置中同步修改 local_port

  2. 使用密钥认证

    禁用密码登录,使用SSH密钥认证。

  3. 限制访问IP

    在服务器防火墙中限制 6000 端口的访问IP。

7. 同一局域网下使用VNC连接树莓派桌面

重要前提:确保树莓派和你的电脑在同一个局域网内。

  1. 打开树莓派配置工具

    运行以下命令打开 raspi-config

    1
    sudo raspi-config
  2. 选择合适的模式

    如果你的树莓派连接了物理显示器

    你的目标是远程看到和物理屏幕一模一样的内容。你需要使用 Service Mode

    1. 运行 sudo raspi-config
    2. 选择 Interfacing Options -> VNC -> Yes 启用。这默认启用的是 Service Mode
    3. (可选,但推荐)为了获得最佳VNC兼容性,你可以强制系统使用X11:
      • raspi-config 中,选择 Advanced Options -> A6 Wayland -> 选择 W1 X11
      • 确认OK自动重启系统后,VNC正常工作。

    如果你的树莓派没有连接物理显示器(无头模式)

    你的目标是创建一个可以远程访问的虚拟桌面。你需要使用 Virtual Mode

    1. 通过SSH连接到树莓派。
    2. 运行 sudo raspi-config
    3. 选择 Interfacing Options -> VNC
    4. 系统会检测到没有显示器,并弹出提示:“Cannot currently show the VNC desktop. Would you like to enable virtual mode instead? ”。
    5. 选择 Yes启用。这启用的是 Virtual Mode
  3. 配置 VNC 客户端

    • 在你电脑上下载并安装 RealVNC Viewer

    • 打开 VNC 客户端。

    • 在地址栏中输入树莓派的IP地址。

    • 点击连接。

    • 首次连接会有一个安全提示,选择Continue

    • 输入树莓派的用户名(默认: pi)和密码(默认: raspberry)。

8. 使用VNC远程连接树莓派桌面

  1. 打开树莓派配置工具

    运行以下命令打开 raspi-config

    1
    sudo raspi-config
  2. 启用 VNC

    • raspi-config 菜单中,选择 Interfacing Options
    • 选择 VNC,然后选择 Yes 启用 VNC。
  3. 设置分辨率(可选)

    • raspi-config 菜单中,选择 Display Options
    • 选择 Resolution,然后选择一个适合的分辨率(例如 1920x1080
  4. 完成配置

    • 退出 raspi-config 并重启树莓派:

      1
      sudo reboot
  5. 启动 Virtual Mode 服务

    • 运行以下命令启动 Virtual Mode 服务:

      1
      sudo /etc/vnc/vncservice start vncserver-virtuald
  6. 检查 Virtual Mode 状态

    • 运行以下命令检查 Virtual Mode 服务是否正常运行:

      1
      sudo /etc/vnc/vncservice status vncserver-virtuald
    • 如果服务未运行,尝试重启:

      1
      sudo /etc/vnc/vncservice restart vncserver-virtuald
  7. 确认 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
  8. 如果端口未监听

    • 可能是 Virtual Mode 服务未正确启动。尝试重启服务:

      1
      sudo /etc/vnc/vncservice restart vncserver-virtuald
  9. 在本地计算机上创建 SSH 隧道

    • 运行以下命令,将树莓派的 5901 端口转发到本地的 5901 端口:

      1
      ssh -L 5901:localhost:5901 -p 6000 pi@服务器公网ip
  10. 保持 SSH 隧道连接

    • 不要关闭这个 SSH 连接,保持它运行以维持隧道。
  11. 配置 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. 如何启用和切换模式?

这两种模式是互斥的。通常你只需要并只应启用其中一种。

  1. 通过 raspi-config 工具配置(推荐)

    1
    sudo raspi-config
    • 进入 3 Interface Options -> **I3 VNC**。
    • 选择是否启用 VNC Server。
    • 这里启用的是 Service Mode,因为它是最常见的用法。
    • 如果系统未检测到连接的显示器,它会提示你是否启用 Virtual Mode。
  2. 通过 systemctl 命令手动控制

    • **启用 Service Mode (禁用 Virtual Mode)**:

      1
      2
      3
      4
      sudo 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
      4
      sudo 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)。软件会自动发现可用的服务,无需手动指定端口。
打赏
微信 | Wechat