ssh reverse tunnel(转载)

1,647次阅读
没有评论

SSH 反向连接的使用

1、什么是反向连接?
反向连接是指主机 A(受控端)主动连接主机 B(控制端),在主机 A 和主机 B 之间建立一个远程连接,通过这个连
接主机 B 可以主动的向主机 A 发送一些请求。

2、为什么需要主机 A 主动去连接主机 B 呢?
这是因为主机 A 在局域网内,如果没有对主机 A 进行端口映射,对于主机 B 来说主机 A 是不可见的,如果在主机 B 这
边向主机 A 发送连接请求,这个请求是不可达的。而主机 B 有自己独立的 IP,对于主机 A 来说是可见的,可以直接向
主机 B 请求连接。

3、SSH 反向连接的过程
方法就是主机 A 主动去连接主机 B,主机 B 响应主机 A 的连接请求,它们之间就建立了一个远程连接。然后主机 B 在
本地再创建一个本地连接,重定向到主机 A 和主机 B 刚才建立的远程连接上,之后对这个本地连接的操作都会反馈到
远程连接上去。整个过程类似于文件的 DUP,这就在主机 A 和主机 B 之间建立了连接通道,此时对于主机 B 来说,主
机 A 已经是可见了。

连接流程如下:
3.1、主机 A ssh 客户端向主机 B sshd 服务端发送请求,建立远程连接。
3.2、主机 B sshd 服务端创建本地连接很远程连接的映射(反向连接通道)。
3.3、主机 B ssh 客户端向主机 B sshd 服务端的连接通道发送请求,建立主机 B ssh 和主机 A sshd 的连接。

完成连接后,主机 A 对于主机 B 可见的形式就是存在于主机 B 的那个本地连接。

4、为什么需要在主机 B 对远程连接映射一个本地连接?
反向连接就是 CS 架构,不过是受控端主动向控制端请求连接,让它们之间的连接建立。传统的 CS 方式是可以解决
主机 A 和主机 B 之间的连接问题,但是那样主机 A 和主机 B 的连接方式并不灵活,两者之间能做的事情,只能是 CS 之际
协议规定的事情。在主机 B 上建立了主机 A 的连接映射后,对于主机 B 来说主机 A 已经不是局域网内那台不可见的主
机,主机 A 已经是存在主机 B 的一台可见主机,这样就消除了局域网和广域网的阻碍。主机 A 和主机 B 之间建立的那
个远程连接就是主机 A 和主机 B 的通道-“网线”。

5、SSH 反向连接的使用
要建立反向连接,首先在主机 A 上运行:

代码: 全选
ssh -f -N -R 10000:localhost:22 lyb@3322.org
 
-N: 不执行任何命令  
-f: 在后台执行
-D: 建立 socks 代理
-L: 本地端口转向
-R: 远程端口转向
-p: 本地端口

10000 是主机 B 上的本地连接端口,22 是主机 B 上远程连接的那个端口,lyb@3322.org 是主机 B 的地址
连接上后,会需要输入密码。连接成功后,SSH 反向连接就建立起来了。要连接到主机 A,在主机 B 上运行:

代码: 全选
ssh lyb@localhost -p 10000

即可。

使用的过程中碰到一个问题,就是在主机 A 上发起请求的时候,需要输入密码。如果我在家里,不可能跑到公
司了去输入密码。于是用 ssh public key 的方法和写一个脚本来解决。脚本如下:

代码: 全选
#!/bin/bash<br />
while true;do<br />
RET=`ps ax | grep "ssh -f -N -R 10000:localhost:22" | grep -v "grep"`<br />
if ["$RET" = ""]; then<br />
echo "restart ssh server"<br />
ssh -f -N -R 10000:localhost:22 lyb@hahalee.3322.org<br />
fi<br />
sleep 10<br />
done<br />

脚本的作用就是监控反向连接的服务,在被异常中断的时候重启,使用了 SSH 公钥后,也不必跑到公司输入密
码了。

正文完
 0
评论(没有评论)
验证码