反向ssh
参考 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
-----------
如果在
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的更多相关文章
- Windows下使用Xshell建立反向隧道
反向隧道是一个进行内网穿透的简单而有用的方法.在Linux下通过OpenSSH和AutoSSH可以很容易地建立稳定的反向隧道.但是在Windows下,还能看到有人特意装个Cygwin来运行这些工具…… ...
- [ssh]记ssh的几种玩法
得到一台Linux的服务器,我们可以进行以下几种玩法: 先讲一讲几个参数: -f 要求 ssh在执行命令前退至后台.它用于当ssh准备询问口令或密语,但是用户希望它在后台进行.该选项隐含了-n选 ...
- 树莓派autossh反向隧道
本来我是将树莓派连接到路由器,从而在电脑端通过IP访问.远在局域网之外的队友怎么访问呢? ssh反向隧道 它的原理比较简单: 树莓派主动向某公网服务器建立ssh连接,并请求公网服务器开启一个额外的SS ...
- PUTTY的使用教程
Putty是一个优秀的,开源的SSH远程登录软件. 它不仅仅可以实现登录,还有很多高级功能. PuTTY is a free SSH, Telnet and Rlogin client for 32- ...
- PuTTY 中文教程
PuTTY 中文教程 更新记录 2006-11-29初步完成想写的这些东西 2007-06-11PuTTY 的最新版本到了0.6:修改了一下 SSH 隧道:添加了 SSH 反向隧道:添加了用 SSH ...
- linux网络相关命令使用
A,iptables使用示例 1,将请求80端口的包发送给本机8180端口(这样,别的机器访问本机的80端口时会被转发到8180端口去) iptables -t nat -A PREROUTING - ...
- 布式实时日志系统(三) 环境搭建之centos 6.4下hadoop 2.5.2完全分布式集群搭建最全资料
最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...
- 一次绕过防火墙获取RCE以及提权到root权限的渗透过程
本文是关于Apache struts2 CVE-2013-2251是由于导致执行远程命令的影响而被高度利用的漏洞.简而言之, 通过操纵以“action:”/”redirect:”/”redirectA ...
- 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 ...
随机推荐
- 【Python】学习笔记十五:循环对象
循环对象 所谓的循环对象,包含有一个next()方法(python3中为__next__() ),这个方法的目的就是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误 当一个 ...
- Oracle Sequence用plsql修改
在plsql中,打开Objects窗口 找Sequences文件夹>你需要修改的Sequence 选中你需要修改的sequence,右键edit(编辑) OK!
- 字符串(string)操作的相关方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VueJS条件语句:v-if、v-else、v-else-if
HTML:if-else <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- robot framework selenium2library定位
进行页面元素操作,最麻烦的莫过于元素定位了,经常提示element is not visible 或者element is not exist 下面介绍常见的定位方法和定位中的问题 1 使用name和 ...
- Arrays.asList引起的java.lang.UnsupportedOperationException解决方法
在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下. 代码块 ...
- HDFS中数据节点数据块存储示例
数据块在数据节点上是按照如下方式存储的. 首先是一个存储的根目录/Hadoop/data/dfs/dn,如下图所示: 接着进入current目录,如下图所示: 再进入后续的BP-433072574-1 ...
- HTML经典标签用法
1.marquee属性的使用说明 <marquee> ... </marquee>移动属性的设置 ,这种移动不仅仅局限于文字,也可以应用于图片,表格等等 鼠标属性 onMo ...
- PowerBuilder -- 其他
判断某键是否被按下 KeyDown ( keycode ) 继承问题 如果是 uf_1是函数呢 你在父类UO_1的uf_1里面 写了代码,只要在子类UO_2的uf_1写了代码,默认是覆盖(over ...
- 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容
[-1]Before for specific info , please visit http://wiki.osdev.org/Loopback_Device [0]我们先上干货,看到效果后,我们 ...