【树莓派不吃灰】基础篇⑭ 使用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

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所