
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-10-31 ❤️
- ❤️ 本篇更新记录 2022-10-31 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
在前面博客中,我们已经学会了使用VNC、SSH、远程桌面连接的方式实现本地PC和树莓派的通信。但是,目前它们还是处于局域网内(大家都在同一个网段),外部网络无法访问。
所以核心要解决的问题就是外网情况下如何访问到我的树莓派系统或者调用一些它提供的接口信息?这里就涉及到内网穿透。
实现内网穿透的软件有很多,有商业的,也有开源免费的,比如花生壳、nps、ngrok、frp。但对比来说,对于初学者来说,frp相对比较简单,所以我们重点来学习一下它。
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
简单概括,通过它,你可以把内网的服务暴露到公网访问。但是这也意味着公网可能会随时被其他人访问或者攻击,安全性问题需要考虑。
当然要实现对内网的访问,你还是需要一台能够在公网访问的服务器来布置frp服务端,作为你的中转站,帮你实现公网←→frp服务器(中转站)←→内网的连接,让内网里的设备也可以被公网访问到。
frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
这里分为两个角色:
frp服务器,需要部署在公网服务器上面frp客户端,需要部署在树莓派上面
我们这里直接选用github上最火的frp开源项目。
公网服务器可以用阿里云、腾讯云等这些,哪个便宜用哪个。
这里博主主要购买了腾讯云轻量服务器(lighthouse),就以它为例。
需要根据自己的处理器信息下载对应版本的软件。分为两部分,服务器端和客户端。
首先,查询处理器相关信息可以使用如下命令:
- arch
- lscpu

可以看到腾讯云服务器上面是x86_64
- 对软件来说,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。
直接点击跳转

选择对应版本右键获取下载链接地址。比如我这里是:https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_amd64.tar.gz
- 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是配置文件,.我们只需要关注服务器相关,分别是frps、frps.ini。
首先,查询处理器相关信息可以使用如下命令:
- 用于显示操作系统架构类型
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 架构随着时间的推移而发展,现代 ARM 处理器提供了旧型号上不可用的功能。因此,Debian 提供了三种 ARM 移植,可以为各种不同的机器提供最佳支持:
armhf 仅适用于较新的 32 位 ARM 处理器,其至少实现了 ARMv7 架构,且支持 ARM 矢量浮点规范(VFPv3)第 3 版。此移植可利用这些型号上可用的扩展和性能增强功能。—— 树莓派3B、4B选择对应版本右键获取下载链接地址。比如我这里是:https://github.com/fatedier/frp/releases/download/v0.45.0/frp_0.45.0_linux_arm.tar.gzz
- 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是配置文件,.我们只需要关注客户端相关,分别是frpc、frpc.ini。。
我们这里配置SSH能远程访问我们的树莓派。

[common]
bind_port = 7000
更多服务端配置参考 frp服务端配置。
要注意打开云服务相关安全策略(包括腾讯云和宝塔两边),将相应端口打开。

运行frps。输入命令:
./frps -c frps.ini

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

[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_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。更多客户端配置参考 frp客户端配置。
运行frpc。输入命令:
./frpc -c frpc.ini

客户端也正常运行起来。
再看看服务器端打印的日志信息:

表示树莓派客户端和服务器建立好了连接。
因为我们配置了6000,也需要在腾讯云上配置安全策略。


官网给出的方法是:
ssh -oPort=
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
pi@xxx.xxx.xx.xxx
思考这个问题:
只要允许外网访问,就意味着可能会收到别人攻击,那么我们如何加强安全控制呢?
下一节讲到访问控制、安全权限说到。
同样的操作,我们在客户端配置一个vnc远程访问。
维持原状,不需要改动。
[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_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。这里我们配置两个vnc,为了防止本地启用了vnc导致占用了5900端口(vnc1端口号是5901)。需要在云服务器配置好安全策略。


更多客户端配置参考 frp客户端配置。
运行frpc。输入命令:
./frpc -c frpc.ini

公网服务器也正常打印日志。

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

这里也是可以连接成功,完美!
略,直接模拟上面配置,只不过emqx对应的端口号不一样。
直接参考官方文档
对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端。
[common]
bind_port = 7000
配置如下:
[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
配置如下:
[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转发出去。
访问方式还是跟上面一样。
同样,也区分为服务器端和客户端。
开机自启动主要就是运用 systemd 功能,要把 service文件创建在
/lib/systemd/system 目录下。
注意:以下操作命令行目录都是基于解压后的frp目录进行。
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

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

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
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访问看看。

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