在局域网下可以通过扫描端口号,获得局域网下树莓派的ip地址,如192.168.1.118。之后通过ssh或者VNC等方法访问树莓派。那么如果我们离开局域网,怎么访问到家中的树莓派呢? 公网IP相当于街道中的门牌号,如果远程访问到互联网中的设备,必须知道设备的公网IP。

VPS + SSH远程代理隧道

这是这篇文章重点,需要:

  • 一个安装了linux的VPS,如一台腾讯云服务器。(如果没有,请看下一种方法:公网IP+路由器端口转发)
  • 连上网络的树莓派,将树莓派ssh公钥放到VPS上

树莓派上使用autossh+crontab

sudo apt install autossh
cd ~/
echo "sleep 20;
/usr/bin/autossh -M 5678  -NfR 9999:localhost:22 user@T.T.T.T  -i /home/user/.ssh/id_rsa" > autossh.sh
chmod +x autossh.sh
crontab -e

在crontab的配置文件中加入

@reboot /home/nh/autossh.sh >> tunnel.log

在服务器上操作

ssh -fCNL "*:11111:localhost:9999" localhost

远程登录

现在就可以使用服务器作为跳板,连接到家中的树莓派。

ssh -p 11111 user@T.T.T.T

注:user@T.T.T.T,user是树莓派用户名,T.T.T.T是服务器公网IP。-p指定向服务器1111端口发送ssh请求,1111端口转发到9999端口,也就是树莓派的22端口。

显示效果如下:

效果图

以下树莓派配置方法均不推荐,想折腾的自己玩,服务器配置方法都一样


树莓派上安装sshpass(可选)

sudo apt-get install sshpass

树莓派上编辑shell脚本

#!/bin/bash
#saved as create_ssh_tunnel.sh
createTunnel() {
  sshpass -p "Password" ssh -o "ServerAliveInterval 300" -o "ServerAliveCountMax 2" -fCNR 9999:localhost:22 user@T.T.T.T
  if [[ $? -eq 0 ]]; then    
    echo $(date) Tunnel to jumpbox created successfully  >> /root/tunnel.log
  else
    echo $(date)  An error occurred creating a tunnel to jumpbox. RC was $? >> /root/tunnel.log
  fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo $(date) Creating new tunnel connection >> /root/tunnel.log
  createTunnel
fi

注:这种方式非常危险,不推荐这种方式,因为明文存储了服务器密码。

  • “Password"指的是你的服务器密码
  • user@T.T.T.T是你的服务器用户名和IP地址
  • 9999是将树莓派的22端口绑定到服务器额9999端口

推荐将树莓派上的公钥放到远程服务器上,然后使用如下脚本

#saved as create_ssh_tunnel.sh
createTunnel() {
  ssh -o "ServerAliveInterval 300" -o "ServerAliveCountMax 2" -NR 9999:localhost:22 user@T.T.T.T
  if [[ $? -eq 0 ]]; then    
    echo $(date) Tunnel to jumpbox created successfully  >> ~/tunnel.log
  else
    echo $(date)  An error occurred creating a tunnel to jumpbox. RC was $? >> ~/tunnel.log
  fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo $(date) Creating new tunnel connection >> ~/tunnel.log
  createTunnel
fi

给脚本添加执行权限

chmod +x creat_ssh_tunnel.sh

树莓派上开启cron定时任务

sudo crontab -e

在文件最后一行添加:

*/10 * * * * ~/create_ssh_tunnel.sh >> tunnel.log 2>&1

意思是每十分钟执行一次刚刚我们编辑的shell脚本

公网IP + 路由器端口转发

如果用网线将树莓派连接到互联网上,只要获得公网IP,皆可以通过ssh访问。但是我们在家中通常是用wifi连接树莓派,我们获得的公网iP,只是路由器的IP。由于一个路由器上连接很多设备,我们无法通过这个公网IP访问到树莓派。而且由于路由器的公网IP是会变动的。所以我们要解决的问题是:

  • 找到路由器的公网IP
  • 通过公网IP找到路由器下连接的树莓派

可以在路由器设置里将树莓派分配固定的IP,并绑定固定端口。这样就可以通过访问这个端口访问到局域网下的树莓派。之后不管是将公网IP发送到邮箱还是,使用动态DNS解析服务,通过域名访问树莓派,都可以很容易实现。

参考