参考 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. Java String 常用函数

    1>获取  1.1:字符串中包含的字符数,也就是字符串的长度.   int length():获取长度  1.2:根据位置获取位置上某个字符.   char charAt(int index) ...

  2. 笔记本WIFI卡简介

    1.Intel AC9560(CNVI) AC9260(pcie) 3165D2W(pcie) 2.Realtek瑞昱 RTL8822be(pcie) RTL8723BU(USB) 英特尔在300系主 ...

  3. Battery Charging Specification 1.2 中文详解

    转:       http://blog.csdn.net/liglei/article/details/228 1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的 ...

  4. webpack3.0 环境搭建

    额.备份一下总是好的 #为了避免某些国外镜像源安装失败,先设置淘宝镜像代理 yarn config set registry https://registry.npm.taobao.org # 初始化 ...

  5. GIT简单使用——私人库篇

    1.生成公钥公钥是远程库识别您的用户身份的一种认证方式,通过公钥,您可以将本地git项目与远程库建立联系,然后您就可以很方便的将本地代码上传到远程库,或者将远程库代码下载到本地了.$ ssh-keyg ...

  6. 浅谈iOS中MVVM的架构设计与团队协作【转载】

    今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  7. Android之怎样全屏显示

    三种方法: 1 自己定义主题(见设置自己定义样式和主题一节) http://blog.csdn.net/wei_chong_chong/article/details/47438907 2 使用系统自 ...

  8. 04 redis list结构及命令详解

    一:link 链表结构 lpush key value 作用: 把值插入到链接头部[右边] 注意:rpush key value 插入到左边 rpop key 作用: 返回并删除链表尾元素 rpush ...

  9. Ubuntu64位安装Adobe Reader 9.5.5

    Aodbe Reader在Linux下的效果比Foxit Reader(福昕阅读器)要好一些,尤其对于中文文档而言.本文介绍Adobe Reader在Ubuntu下的安装,文章<Ubuntu12 ...

  10. mysql 5.5主从复制配置

    首先将主库现有的要实现主从的数据库原原本本地复制到从库上,目的是一开始就让主从同步,让binlog日志从最新的记录开始同步! 备份: 方法1:快捷导出所要的库如(库goods)[注意:该方法仅适合My ...