参考 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. 在Ubuntu 14.04 64bit中永久添加DNS的方法

    DNS信息是由/etc/resolv.conf提供的,它是每次开机时,由/sbin/resolvconf生成的/etc/resolv.conf是/run/resolvconf/resolv.conf的 ...

  2. vim diff 的使用

    vimdiff 是vim的比较工具可以对两个文件进行差异比较和快速合并 1. 使用vimdiff 比较两个文件 方式一 vimdiff  file_left  file_right   或者  vim ...

  3. Dell 刀片服务器CentOS6.5mini开机20~30分钟宕机

    今天查看系统日志发现大量的nf_conntrack: table full, dropping packet. 错误 cat /var/log/messages | moreJun  7 09:52: ...

  4. servletResponse 随机生成图片验证码

    /***********************************servlet页面************************************/ package response; ...

  5. servletResponse outputStream输出数据

    package response; import java.io.IOException;import java.io.OutputStream; import javax.servlet.Servl ...

  6. python学习(五)列表

    #!/usr/bin/python # 列表的学习, 列表的概念不陌生, 就是熟悉一下python中的列表是如何操作的 # 1. 序列的操作 L = [ 123, 'spam', 1.23] # 里面 ...

  7. 在linux系统中I/O 调度的选择 (转)

    I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Completel ...

  8. js new一个函数和直接调用函数的差别

    用new和调用一个函数的差别:假设函数返回值是一个值类型(Number.String.Boolen)时,new函数将会返回这个函数的实例对象.而假设这个函数的返回值是一个引用类型(Object.Arr ...

  9. asm 与 cglib(整理的)

    参考博客地址 http://www.oseye.net/user/kevin/blog/304#top http://www.blogjava.net/vanadies10/archive/2011/ ...

  10. 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线

    [BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...