树莓派autossh反向隧道
本来我是将树莓派连接到路由器,从而在电脑端通过IP访问。远在局域网之外的队友怎么访问呢?
ssh反向隧道
它的原理比较简单:
树莓派主动向某公网服务器建立ssh连接,并请求公网服务器开启一个额外的SSH的服务端口,充当树莓派的反向代理服务。树莓派与公网服务器之间的TCP(SSH)连接是树莓派主动发起的,而公网服务器与外部用户之间的TCP(SSH)连接是外部用户主动发起的,公网服务器在中间充当代理角色,转发两侧的数据。
从更具体的角度讲,外部用户到公网服务器之间可以建立多条TCP连接,而公网服务器到树莓派则只有一条共享的反向的TCP连接。
配置autossh
树莓派向公网服务器建立的ssh连接可能因为网络问题而断开,所以一般我们不直接使用ssh命令而是使用一个监督程序叫做autossh,它负责拉起ssh命令,并且当ssh断开后可以重新拉起ssh。
首先,因为autossh会帮我们建立到公网服务器的ssh连接,为了免去输入密码的问题,我们要让公网服务器信任树莓派。
1、为树莓派生成ssh公钥私钥
pi@raspberrypi:~ $ ssh-keygen -t rsa
2、将树莓派的私钥拷贝到公网服务器
这通过ssh自带的命令就可以完成
pi@raspberrypi:~ $ ssh-copy-id -i ~/.ssh/id_rsa root@公网IP
上述命令将树莓派pi用户授信给公网服务器x.x.x.x的root用户,此后在pi用户下ssh root@ip 就不需要输入密码了,你可以自己验证。
3、安装autossh
pi@raspberrypi:~ $ sudo apt-get install autossh
4、编写启停autossh的脚本
#Insert the following scripts #!/bin/sh
### BEGIN INIT INFO
# Provides: autossh
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start:
# Default-Stop:
# Short-Description: starts the autossh
# Description: starts the autossh
### END INIT INFO case "$1" in
start)
echo "start autossh"
killall - autossh
if [ $? -ne ];then
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
fi
;;
stop)
sudo killall autossh
;;
restart)
sudo killall autossh
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
;;
*)
echo "Usage: $0 (start|stop|restart)"
;;
esac
exit #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,然后填入:
* * * * * /bin/bash /etc/init.d/autossh.sh start
//每隔一分钟执行一次
接下来,你可以观察是否有autossh进程被拉起:
ps aux|grep autossh
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 (打码了)
pi 0.0 0.0 pts/ S+ : : grep --color=auto autossh
测试
登入VPS,再执行如下命令:
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反向隧道的更多相关文章
- autossh反向隧道
实验目标 有两台主机: hostA: 阿里云公网主机 hostB: 本地内网主机 需求实现: 在hostB上使用autossh将hostB的80的端口映射到hostA的8080,使得其他机器访问hos ...
- Windows下使用Xshell建立反向隧道
反向隧道是一个进行内网穿透的简单而有用的方法.在Linux下通过OpenSSH和AutoSSH可以很容易地建立稳定的反向隧道.但是在Windows下,还能看到有人特意装个Cygwin来运行这些工具…… ...
- 利用SSH反向隧道,连接内网服务器
前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...
- 使用SSH端口做端口转发以及反向隧道
目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...
- ngrok反向隧道--获取内网IP
ngrok反向隧道 前情提要:小明与小白各有一台主机,两台主机在同一内网,小明想直接通过内网ssh到小白的主机上.但是小白的ip地址会不断的变化,而小明不想每次都要麻烦小白查看ip.于是小明催生了一个 ...
- 两步建立 ssh 反向隧道
因为需要在寝室访问实验室的内部网络,刚好自己购买了阿里云,因此,可以远端干活了,mark下方法: 第一步:在内网的服务器上,使用ssh 命令建立反向隧道 publicUserName@publicIp ...
- SSH反向连接及Autossh
参考文章 http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html 接触Linux恐怕对SSH再熟悉不过了,还有sc ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 反向代理搭建隧道,服务器系统为Ubuntu18.04
该文章参考了实验室师兄写的教程,并记录了自己在实操过程中的坑. 1.内网机器配置 假设现在有一台公用服务器和一台内网服务器,现在想通过反向代理的方式来访问内网服务器.假设公用服务器为A,内网服务器为B ...
随机推荐
- WordPress更改“固定链接”后 ,页面出现404的解决方法
一.Web服务器对应的是Nginx 解决方案:修改linux服务器下Nginx的配置文件,目录为:/usr/local/nginx/conf/nginx.conf, 也可以直接使用命令nginx -t ...
- Avalon的小故事 (1)
我:这个游戏真没意思,我为什么要玩这种东西 A:你渡过了前期才能发现这个游戏的乐趣 我:那我为什么不换一个游戏玩呢?换一个开头就让人欲罢不能的游戏? B:你这是逃避!你个懦夫! 我:我连自己选择游戏的 ...
- [日常] NOI前划水日记
NOI前划水日记 开坑记录一下每天的效率有多低 5.24 早上被春哥安排了一场NEERC(不过怎么是qualification round啊) 省队势力都跑去参加THU/PKU夏令营了...剩下四个D ...
- 微信小程序开发-蓝牙功能开发
0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...
- 【mysql报错】MySQL5.7.27报错“[Warning] Using a password on the command line interface can be insecure.”
MySQL5.7.27报错“[Warning] Using a password on the command line interface can be insecure.”在命令行使用密码不安全警 ...
- Ubuntu 16.04上源码编译和安装pytorch教程,并编写C++ Demo CMakeLists.txt | tutorial to compile and use pytorch on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/54e7a3d8/,欢迎阅读最新内容! tutorial to compile and use pytorch on ubuntu ...
- Django学习笔记(15)——中间件
当Django处理一个Request的过程是首先通过中间件,然后再通过默认的URL方式进行的.我们可以在Middleware这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Re ...
- 关于Idea突然无法输入的诡异问题解决
问题描述 最近加班把自己的装有Debian的笔记本带到公司,使用Idea写代码的时候,突然间无法输入,ctrl与tab还可用,重启Idea能得到一阵的解决 解决参考 如果是Linux平台,请考虑是否是 ...
- Java Scanner 类——获取用户的输入
创建Scanner对象语法 Scanner scan = new Scanner(System.in); 使用next()获取输入的字符串 import java.util.Scanner; publ ...
- 【目标检测】关于如何在 PyTorch1.x + Cuda10 + Ubuntu18.0 运行 CenterNet 源码
这几天一直在尝试运行CenterNet的源码,但是出现各种问题,本已经打算放弃,中午吃完饭又不甘心,打算重新安装环境再来一遍,没想到竟然成功了.所以,坚持下去,黑夜过后便是黎明. 注意:gcc/g++ ...