本来我是将树莓派连接到路由器,从而在电脑端通过IP访问。远在局域网之外的队友怎么访问呢?

ssh反向隧道

它的原理比较简单:

树莓派主动向某公网服务器建立ssh连接,并请求公网服务器开启一个额外的SSH的服务端口,充当树莓派的反向代理服务。树莓派与公网服务器之间的TCP(SSH)连接是树莓派主动发起的,而公网服务器与外部用户之间的TCP(SSH)连接是外部用户主动发起的,公网服务器在中间充当代理角色,转发两侧的数据。

从更具体的角度讲,外部用户到公网服务器之间可以建立多条TCP连接,而公网服务器到树莓派则只有一条共享的反向的TCP连接。

配置autossh

树莓派向公网服务器建立的ssh连接可能因为网络问题而断开,所以一般我们不直接使用ssh命令而是使用一个监督程序叫做autossh,它负责拉起ssh命令,并且当ssh断开后可以重新拉起ssh。

首先,因为autossh会帮我们建立到公网服务器的ssh连接,为了免去输入密码的问题,我们要让公网服务器信任树莓派。

1、为树莓派生成ssh公钥私钥

  1. pi@raspberrypi:~ $ ssh-keygen -t rsa

2、将树莓派的私钥拷贝到公网服务器

这通过ssh自带的命令就可以完成

  1. pi@raspberrypi:~ $ ssh-copy-id -i ~/.ssh/id_rsa root@公网IP

上述命令将树莓派pi用户授信给公网服务器x.x.x.x的root用户,此后在pi用户下ssh root@ip 就不需要输入密码了,你可以自己验证。

3、安装autossh

  1. pi@raspberrypi:~ $ sudo apt-get install autossh

4、编写启停autossh的脚本

  1. #Insert the following scripts
  2.  
  3. #!/bin/sh
  4. ### BEGIN INIT INFO
  5. # Provides: autossh
  6. # Required-Start: $local_fs $remote_fs $network $syslog
  7. # Required-Stop: $local_fs $remote_fs $network $syslog
  8. # Default-Start:
  9. # Default-Stop:
  10. # Short-Description: starts the autossh
  11. # Description: starts the autossh
  12. ### END INIT INFO
  13.  
  14. case "$1" in
  15. start)
  16. echo "start autossh"
  17. killall - autossh
  18. if [ $? -ne ];then
  19. sudo /usr/bin/autossh -M -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R :localhost: -i /home/pi/.ssh/id_rsa root@ip
  20. fi
  21. ;;
  22. stop)
  23. sudo killall autossh
  24. ;;
  25. restart)
  26. sudo killall autossh
  27. sudo /usr/bin/autossh -M -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R :localhost: -i /home/pi/.ssh/id_rsa root@ip
  28. ;;
  29. *)
  30. echo "Usage: $0 (start|stop|restart)"
  31. ;;
  32. esac
  33. exit
  34.  
  35. #Then save the file

//记得换成自己VPS的登录名和IP

这个脚本支持 start/stop/restart 三个命令,启动autossh的命令参数作用如下:

  • -o是指定ssh命令的参数,不需要做修改。
  • -M是autossh启动的ssh进程会监听888这个端口,autossh进程会通过探测ssh进程的888端口来获知ssh连接是否断开。
  • -f是指autossh后台运行,不会阻塞shell继续向下执行。
  • -N是指建立的ssh连接只用于转发数据,不解析命令。
  • -R是指建立反向隧道,一般我们ssh某个服务器是正向隧道。
  • 2222是公网服务器上的代理端口。
  • localhost:22是指公网2222端口代理到的树莓派端口。(当你连接公网服务器的2222端口后,数据通过树莓派之间的反向ssh连接到达树莓派,由树莓派端的ssh进程代理发起到localhost:22的2次连接,从而实现ssh访问树莓派的目的)
  • -i指定的是之前授信给公网服务器的ssh私钥
  • 最后是公网服务器的地址,autossh会调用ssh建立到它的ssh反向隧道。

本来打算将上述脚本做到开启自动启动中,但是试验发现开机没有成功启动autossh,索性把它写到crontab里算了:

执行 crontab -e,然后填入:

  1. * * * * * /bin/bash /etc/init.d/autossh.sh start

//每隔一分钟执行一次

接下来,你可以观察是否有autossh进程被拉起:

  1. ps aux|grep autossh
  2. root 0.0 0.0 ? Ss : : /usr/lib/autossh/autossh -M -N -o PubkeyAuthentication=yes -o StrictHostKeyChecking=false -o PasswordAuthentication=no -o ServerAliveInterval -o ServerAliveCountMax -R :localhost: -i /home/pi/.ssh/id_rsa root@.XX.XX.XX (打码了)
  3. pi 0.0 0.0 pts/ S+ : : grep --color=auto autossh

测试

登入VPS,再执行如下命令:

  1. ssh pi@localhost -p

//pi用户默认的密码为 raspberry

参考连接:

1. https://yuerblog.cc/2017/09/14/raspberry-pi-autossh-reverse-tunnel/

2. http://blog.niuhemoon.xyz/pages/2018/09/04/Raspi_Remote_SSH_Tunnel/

树莓派autossh反向隧道的更多相关文章

  1. autossh反向隧道

    实验目标 有两台主机: hostA: 阿里云公网主机 hostB: 本地内网主机 需求实现: 在hostB上使用autossh将hostB的80的端口映射到hostA的8080,使得其他机器访问hos ...

  2. Windows下使用Xshell建立反向隧道

    反向隧道是一个进行内网穿透的简单而有用的方法.在Linux下通过OpenSSH和AutoSSH可以很容易地建立稳定的反向隧道.但是在Windows下,还能看到有人特意装个Cygwin来运行这些工具…… ...

  3. 利用SSH反向隧道,连接内网服务器

    前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...

  4. 使用SSH端口做端口转发以及反向隧道

    目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...

  5. ngrok反向隧道--获取内网IP

    ngrok反向隧道 前情提要:小明与小白各有一台主机,两台主机在同一内网,小明想直接通过内网ssh到小白的主机上.但是小白的ip地址会不断的变化,而小明不想每次都要麻烦小白查看ip.于是小明催生了一个 ...

  6. 两步建立 ssh 反向隧道

    因为需要在寝室访问实验室的内部网络,刚好自己购买了阿里云,因此,可以远端干活了,mark下方法: 第一步:在内网的服务器上,使用ssh 命令建立反向隧道 publicUserName@publicIp ...

  7. SSH反向连接及Autossh

    参考文章 http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html 接触Linux恐怕对SSH再熟悉不过了,还有sc ...

  8. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  9. 反向代理搭建隧道,服务器系统为Ubuntu18.04

    该文章参考了实验室师兄写的教程,并记录了自己在实操过程中的坑. 1.内网机器配置 假设现在有一台公用服务器和一台内网服务器,现在想通过反向代理的方式来访问内网服务器.假设公用服务器为A,内网服务器为B ...

随机推荐

  1. Vue v-for使用 vue中循环输出数据

    v-for的使用: 代码: <!doctype html> <html lang="en"> <head> <meta charset=& ...

  2. JavaScript forEach() 方法

    JavaScript forEach() 方法  JavaScript Array 对象 实例 列出数组的每个元素: <button onclick="numbers.forEach( ...

  3. 自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)

    本文由作者FreddyChen原创分享,为了更好的体现文章价值,引用时有少许改动,感谢原作者. 1.写在前面 一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间.今天终于从公司离职了, ...

  4. HBase开发错误记录(java.net.UnknownHostException: unknown host: hadoop111)

    windows下开发HBase应用程序,HBase部署在linux环境中, 在运行调试时可能会出现无法找到主机,类似异常信息如下: java.net.UnknownHostException: unk ...

  5. 送书『构建Apache Kafka流数据应用』和『小灰的算法之旅』和『Java并发编程的艺术』

    读书好处 1.可以使我们增长见识. 2.可提高我们的阅读能力和写作水平. 3.可以使我们变的有修养. 4.可以使我们找到好工作. 5.可以使我们在竞争激烈的社会立于不败之地. 6.最大的好处是可以让你 ...

  6. 微信小程序跳转web-vie时提示appId无法读取:Cannot read property 'appId' of undefined

    微信小程序报web-view错无法读取appId:Cannot read property 'appId' of undefined 问题描述: 我以前一直如下写代码没报错也都是可以使用的,并且小程序 ...

  7. POJ 3041 Asteroids(二分图最大匹配)

    ###题目链接### 题目大意: 给你 N 和 K ,在一个 N * N 个图上有 K 个 小行星.有一个可以横着切或竖着切的武器,问最少切多少次,所有行星都会被毁灭. 分析: 将 1~n 行数加入左 ...

  8. linux 用du查看硬盘信息

    linux 用du查看硬盘信息 <pre>[root@iZ238qupob7Z web]# df -hFilesystem Size Used Avail Use% Mounted on/ ...

  9. HTML+CSS基础 块级元素div分析 文档流 脱离文档流的方法

    块级元素div分析 1.外边距  margin 2.内边距 padding 3.边框  border Div的真实宽度=width+margin-left+margin-right+border*2+ ...

  10. 记一次内存无法回收导致频繁fullgc机器假死的思路

    确定挂机 络绎不绝的来不同类型的bug 当bug滚滚而来时,不要怀疑,你的发布的应用基本是不可用状态了.观察哨兵监控数据,特别是内存打到80%基本就挂机了,或者监控数据缺失也基本是挂机了.此时应当马上 ...