在实际使用过程中,树莓派使用4G模组连接网络之后,因为4G网络限制,无法使用SSH远程连接到设备;因此需要通过端口反向转发实现可远程SSH控制; 需要准备的材料:
准备材料
1、树莓派(已连接4G模块) 2、公网服务器(要求Linux系统)
将树莓派连接到局域网中
假设树莓派局域网IP地址为:192.168.1.2 假设公网服务器IP地址为:8.130.29.35
1、设置公网主机服务器支持端口转发
检查公网服务器是否支持端口转发
sshd -T -C user=me,host=localhost,addr=IP | grep -E "gatewayports"
如上所示,公网服务器不支持端口转发,需要修改公网服务器支持端口转发
用
vim
编辑/etc/ssh/sshd_config
,打开GatewayPorts开关GatewayPorts yes
(如果是Ubuntu没有GatewayPorts, 添加一行即可)。重启网络服务sudo systemctl restart sshd
2、在树莓派上配置免密登陆远程服务器
这一步配置是为了方便将反向端口转发加到开机命令后,能够顺利创建
ssh-keygen
#持续三个回车即可,直至最终出现如下所示图片即可代表成功
接下来将密钥复制到远程服务器上
#将密钥复制到公网服务器,要求输入公网服务器密码
ssh-copy-id -i .ssh/id_rsa.pub root@8.130.29.35
此时,就可以在不输入密码的情况下,直接ssh连接远程服务器了;
3、在树莓派上安装autossh
autossh 可以自动的检测断线,并在断线的时候重连。
sudo apt-get install autossh
接下来在树莓派上执行命令做端口反向转发
首先在云服务器控制台增加开放端口9091
在树莓派中执行以下命令
autossh -M 4010 -fCNR 8.130.29.35:9091:localhost:22 root@8.130.29.35
# 接着输入远程服务器密码即可
参数解释:**
-M 4010 意思是使用内网主机的 4010 端口监视 SSH 连接状态,连接出问题了会自动重连 -N 意思是不执行远程命令 -f 意思是后台执行命令 -R 意思是将远程主机(公网主机 )的某个端口转发到本地指定机器的指定端口
代码解释:
“8.130.29.35:9091:localhost:22”意思是将内网主机22号端口转发至公网主机的 9091 号端口上
此时,已经可以在公网主机上执行命令连接到树莓派上,如:
ssh pi@localhost -P 9091
参数说明:-P 代表端口号
4、将端口转发添加到开机启动中
创建一个脚本sshjump.sh 来执行创建反向端口转发的命令,赋予脚本可执行权限,而后在rc.local中引入脚本开机执行
touch sshjump.sh
vim sshjump.sh
#在sshjump.sh脚本中粘贴如下内容
#!/bin/bash
autossh -M 4010 -CNR 8.130.29.35:9091:localhost:22 root@8.130.29.35
#保存
赋予脚本可执行权限
chmond 777 sshjump.sh
切换root用户编辑rc.local
su root
#输入root用户密码
vim /etc/rc.local
#在文件倒数第二行加入以下内容
su pi -c "exec /home/pi/Program/shell/sshjump.sh"
#esc
#:wq
#保存文件并退出
5、测试
测试反向端口转发是否在设备重启后自动启动
测试步骤:
- 重启树莓派 sudo reboot
- 等待树莓派开机启动
- 连接公网服务器,如:ssh root@8.130.29.35
- 连接公网服务器后,执行命令连接树莓派: ssh -p 9091 pi@localhost
- 输入树莓派密码,检查是否能够正常连接
6、公网主机设置正向端口转发,支持本地直连树莓派
在公网服务器上设置正向端口转发,如下所示,将本地的9092端口转发到9091
ssh -fCNL '*:9092:localhost:9091' localhost
在公网服务器上执行上述命令,输入密码之后,即可在本地访问公网服务器登陆树莓派
ssh -P 9092 pi@8.130.29.35
#连接9092端口,
#pi 树莓派的用户名
#8.130.29.35 公网服务器IP