序言
最近玩树莓派,发现功能还是很强大的。软件上,Linux给了很大的自由度(虽然对于一个才开始接触的玩家来说觉得也挺复杂的);硬件上,GPIO能连接的东西也很多。
有一些项目,看了网上的教程觉得不尽人意。一则有些已经过时了,软件提供了新的版本;再则,有些使用了Linux上过时的技术;三来,网上教程很多感觉不够规范,例如软件包里面明明提供了相关文件的,自己不仔细阅读文档,又重新写了一个还不如原装的。如此之类不够优雅的问题比比皆是。
我也是一个才接触树莓派的爱好者,这个系列打算做一个自用的笔记,以便我自己今后查阅用,会写得比较简洁而非详细。所以如果偶然有人看到了,有什么问题,我也不一定能解决,也不一定会回复,请见谅。
我的习惯基本上是先阅读了软件自己的文档之后,按照自己的理解,参考已有的教程,对于原生的配置文件进行能满足任务的最小改动。个人有强迫症,感觉做一件事情必须实现的过程也规范、优美才好。
下载与安装
直接到frp的官方下载对应架构处理器的软件包,或者自己编译。我的树莓派3B+处理器为armv7的32位,下载arm.tar.gz文件;我的云服务器处理器为Intel的64位,选择amd64.tar.gz。本文写成时的最新版本为0.33.0。
顺便,查询处理器相关信息可以使用如下命令:
arch
lscpu
tarball文件的解压用:
tar -xzf myfile.tar.gz
解压得到的文件夹放在一个合理的地方就可以了。这里也是我不太明白的一个地方,手动解压的软件到底放在哪里才比较好,留待以后学习更多再来修改吧。暂时放在了/usr/share/frp这个位置。然后,某些文件可能需要“执行”的权限,需要用chmod进行相应的修改。
树莓派(client)端的配置
client端的配置文件为frpc.ini,默认情况如下
[common]
server_addr = 127.0.0.1
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
我只对服务器地址进行了修改:
server_addr = <云服务器的公网IP地址>
其他项的意义大致如下,可以不修改:
server_port = 7000 # 服务器和客户端通信的端口
type = tcp # 通信协议
remote_port = 6000
local_port = 22 # 访问云服务器的6000端口相当于访问树莓派的22端口(ssh默认为22)
接下来可以启动frpc:
./frpc -c ./frpc.ini
服务器(server)端配置
我同样在服务器上把软件包放在了/usr/share/frp的位置,服务器端配置文件frps.ini更为简单,打开时默认如此:
[common]
bind_port = 7000 # 和client通信的端口,和上面server_port保持一致。
上面在client端的配置中,我们已经发现frp内网穿透将使用到云服务器的6000和7000端口,因此需要在云服务器上允许相应端口的访问,参考如下:
![1f761614acfaa9ea323e8422a8051a60.png](https://img-blog.csdnimg.cn/img_convert/1f761614acfaa9ea323e8422a8051a60.png)
一般情况下不修改即可。直接启动frps:
./frps -c ./frps.ini
自启动和后台的配置
在服务器端,由于不会断电,我直接让frps运行在后台。使用的是功能很强大的screen,之前在挂minecraft基岩版服务器的时候已经接触过了,所以很顺手。常用的指令如下:
# 安装(Ubuntu为例)
screen -S <窗口名字>
在树莓派端,考虑到经常会断电,要麻烦一些,需要设置开机自启动。好在软件包里面已经为我们提供了自启动需要的配置文件,简单修改即可。在/usr/share/frp/systemd中找到frpc.service:
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini # 改成软件实际安装的位置就可以了
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini # 改成软件实际安装的位置就可以了
[Install]
WantedBy=multi-user.target
例如按照我这里的安装地址就应该改成:
ExecStart=/usr/share/frp/frpc -c /usr/share/frp/frpc.ini
ExecReload=/usr/share/frp/frpc reload -c /usr/share/frp/frpc.ini
之后将frpc.service文件放在/lib/systemd/system文件夹中,使用如下命令启动和设置自启动:
# 启动frpc,可以先进行测试
sudo systemctl status frpc
简单来说,设置好之后,重启一下树莓派然后看看进程在不在就可以了。
enable frpc
sudo reboot
sudo systemctl status frpc
正常的话,应该可以看到frpc端的记录,如下图。当树莓派成功挂靠到云服务器后,服务器端的frps也会有相应的记录。
![6fe84cd8231bf9db508ad320033d6482.png](https://img-blog.csdnimg.cn/img_convert/6fe84cd8231bf9db508ad320033d6482.png)
局域网以外用ssh登陆到树莓派
官网给出的方法是:
# 端口就是前面的remote-port,pi是树莓派上的用户,后面是云服务器的公网IP。
不知道什么原因我的Mac Terminal登陆时经常报错 Bad configuration option: port:6000 。但用应该是同一回事的
6000 pi@xxx.xxx.xx.xxx
则可以正常登陆到pi。
后记
本笔记中只是最简单的实现,仅仅实现了在外网用ssh连接到树莓派这一个功能。frp还提供更复杂的功能,需要对配置文件进行进一步的修改。建议查看后面的参考文献。
参考文献
- frp中文文档
- screen的简易指南