使用反向ssh从外网访问内网主机的方法详解

前言

最近遇到一个问题,就是过几天我需要离开学校,而且到时候仍然想登陆校园网里的一台服务器进行工作;但是我又没有校园网网关的操作权限,不能做端口映射,也不能搞到校园网内部主机的外网ip,而且学校自己提供的vpn又根本没法用。研究了半天,总算找到了一个比较不错的利用反向ssh(reverse ssh tunnel)进行内网登陆的解决方案。

工作原理

之所以很多转发的方法无法应用在这里,就是因为内网主机对外网其实是不可见的,也就是说外部主机不能用一般的方法访问到内部主机。那么我们就想了,能不能用内网主机找外网主机,找到之后再把这条内网主机登陆外网的信道转换成外网主机登陆内网的信道呢?辛运的是,这个方法的确是可行的,这也就是所谓反向ssh最通俗的理解,这就像寄信一样,”虽然我不知道你的地址,但是你知道我的地址,那么你就先给我写封信,告诉我你的地址,然后我不就可以回信给你了么?“。

操作步骤

由于我们自己使用的电脑未必有外网ip,因此我们需要一个有固定外网ip的服务器(随便搞个腾讯云阿里云的小机子就行),然后用这台服务器与内网的机子进行通信,我们到时候要先登陆自己的服务器,然后再利用这个服务器去访问内网的主机。

1、准备好有固定ip的服务器A,以及待访问的内网机器B。两者都开着sshd服务,端口号默认都是22。顺便做好ssh免密码登陆。

2、内网主机B主动连接服务器A,执行以下命令:

$ ssh -NfR 1111:localhost:22 username@servername -p 22

这条命令的意思是在后台执行(-f),不实际连接而是做port forwarding(-N),做反向ssh(-R),将远程服务器的1111端口映射成连接本机(B)与该服务器的反向ssh的端口。

附:这里有必要加强一下记忆,这个端口号一不小心就容易搞混。。man文档中的参数命令是这样的:

-R [bind_address:]port:host:hostport

bind_address以及其后面的port是指远程主机的ip以及端口,host以及其后的hostport是指本机的ip和端口。由于ssh命令本身需要远程主机的ip(上上条命令中的servername),因此这个bind_address原则上是可以省略的。

执行完这条命令,我们可以在服务器A上看到他的1111端口已经开始监听:

$ ss -ant |grep 1111
LISTEN  0  128    127.0.0.1:1111      *:*

3、在上面的操作中,这个1111端口就已经映射成了内网主机B的22端口了,现在我们只要ssh到自己的这个端口就行了。在服务器A中执行:

$ ssh username@localhost -p1111

这样就成功的登陆了内网的主机了。

功能优化

上面的做法其实有一个问题,就是反向ssh可能会不稳定,主机B对服务器A的端口映射可能会断掉,那么这时候就需要主机B重新链接,而显然远在外地的我无法登陆B。。。这其实有一个非常简单的解决方案,就是用autossh替代步骤2中的ssh:

$ autossh -M 2222 -NfR 1111:localhost:22 username@servername -p 22

后面的参数跟ssh都一样,只是多了一个-M参数,这个参数的意思就是用本机的2222端口来监听ssh,每当他断了就重新把他连起来。。。不过man文档中也说了,这个端口又叫echo port,他其实是有一对端口的形式出现,第二个端口就是这个端口号加一。因此我们要保证这个端口号和这个端口号加一的端口号不被占用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • SSH框架实现表单上传图片实例代码

    SSH框架的一个上传到服务器然后显示在页面上的小实例,用的是简单的form表单形式,数据包括图片的url地址保存在数据库中,图片上传到tomcat服务器下的项目文件夹里,然后页面展示图片, 算是好好把上传功能给过了一遍了,当然还有什么H5上传,分片上传等等这里就不提了,适用于初学上传文件的例子. 使用Bootstrap fileinput.js上传控件, GitHub源码下载:https://github.com/kartik-v/b... 页面上需要引入的CSS和JS <link rel=&quo

  • JSP 开发SSH整合异常解决办法

    SSH整合异常解决(creating bean with name 'sessionFactory' defined in class path) 整合SSH注解的方式,但是一直有异常.还是解决了,贴出来. [org.springframework.web.context.ContextLoader]: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error crea

  • SSH 框架简介

    什么是SSH SSH是 struts+spring+hibernate的一个集成框架,是目前较流行的一种web应用程序开源框架.SSH不是一个框架,而是把多个框架(Struts.Spring以及Hibernate)紧密的结合在一起,用于构建灵活.易于扩展的多层Web应用程序. SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域模块层(实体层). 我们通过下面这张图说明一下,三种框架的关系以及所包含的内容,内容已经很详细了,在这里就不做过多的解释了. 下面我们再详细看一下组成SS

  • SSH在登录服务器后如何显示基础信息

    前言 本文主要给大家介绍了SSH登录服务器后显示基础信息的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 方法如下: 安装landscape-common,可以在登录时候显示一些基础的信息,例如CPU内存占用等等 sudo apt-get install landscape-common 安装update-notifier-common,当有软件包更新的时候,会在SSH登录成功后提示用户 sudo apt-get install update-notifier-common 效果如下:

  • 使用反向ssh从外网访问内网主机的方法详解

    前言 最近遇到一个问题,就是过几天我需要离开学校,而且到时候仍然想登陆校园网里的一台服务器进行工作:但是我又没有校园网网关的操作权限,不能做端口映射,也不能搞到校园网内部主机的外网ip,而且学校自己提供的vpn又根本没法用.研究了半天,总算找到了一个比较不错的利用反向ssh(reverse ssh tunnel)进行内网登陆的解决方案. 工作原理 之所以很多转发的方法无法应用在这里,就是因为内网主机对外网其实是不可见的,也就是说外部主机不能用一般的方法访问到内部主机.那么我们就想了,能不能用内网

  • PHP实现限制IP访问及提交次数的方法详解

    本文实例讲述了PHP实现限制IP访问及提交次数的方法.分享给大家供大家参考,具体如下: 一.原理 提交次数是肯定要往数据库里写次数这个数据的,比如用户登陆,当用户出错时就忘数据库写入出错次数1,并且出错时间,再出错写2,当满比如5次时提示不允许再登陆,请明天再试,然后用DateDiff计算出错时和now()的时间,如果大于24就再开放让他试. 封IP的话特别是给IP断就比较简单了, 先说给IP段开放的情况:先取出客户访问的IP,为了解释方便,设有IP192.168.6.2 现要开放IP段为192

  • Java获取用户访问IP及地理位置的方法详解

    本文实例讲述了Java获取用户访问IP及地理位置的方法.分享给大家供大家参考,具体如下: 获取用户访问的IP地址 /** * 获取用户ip地址 * @return */ public static String getIp(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown&qu

  • 从外网访问内网本机的网站实现方法分享

    这是一个比较古老的话题了.一般懂得搭建网站的朋友,应该都会有分享自己小站的冲动.一来可以展示自己的作品,二来也可以方便别人看看网站,提提意见.呵呵. 鉴于网上类似的详细教程真的很少,也许是问题太简单了吧.但仍然有不少网友经常会问道.所以今天我就给大家做个详细的图文介绍.希望大家能对大家有所帮助. 想要让自己的小站能正确的被其他朋友访问到,需要注意下面几个条件: 1.IIS配置正常(这是必须的):2.你的电脑的IIS对应端口(默认为80)打开了:3.路由器里,相应的虚拟服务器功能映射到了本地IP:

  • 利用Redis实现访问次数限流的方法详解

    假设我们要做一个业务需求,这个需求就是限制用户的访问频次.比如1分钟内只能访问20次,10分钟内只能访问200次.因为是用户维度的场景,性能肯定是要首先考虑,那么适合这个场景的非Redis莫属. 最简单的实现,莫过于只是用incr进行计数操作,于是有了下面的代码: long count = redisTemplate.opsForValue().increment("user:1:60"); if (count > maxLimitCount) { throw new Limit

  • nginx外网访问内网站点配置操作

    背景: 站点是前后端分离:vue+springboot 前端内网地址:192.168.1.10:81 API内网地址:192.168.1.12:8080 外网域名:abc.ab.com 外网IP:10.114.X.X 需求: 通过域名可以访问站点且站点静态资源且可访问API请求数据 方案一:(前提:外网域名映射服务器外网IP) 1.nginx配置域名监听且访问静态资源 2.重点来了!!!静态资源请求API的地址由192.168.1.12:8080修改为域名访问方式(abc.ab.com:8080

  • Nginx反向代理一个80端口下配置多个微信项目详解

    Nginx反向代理一个80端口下配置多个微信项目详解 我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎么办? 我们可以用nginx服务器做反向代理来解决这个问题.nginx服务器对外80端口,然后根据URL参数不同,对内访问不同的项目. nginx配置如下: 打开/usr/local/nginx/conf/nginx.conf worker_pr

  • 语言编程花絮内建构建顺序示例详解

    目录 1 构建 顺序 1.1 交叉编译 1.2 设置 2 构建测试支持 1 构建 顺序 依据词法名顺序 当导入一个包,且这个包 定义了 init(), 那么导入时init()将被执行. 具体执行顺序: 全局变量定义时的函数 import 执行导入 -> cont 执行常量 --> var 执行变量 --> 执行初始化 init() --> 执行 main() ----> main import pk1 ---> pk1 const ... import pk2 ---&

  • angular内置provider之$compileProvider详解

    一.方法概览 1.directive(name, directiveFactory) 2.component(name, options) 3.aHrefSanitizationWhitelist([regexp]); 4.imgSrcSanitizationWhitelist([regexp]); 5.debugInfoEnabled([enabled]); 6.strictComponentBindingsEnabled([enabled]); 7.onChangesTtl(limit);

  • Linux使用Node.js建立访问静态网页的服务实例详解

    Linux使用Node.js建立访问静态网页的服务实例详解 一.安装node.js运行所需要的环境,:http://www.jb51.net/article/79536.htm 二.创建node目录(/node/www),并在目录下创建node.js服务文件server.js var http = require('http'); var fs = require('fs');//引入文件读取模块 var documentRoot = '/node/www';//需要访问的文件的存放目录 var

随机推荐