树莓派4B“重启计划”Ⅱ——内网穿透

1,240 阅读6分钟

上一篇中,树莓派已安装ubuntu server 64位操作系统,下一步要做的是内网穿透。

内网穿透

内网穿透技术可以实现将位于内网的各种服务端口穿越任意NAT防火墙暴露至公网,举例,加入将树莓派ssh服务监听的22端口暴露到公网,就可以实现从任何有网络的地方连接到树莓派中。

关于内网穿透工具可以使用ngrokcpolar,两者目前都可以免费使用并且支持在树莓派上运行,两者的流程大致相同,此处以英文的ngrok的操作流程举例。

  1. 访问ngrok网址,申请免费帐号。申请成功后ngrok会发送一封帐号激活邮件到注册的邮箱里,点击邮件里的链接即可激活帐号。 image.png
  2. 帐号激活后访问仪表盘页面,页面上方列出有内网穿透工具程序的下载链接,树莓派4B已搭载arm64位架构的CPU并且在上一篇已成功安装64位版本ubuntu server系统,所以此处需要选择“linux (ARM64)”。image.png
  3. 将下载链接复制到树莓派,使用wget命令下载并解压。image.png
  4. 从仪表盘页查看自己的认证token,执行./ngrok authtoken [你的authtoken] ,程序会自动生成~/.ngrok2/ngrok.yml作为配置文件。 image.pngimage.png
  5. 修改上一步生成的配置文件,设置日志路径、暴露的端口和服务等信息,最终的样例可能如下。image.png
  6. 执行/ngrok start --all命令即可启动内网穿透服务,此时可从dashboard页面查看服务状态。image.pngimage.png

至此ngrok工具配置完成,cpolar工具同理,只在细节上略有差异,现在可以通过ssh命令指定端口和域名登录到树莓派中,但是由于是免费账户,所以每次重新启动ngrok工具后,映射的域名和端口都可能会发生变化

ssh证书登录

已经给树莓派配置了内网穿透,意味着任何人都可能通过网络访问到你的树莓派,所以ssh帐号的密码一定要复杂,必要的话可以修改ssh帐号认证策略,关闭密码登录,只启用ssh证书登录。

配置ssh证书

  1. 在电脑端使用ssh-keygen -t rsa命令生成一对密钥对,如果你使用的是windows系统,git工具和MobaXterm工具都提供了ssh-keygen命令。生成密钥对时注意设置密码。image.png
  2. 把上一步生成的公钥文件id_rsa.pub上传到树莓派中,把文件内容追加写入到~/.ssh/authorized_keys文件。image.png
  3. 使用sudo vim /etc/ssh/sshd_config命令修改树莓派ssh服务的配置文件,设置PermitRootLogin为no,PasswordAuthentication为no,RSAAuthentication为yes,PubkeyAuthentication为yesimage.png
  4. 设置完毕后保存配置文件,使用sudo service ssh restart命令重启ssh服务,不要退出当前会话连接。

配置完成后再使用密码新发起ssh连接应无法登录树莓派系统。可以尝试使用私钥文件从PC端发起一个新的ssh会话进行测试,如果依然无法登录,可以使用之前未关闭的ssh会话再次查看和修改配置文件。

关于ssh客户端程序

1. xshell

Xshell是Windows下一款功能非常强大的安全终端模拟软件,支持ssh协议,可以非常方便的对linux主机进行远程管理。

配置xshell使用私钥登录树莓派的配置方式如下图。

juicessh.gif

2. mobaXterm

与收费的xshell不同,mobaXterm是一款可以免费使用的终端工具。

配置私钥登录ssh服务前需要先配置mobaXterm使用的home路径作为家目录,配置后需要重启mobaXterm。

image.png

image.png

将之前生成的私钥文件复制到配置好的家目录下的.ssh文件夹下,创建ssh会话。

image.png

3. juiceSSH

juiceSSH是一款andorid移动端使用的免费ssh客户端工具。使用juiceSSH配置私钥登录树莓派流程如图:

juicessh.gif

关于sublime的sftp插件

Sublime Text 是一个简约风格的跨平台的文本编辑器,拥有强大的快捷键和各类插件,平时写python超级方便,sftp是sublime的一个插件,主要功能是通过sftp服务同步本地文件和远端文件,可以实现“本地编写”+“远端调试”。

sftp插件的配置文件基本格式如下:

{
    "type": "sftp",
    
    "host": "树莓派ip地址",
    "user": "ssh帐号",
    "password": "*********",  # ssh密码,本例已不可用,因为已设置ssh拒绝密码认证
    "port": "22",  # ssh服务端口,一般是22

    "remote_path": "/home/ubuntu/workspace/backends/eventLogic",  # 同步到远端的路径
    "ssh_key_file": "E:/mobaxterm/.ssh/sublime.ppk",  # 本地的私钥文件
}

可以看到sftp插件可以配置私钥登录,但是要求的私钥文件必须是ppk格式的,而上面最开始生成的私钥文件没有任何扩展名,此处需要使用puttygen工具根据已生成的私钥文件创建sublime可用的ppk文件。

首先需要下载puttygen,然后运行puttygen.exe,如图所示:

sftp_ppk.gif

完成后将在E:/mobaxterm/.ssh/目录下生成sublime.ppk文件,将此文件的绝对路径填入sftp插件配置的ssh_key_file字段。

image.png

需要注意的是使用puttygen工具生成ppk文件时一定要设置ppk file version为2,否则sftp插件无法正常工作。

image.png

开机自启服务

到这一步时,内网穿透工具仍需要手动启动,极不方便,为了使树莓派每次断电重启之后都能通过公网访问,需要使内网穿透工具能够开机自启。

Ubuntu从18.04版本开始使用systemd管理系统服务,所以在树莓派安装ubuntu server 20.04后也需要使用使用systemd设置开机启动。

第一步:启用rc-local.service服务

编辑/lib/systemd/system/rc-local.service文件,在文件末尾添加

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

第二步:配置rc.local文件

将ngrok和cpolar的可执行文件放置到/root/tools目录下,将配置文件cpolar.yml和ngrok.yml放置到/root/.nettools/目录下,执行sudo vim /etc/rc.local新建并编辑开机自启脚本,填入以下内容:

#!/bin/sh

nohup /root/tools/cpolar start-all -config=/root/.nettools/cpolar.yml &
nohup /root/tools/ngrok start --all -config=/root/.nettools/ngrok.yml &

exit 0

使用sudo chmod 755 /etc/rc.local 命令给自启脚本文件赋权。

第三步:重启验证

执行sudo reboot命令重启树莓派,在树莓派重新启动后登录树莓派执行ps -ef | grep -E "ngrok|cpolar"查看效果。

image.png

内网穿透工具的进程都已启动,至此开机自启服务已经配置成功,如果有其他的脚本或程序需要开机执行,可以把相应的命令写入到/etc/rc.local文件中,注意如果是阻塞类的命令,需要使用nohup和&执行。