【树莓派不吃灰】基础篇⑭ 使用frp内网穿透,实现远程访问树莓派

2023-11-01 19:40

本文主要是介绍【树莓派不吃灰】基础篇⑭ 使用frp内网穿透,实现远程访问树莓派,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

目录

    • 1. 前言
    • 2. frp内网穿透
      • 2.1 概述
      • 2.2 实现原理
    • 3. 开源frp项目
    • 4. 公网服务器选型
    • 5. 下载frp软件
      • 5.1 公网服务器下载frp服务器
        • 5.1.1 github选择适合服务端的版本
        • 5.1.2 公网服务器进行下载解压
      • 5.2 树莓派下载frp客户端
        • 5.2.1 github选择适合客户端的版本
        • 5.2.2 树莓派进行下载解压
    • 6. 配置frp支持SSH远程访问
      • 6.1 公网服务器配置 —— frps/frps.ini
      • 6.2 树莓派内网配置 —— frpc/frpc.ini
      • 6.3 通过外网SSH访问树莓派
    • 7. 配置frp支持VNC远程访问
      • 7.1 公网服务器配置 —— frps/frps.ini
      • 7.2 树莓派内网配置 —— frpc/frpc.ini
      • 7.3 通过外网VNC访问树莓派
    • 8. 配置frp支持EMQX远程访问
    • 9. 安全地暴露内网SSH服务
      • 9.1 frps.ini 配置
      • 9.2 需要暴露到内网的机器上部署 frpc
      • 9.3 在想要访问内网服务的机器上也部署 frpc
      • 9.4 通过 SSH 访问内网机器
    • 10. 配置frp开机自启动
      • 10.1 公网服务器端
      • 10.2 树莓派客户端
    • 11. 总结

  • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
  • ❤️ 本篇创建记录 2022-10-31 ❤️
  • ❤️ 本篇更新记录 2022-10-31 ❤️
  • 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
  • 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
  • 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥

1. 前言

在前面博客中,我们已经学会了使用VNC、SSH、远程桌面连接的方式实现本地PC和树莓派的通信。但是,目前它们还是处于局域网内(大家都在同一个网段),外部网络无法访问。

所以核心要解决的问题就是外网情况下如何访问到我的树莓派系统或者调用一些它提供的接口信息?这里就涉及到内网穿透

实现内网穿透的软件有很多,有商业的,也有开源免费的,比如花生壳、nps、ngrok、frp。但对比来说,对于初学者来说,frp相对比较简单,所以我们重点来学习一下它。

2. frp内网穿透

2.1 概述

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

简单概括,通过它,你可以把内网的服务暴露到公网访问。但是这也意味着公网可能会随时被其他人访问或者攻击,安全性问题需要考虑。

2.2 实现原理

当然要实现对内网的访问,你还是需要一台能够在公网访问的服务器来布置frp服务端,作为你的中转站,帮你实现公网←→frp服务器(中转站)←→内网的连接,让内网里的设备也可以被公网访问到。

frp 主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

这里分为两个角色:

  • frp服务器,需要部署在公网服务器上面
  • frp客户端,需要部署在树莓派上面

3. 开源frp项目

我们这里直接选用github上最火的frp开源项目。

  • 比较火爆的frp软件
    在这里插入图片描述
  • 比较火爆的frp软件官方说明文档,务必点开看看

4. 公网服务器选型

公网服务器可以用阿里云、腾讯云等这些,哪个便宜用哪个。
这里博主主要购买了腾讯云轻量服务器(lighthouse),就以它为例。

5. 下载frp软件

需要根据自己的处理器信息下载对应版本的软件。分为两部分,服务器端和客户端。

5.1 公网服务器下载frp服务器

首先,查询处理器相关信息可以使用如下命令:

  • arch
  • lscpu

在这里插入图片描述
可以看到腾讯云服务器上面是x86_64

x86、amd、arm和GPU

  • 对软件来说,x86一般是指32位的系统,x64就是64位的系统。对CPU来说,也类似。但是,x64本质上也是x86的一个版本,确切来说,应该叫x86_64,可以简单理解成x86的下一代版本。目前x86基本上已经淘汰,x64是主流。
  • 对于世界上最大的两家CPU制造商Intel和Amd,他们都生产x86(包括x64)架构的CPU。这俩公司渊源其实很深。早期时Intel先是自己搞了个x86架构,然后Amd拿到授权也可以做x86了。接着Intel向64位过渡的时候搞了个ia64(x64架构),因为和x86架构不兼容,市场反应极差。而Amd率先搞了x86的64位兼容架构(32和64的混合架构),即现在的x86-64,Intel反过来向Amd要授权(Intel和Amd两家专利交叉的很严重)生产x86-64。由于是Amd先搞出来的,所以x86-64也叫amd64
5.1.1 github选择适合服务端的版本

直接点击跳转
在这里插入图片描述
选择对应版本右键获取下载链接地址。比如我这里是:https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_amd64.tar.gz

5.1.2 公网服务器进行下载解压
  • wget https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_amd64.tar.gz
    在这里插入图片描述
  • tar -xzvf frp_0.45.0_linux_amd64.tar.gz
    在这里插入图片描述
  • 查阅一下解压后文件目录
frp_0.45.0_linux_amd64/
frp_0.45.0_linux_amd64/LICENSE
frp_0.45.0_linux_amd64/frps
frp_0.45.0_linux_amd64/frpc
frp_0.45.0_linux_amd64/frpc_full.ini
frp_0.45.0_linux_amd64/frps.ini
frp_0.45.0_linux_amd64/frpc.ini
frp_0.45.0_linux_amd64/frps_full.ini

在这里插入图片描述

其中,frpc为客户端程序,frps为服务端程序,.ini是配置文件,.我们只需要关注服务器相关,分别是frpsfrps.ini

5.2 树莓派下载frp客户端

首先,查询处理器相关信息可以使用如下命令:

  • 用于显示操作系统架构类型
    arch
  • 显示CPU的详细信息,
    lscpu
  • 用于查看 Debian/ Ubuntu 操作系统是 32 位还是 64 位
    dpkg --print-architecture

在这里插入图片描述

可以看到树莓派3B采用armv7l架构,32位系统(armv7, little endian)。

ARM(英文为Advanced RISC Machine,或Acorn RISC Machine)也是一个架构,非常适用于移动通信这种低成本,高性能,低耗电的领域。ARM的公司为安谋控股(ARM Holding plc),又称为ARM公司。

  • ARM体系架构_armv7l是什么架构

在这里插入图片描述

ARM 架构随着时间的推移而发展,现代 ARM 处理器提供了旧型号上不可用的功能。因此,Debian 提供了三种 ARM 移植,可以为各种不同的机器提供最佳支持:

  • Debian/armel 针对旧的 32 位 ARM 处理器,而不支持硬件浮点单元(FPU)
  • Debian/armhf 仅适用于较新的 32 位 ARM 处理器,其至少实现了 ARMv7 架构,且支持 ARM 矢量浮点规范(VFPv3)第 3 版。此移植可利用这些型号上可用的扩展和性能增强功能。—— 树莓派3B、4B
  • Debian/arm64 适用于 64 位 ARM 处理器,其至少实现了 ARMv8 架构。
5.2.1 github选择适合客户端的版本

直接点击跳转
在这里插入图片描述

选择对应版本右键获取下载链接地址。比如我这里是:https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_arm.tar.gzz

5.2.2 树莓派进行下载解压
  • wget https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_arm.tar.gz
    在这里插入图片描述
  • tar -xzvf frp_0.45.0_linux_arm.tar.gz
    在这里插入图片描述
  • 查阅一下解压后文件目录
frp_0.45.0_linux_arm/
frp_0.45.0_linux_arm/LICENSE
frp_0.45.0_linux_arm/frps
frp_0.45.0_linux_arm/frpc
frp_0.45.0_linux_arm/frpc_full.ini
frp_0.45.0_linux_arm/frps.ini
frp_0.45.0_linux_arm/frpc.ini
frp_0.45.0_linux_arm/frps_full.ini

在这里插入图片描述

其中,frpc为客户端程序,frps为服务端程序,.ini是配置文件,.我们只需要关注客户端相关,分别是frpcfrpc.ini。。

6. 配置frp支持SSH远程访问

我们这里配置SSH能远程访问我们的树莓派。

  • 通过 SSH 访问内网机器

6.1 公网服务器配置 —— frps/frps.ini

  • 公网服务器不需要用到客户端,我们这里把frpc相关文件删掉。
    在这里插入图片描述
  • 修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口,输入命令:
    sudo nano frps.ini
[common]
bind_port = 7000

更多服务端配置参考 frp服务端配置。

要注意打开云服务相关安全策略(包括腾讯云和宝塔两边),将相应端口打开。
在这里插入图片描述
运行frps。输入命令:

./frps -c frps.ini

在这里插入图片描述
这样服务器算运行起来。
注意,这里不能直接使用frps命令,往下我们会把它配置到bin目录。

6.2 树莓派内网配置 —— frpc/frpc.ini

  • 树莓派不需要用到服务端,我们这里把frps相关文件删掉。
    在这里插入图片描述
  • 修改 frpc.ini 文件(其实就是修改映射关系),假设 frps 所在服务器的公网 IP 为 x.x.x.x:
[common]
server_addr = x.x.x.x
server_port = 7000[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
  • local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。
  • remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

更多客户端配置参考 frp客户端配置。

运行frpc。输入命令:

./frpc -c frpc.ini

在这里插入图片描述
客户端也正常运行起来。

再看看服务器端打印的日志信息:
在这里插入图片描述
表示树莓派客户端和服务器建立好了连接。
因为我们配置了6000,也需要在腾讯云上配置安全策略。
在这里插入图片描述
在这里插入图片描述

6.3 通过外网SSH访问树莓派

官网给出的方法是:

ssh -oPort=<remote-portd端口号> pi@xxx.xxx.xx.xxx

端口就是前面的remote-port(博主这里设置为6000),pi是树莓派上的用户,后面是云服务器的公网IP

所以最终博主的访问命令就是:

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

在这里插入图片描述

如果是mac系统发现 登陆时经常报错 Bad configuration option: port:xxxxx。可以使用:

ssh -p <remote-portd端口号> pi@xxx.xxx.xx.xxx

思考这个问题:

只要允许外网访问,就意味着可能会收到别人攻击,那么我们如何加强安全控制呢
下一节讲到访问控制、安全权限说到。

7. 配置frp支持VNC远程访问

同样的操作,我们在客户端配置一个vnc远程访问。

7.1 公网服务器配置 —— frps/frps.ini

维持原状,不需要改动。

7.2 树莓派内网配置 —— frpc/frpc.ini

  • 修改 frpc.ini 文件(其实就是修改映射关系),我们加多一个vnc配置,假设 frps 所在服务器的公网 IP 为 x.x.x.x:
[common]
server_addr = x.x.x.x
server_port = 7000[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000[vnc]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 5900[vnc1]
type = tcp
local_ip = 127.0.0.1
local_port = 5901
remote_port = 5901
  • local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。
  • remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

这里我们配置两个vnc,为了防止本地启用了vnc导致占用了5900端口(vnc1端口号是5901)。需要在云服务器配置好安全策略。
在这里插入图片描述
在这里插入图片描述

更多客户端配置参考 frp客户端配置。

运行frpc。输入命令:

./frpc -c frpc.ini

在这里插入图片描述
公网服务器也正常打印日志。
在这里插入图片描述

7.3 通过外网VNC访问树莓派

我们在vncviewer上面输入我们的公网地址加上端口号.

xxx.xxx.xxx.xxx:5900
在这里插入图片描述

在这里插入图片描述
这里也是可以连接成功,完美!

8. 配置frp支持EMQX远程访问

略,直接模拟上面配置,只不过emqx对应的端口号不一样。

  • 【树莓派不吃灰】搭建emqx MQTT Broker

9. 安全地暴露内网SSH服务

直接参考官方文档

  • 安全地暴露内网服务

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端

9.1 frps.ini 配置

[common]
bind_port = 7000

9.2 需要暴露到内网的机器上部署 frpc

配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000[secret_ssh]
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

9.3 在想要访问内网服务的机器上也部署 frpc

配置如下:

[common]
server_addr = x.x.x.x
server_port = 7000[secret_ssh_visitor]
type = stcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = secret_ssh
sk = abcdefg
# 绑定本地端口用于访问 SSH 服务
bind_addr = 127.0.0.1
bind_port = 6000

核心点就是访问者也需要部署frpc。相当于所有请求都得经过frpc转发出去。

9.4 通过 SSH 访问内网机器

访问方式还是跟上面一样。

10. 配置frp开机自启动

同样,也区分为服务器端和客户端。
开机自启动主要就是运用 systemd 功能,要把 service文件创建在
/lib/systemd/system 目录下。

注意:以下操作命令行目录都是基于解压后的frp目录进行

10.1 公网服务器端

  • 复制frpc文件到 /usr/bin/ 目录下

sudo cp frps /usr/bin/frps

在这里插入图片描述

  • 复制frps.ini文件到 /etc/frp 目录下,不存在该目录就先创建

sudo mkdir /etc/frp
sudo cp frps.ini /etc/frp/frps.ini

在这里插入图片描述

  • 创建一个 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.ini[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 systemctl enable frps
sudo reboot
sudo systemctl status frps

在这里插入图片描述

10.2 树莓派客户端

  • 复制frpc文件到 /usr/bin/ 目录下

sudo cp frpc /usr/bin/frpc

在这里插入图片描述

  • 复制frpc.ini文件到 /etc/frp 目录下,不存在该目录就先创建

sudo mkdir /etc/frp
sudo cp frpc.ini /etc/frp/frpc.ini

在这里插入图片描述

  • 创建一个 frpc.service 文件,填入以下内容
[Unit]
Description=Frp Client Service
After=network.target[Service]
Type=simple
TimeoutStartSec=30
Restart=always
RestartSec=1min
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini[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 systemctl enable frpc
sudo reboot
sudo systemctl status frpc

在这里插入图片描述
我们再用VNC访问看看。
在这里插入图片描述
完美收官!

11. 总结

运用frp内网穿透技术,实现远程访问树莓派,从而可以远程访问树莓派上面运行的所有服务。从0到1简要概况如何搭建整个系统,同时支持ssh、vnc等等方式。后续还会讲解如何加上安全策略。

这篇关于【树莓派不吃灰】基础篇⑭ 使用frp内网穿透,实现远程访问树莓派的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325292

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本