目录
- 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是配置文件,.我们只需要关注服务器相关,分别是frps
、frps.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是配置文件,.我们只需要关注客户端相关,分别是frpc
、frpc.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_ip
和local_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_ip
和local_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等等方式。后续还会讲解如何加上安全策略。