电脑计算机论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1882|回复: 0

SSH反向连接的作用和使用方法

[复制链接]
admin 发表于 2016-4-13 16:59:36 | 显示全部楼层 |阅读模式
SSH反向连接的使用

1、什么是反向连接?

反向连接是指主机A(受控端局域网ip)主动连接主机B(控制端公网ip),在主机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@jsjlt.com

10000是主机B上的本地连接端口, 22是主机B上远程连接的那个端口, lyb@jsjlt.com是主机B的地址

连接上后,会需要输入密码。连接成功后,SSH反向连接就建立起来了。要连接到主机A,在主机B上运行:

代码: ssh lyb@localhost -p 10000

即可。

—————————-

内网主机A(192.168.1.1) 外网主机 B(100.100.100.100)

正常情况 可以从内网主机A 通过ssh 连接到外网主机B


现在需要 通过外网主机B 连接 内网主机A

原理:

利用ssh自身功能, 建立 主机B 到主机A 的连接通道。
操作:

1.在主机A上建立通道

ssh -NfR 2222:localhost:22 httpd@100.100.100.100 -p 22

注释: -Nf 命令在后台运行

-R 建立反向通道

2222 在主机B上建立端口映射

localhost:22 将主机B端口2222 映射到主机A端口22上

httpd@100.100.100.100 远程登录主机B用户名及IP

-p 22 主机B ssh登录端口

执行后可以查看进程

ps axu |grep ssh

ssh -NfR 2222:localhost:22 httpd@100.100.100.100

2.登录主机B

查看已经建立好的映射端口

netstat -antp

tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN -

登录内网主机A

ssh -p 2222 httpd@localhost

注释:

-p2222 已建立到内网主机A的映射端口

httpd 内网主机A的ssh 登录用户

@localhost 可以看到映射端口只监听到127.0.0.1 上

执行命令后显示登录成功,则大功告成

PS:
1. 如果用key登录则无须输入密码

2. 如果报错: Permission denied (publickey,gssapi-with-mic).

key不对或者key用户不对。

使用的过程中碰到一个问题, 就是在主机A上发起请求的时候, 需要输入密码。 如果我在家里, 不可能跑到公

司了去输入密码。于是用ssh public key的方法和写一个脚本来解决。脚本如下:


复制代码
代码如下:


#!/bin/bash
while true;do
RET=`ps ax | grep "ssh -f -N -R 10000:localhost:22" | grep -v "grep"`
if [ "$RET" = "" ]; then
echo "restart ssh server"
ssh -f -N -R 10000:localhost:22 lyb@jsjlt.com
sleep 10
done


脚本的作用就是监控反向连接的服务, 在被异常中断的时候重启, 使用了SSH公钥后, 也不必跑到公司输入密码了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则


QQ|手机版|小黑屋|电脑计算机论坛 ( 京ICP备2022023538号-1 )

GMT+8, 2024-4-27 03:32 , Processed in 0.068883 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表