参考 https://www.thegeekstuff.com/2013/11/reverse-ssh-tunnel/

https://www.howtoforge.com/reverse-ssh-tunneling

1. 背景

机器A的ip 192.168.0.100,机器B的ip 123.123.123.123

机器A是一个内网机器,可以访问外网。机器B是一个公网机器。也就是说,机器A可以ssh上机器B,但是机器B不能连接机器A。

另一种情况:机器A虽然也是有公网ip,但是由于安全原因,无法被外网访问。

现在,我们想通过机器B去访问机器A。

假设机器A和B都装有ssh服务端,服务端口分别为1001和1002

2. 方案

  ssh的 -R参数

step1:

首先,在机器A上运行

ssh -R 7000:localhost:1001 B_user@123.123.123.123 -p 1002

这样机器A就主动和机器B建立了一个ssh连接。只要机器该建立连接的tty不关闭,此连接一直存在。当然,我们可以将该连接放入后台,同样保证该连接一直存在。

(使用-fn参数?)

一般来说,机器A连接B只需要ssh username@123.123.123.123 就可以了。所以, -R 7000:localhost:1001 是做什么用呢?正是为了做反向连接。

这个-R参数在连接B机器的同时,对B机器做了这样的请求:在localhost端口7000上监听,并将在此接收到的数据包通过我们这个ssh连接转发给我。B按照该请求执行是ssh协议允许的,在B机器上7000端口监听的仍然是sshd进程,它可以决定将数据包用sshd下的哪个线程进行处理。当然,此后发往B机器上7000端口的数据都会倍sshd进程收到,并由A与B的ssh通道发送给A。

另外,A机器收到这个数据后,认为这个数据是发给1001号端口的,即A机器上的ssh服务。整个过程都是在ssh服务框架下完成的。

step2:

在B机器上任开一个tty,执行

ssh A_user@localhost -p 7000

即可连接到A机器了。这个命令的意思是,使用用户名A_user连接本机的7000端口。由于端口为7000的数据包会被通过step1里建立的连接发送给A机器,所以这个连接请求也就最终发给A机器了。

在B机器上使用lsof -i4 -n 可以看到ssh 再127.0.0.1:7000上监听。

在机器A上使用nmap -A 123.123.123.123/32 -p 7000 探测7000端口是关闭,因为B机器监听的地址是本地地址。

但即使将上面命令的localhost改为123.123.123.123,链接后也发现是在127.0.0.1:7000上监听。

3. 扩展

  另一台可以访问到B机器的机器C,如何通过B机器访问A呢?

       首先,C可以ssh到B,然后再一步ssh到A。

但是,有时候需要再C上直接ssh到A,该怎么办呢?
      方案是在B上使用iptables进行端口转发。
    假设A对B发起反向ssh,B在127.0.0.1:7000上监听, 而我们想在C上通过B的端口7000直接ssh到A,由于C只能连接B的公网ip 123.123.123.123,所以我们需要一个新的端口假设7777.
     我们在B上将发往123.123.123.123:7777的数据转发到127.0.0.1:7000
 iptables -t nat -A PREROUTING -d 123.123.123.123 -p tcp -m tcp --dport 7777 -j DNAT --to-destination 127.0.0.1:7000
 
特别注意: 转发到localhost一般需要手工开启本地路由,将/proc/sys/net/ipv4/conf/all/route_localnet写入1
        参考https://superuser.com/questions/661772/iptables-redirect-to-localhost
 

-----------

如果在

ssh -R 7000:localhost:22 B_user@123.123.123.123

命令中将localhost改为*或123.123.123.123,使用 lsof -i4 也可以看到在7000端口监听,但是监听的地址仍然是127.0.0.1。 而且此时无法进行反向ssh,提示

ssh_exchange_identification: Connection closed by remote host

反向ssh的更多相关文章

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

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

  2. [ssh]记ssh的几种玩法

    得到一台Linux的服务器,我们可以进行以下几种玩法: 先讲一讲几个参数: -f    要求 ssh在执行命令前退至后台.它用于当ssh准备询问口令或密语,但是用户希望它在后台进行.该选项隐含了-n选 ...

  3. 树莓派autossh反向隧道

    本来我是将树莓派连接到路由器,从而在电脑端通过IP访问.远在局域网之外的队友怎么访问呢? ssh反向隧道 它的原理比较简单: 树莓派主动向某公网服务器建立ssh连接,并请求公网服务器开启一个额外的SS ...

  4. PUTTY的使用教程

    Putty是一个优秀的,开源的SSH远程登录软件. 它不仅仅可以实现登录,还有很多高级功能. PuTTY is a free SSH, Telnet and Rlogin client for 32- ...

  5. PuTTY 中文教程

    PuTTY 中文教程 更新记录 2006-11-29初步完成想写的这些东西 2007-06-11PuTTY 的最新版本到了0.6:修改了一下 SSH 隧道:添加了 SSH 反向隧道:添加了用 SSH ...

  6. linux网络相关命令使用

    A,iptables使用示例 1,将请求80端口的包发送给本机8180端口(这样,别的机器访问本机的80端口时会被转发到8180端口去) iptables -t nat -A PREROUTING - ...

  7. 布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料

    最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...

  8. 一次绕过防火墙获取RCE以及提权到root权限的渗透过程

    本文是关于Apache struts2 CVE-2013-2251是由于导致执行远程命令的影响而被高度利用的漏洞.简而言之, 通过操纵以“action:”/”redirect:”/”redirectA ...

  9. hadoop 2.2.0集群安装详细步骤(简单配置,无HA)

    安装环境操作系统:CentOS 6.5 i586(32位)java环境:JDK 1.7.0.51hadoop版本:社区版本2.2.0,hadoop-2.2.0.tar.gz 安装准备设置集群的host ...

随机推荐

  1. css:颜色名和十六进制数值

    http://www.w3school.com.cn/cssref/css_colornames.asp

  2. EMC机理------串扰

    转:电子工程师不得不知道的EMC机理------串扰(韬略科技EMC) 串扰是信号完整性中最基本的现象之一,在板上走线密度很高时串扰的影响尤其严重.我们知道,线性无缘系统满足叠加定理,如果受害线上有信 ...

  3. apt-get update --> Bad header line (fresh install) Ign http://archive.ubuntu.com natty-security/multiverse Sources/DiffIndex W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/natty/Rele

    apt-get update --> Bad header line (fresh install) fresh natty install i386 desktop. I get this e ...

  4. SpringBoot开启https以及http重定向

    一.使用JDK keytool创建SSL证书 进入$JAVA_HOME/bin目录,运行以下命令 keytool -genkey -alias WeChatAppletsDemo -keypass - ...

  5. git系列1

    git clone支持多种协议,除了HTTP(s)以外,还支持SSH.Git.本地文件协议等,下面是一些例子. $ git clone http[s]://example.com/path/to/re ...

  6. SkipList跳跃表(Java实现)

    取自网络https://github.com/spratt/SkipList AbstractSortedSet.java package skiplist_m; /***************** ...

  7. 16 redis之sentinel运维监控

    一:sentinel运维监控 Sentinel不断与master通信,获取master的slave信息. 监听master与slave的状态 如果某slave失效,直接通知master去除该slave ...

  8. MySQL -- Ubuntu下的操作命令

    =======================安装======================参照MySQL官网的步骤:https://dev.mysql.com/doc/mysql-apt-repo ...

  9. 关于-O0、O1、O2、O3优化

    少优化->多优化: O0 -->> O1 -->> O2 -->> O3 -O0表示没有优化,-O1为缺省值,-O3优化级别最高 整理自网络,仅供参考 1.- ...

  10. EasyPlayerPro windows播放器本地配置文件配置方法介绍

    需求背景 应EasyPlayerPro某客户需求,在EasyPlayerPro启动时,自动播放指定的url源, 不需要每次都去手动填写, 且实现自动播放,不需要手动的单击播放按钮: 为响应该需求,特增 ...