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

First Post:

Last Update:

Word Count:
3.5k

Read Time:
13 min

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

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

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

接着,就想到这种方法只能在同一局域网下通过电脑连接树莓派,如果我在其他地方要远程控制树莓派就行不通了。因此,就需要内网穿透技术,下面我将基于华为云服务器实现内网穿透通过ssh连接树莓派。

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. 启动frp客户端

    1
    ./frpc -c frpc.ini

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

  5. 保持客户端运行

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

    1
    nohup ./frpc -c frpc.ini > frpc.log 2>&1 &
  6. 检查服务端是否运行

    1
    ps aux | grep frps

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

    1
    ./frpc -c frpc.ini

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

  7. 检查端口监听状态

    运行以下命令,检查 7000 端口是否被 frp 服务端监听:

    1
    sudo netstat -tuln | grep 7000

    如果看到类似以下输出,说明端口已监听:

    1
    tcp        0      0 0.0.0.0:7000            0.0.0.0:*               LISTEN

    如果没有输出,说明 frp 服务端未正确监听端口。

  8. 检查 frp 客户端日志

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

    1
    cat frpc.log

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

4. 远程SSH连接树莓派

  1. 通过服务器连接树莓派

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

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

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

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

      1
      ssh -p 6000 [email protected]

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

5. 设置开机自启动

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

  1. 创建systemd服务文件

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

    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客户端实际路径。
  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. 启用X11模式

    • raspi-config 菜单中,选择 Advanced Options
    • 选择A6 Wayland
    • 选择W1 X11模式。
    • 确认OK自动重启系统。
  3. 启用 VNC

    • raspi-config 菜单中,选择 Interfacing Options
    • 选择 VNC,然后选择 Yes 启用 VNC。
  4. 配置 VNC 客户端

    • 打开 VNC 客户端。

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

    • 点击连接。

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 ModeService 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. 如何切换模式?

  1. 启用 Service Mode

    • 运行以下命令启动 Service Mode:
      1
      sudo /etc/vnc/vncservice start vncserver-x11-serviced
    • 确保在 raspi-config 中启用了 VNC:
      1
      sudo raspi-config
      • 选择 Interfacing Options -> VNC -> Enable
  2. 启用 Virtual Mode

    • 运行以下命令启动 Virtual Mode:
      1
      sudo /etc/vnc/vncservice start vncserver-virtuald
    • 确保 Virtual Mode 服务已启用:
      1
      sudo /etc/vnc/vncservice enable vncserver-virtuald
  3. 切换模式

    • 如果需要从 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 默认使用不同的端口(59005901),因此可以同时运行,但通常不建议这样做。
  • 性能优化
    • 在 Virtual Mode 下,可以通过降低分辨率或启用压缩来优化性能。
  • 无头模式
    • 如果你的树莓派没有连接显示器,建议使用 Virtual Mode。

总结

  • Service Mode 适合连接物理显示器的场景,性能较好。
  • Virtual Mode 适合无头模式下的远程访问,无需物理显示器。