近来,在为公司客户部署相关DNS系统服务,用于资源调度服务,但是客户出口缺少公网ip地址,不能方便的去管理这台服务器,开始想到使用teamviewer做中转,穿透内网,但是在Centos环境下,照teamviewer官方给出的手册尝试安装多次,未果,始终未能获取ID号,甚至最后都安装了图形gnome环境,尝试在图形环境下安装teamviewer,网络始终是notReady,最后,只能放弃使用teamviewer,在公司找了台有公网ip的机器,用ssh反向主动连接,也就是常说的端口转发。

这种方式跟最早网上流行的反弹式远程控制工具原理类似,像灰鸽子,任我行,Pcshare等等,包括现在很多***使用的远程控制***程序都是这种主动连接反弹式***,“堡垒总是从内部突破容易的多”。

回归正题,先来实操,最后上原理。

系统环境:

公司主机:extrahost(代指主机名和ip,具有公网ip),用户名:root  ssh端口:2200

客户服务器:Intrahost(代指主机名和ip,私网ip做了NAT),用户名:root  ssh端口:2211

ssh用到的参数:

-N:不执行何指令

-f:后台执行

-R:建立反向 tunnel

在客户的系统中输入如下命令:

----------------------------------------------------------------------------------------------------------

 [root@Intrahost ]# ssh -NfR 2233:localhost:2211 root@extrahost -p 2200

输入密码即可

//port2233指绑定远程主机extrahost端口2233

-------------------------------------------------------------------

在公司管理设备查看端口2233是否在监听状态,netstat -ant,

如果未成功监听,请检查管理设备防火墙 和sshd是否有相关访问控制

在公司管理主机extrahost输入如下命令和密码,登陆到客户系统intrahost

--------------------------------------------------------------------

[root@extrahost]#ssh root@127.0.0.1 -p 2233 

//即可连接到客户的服务器上

------------------------------------------------------------------

问题

一.连接稳定问题

由于是反向主动连接,在会话异常中断,无法由控制端发起连接,我们可以借助几个工具来帮我们保持会话。

1.使用autossh工具

安装方法 autossh工具不在linux源中,需要从第三方源下载

地址:http://pkgs.repoforge.org/autossh/ 安装包有32位和64位,下载根据操作系统去选择。

使用方法 跟ssh类似,区别autossh需要不断去检测ssh连接状态,需要我们使用 -M参数,来指定autossh监听端口:

---------------------------------------------------------------------------------------

[root@Intrahost]autossh -M 1100 -NfR 2233:localhost:2211 root@extrahost -p 2200

----------------------------------------------------------------------------------------

2.使用nohup命令,截断挂起信号

用法:Usage: nohup COMMAND [ARG]...

or:  nohup OPTION

示例:

------------------------------------------------------------------------------------

[root@Intrahost]nohup ssh -NfR 2233:localhost:2211 root@extrahost -p 2200

来中断对ssh的挂起信号。

---------------------------------------------------------------------------

3.建议大家使用nohup命令,这种方法可靠性很高,原因稍后阐述,现在我们来编写脚本使用crond定时任何计划来保持ssh会话,脚本内容如下。

#!/bin/bash createTunnel() {
/usr/bin/ssh -NfR 2233:localhost:2211 root@extrahost -p 2200
if [[ $? -eq 0 ]]; then
echo Tunnel to jumpbox created successfully
else
echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi

添加定时任务计划,重复执行脚本来判断通信隧道的建立

-----------------------------------------------------

命令:crontab -e

*/1 * * * * /root/ReverseSsh.sh > tunnel.log 2>&1

别忘了将脚本赋予执行权限

----------------------------------------------------

chmod u+x /root/ReverseSsh.sh

-----------------------------------------------------

鄙人能看到和想到的维持会话的方法,就在这了,欢迎大家分享自己的创新方法。

二、安全性问题

虽然我们坦然的建立了这条tunnel,可是大家忽略了一个东西,就是建立反向连接的tunnel时,我们需要输入对方设备的密码,假设我们的设备因为我们人品的关系,导致了重启,这时,无论再好的保持会话的工具和命令,都没办法替你输入密码,除非,公司的客户是你的好朋友或者至少是你信任的人,让他帮你输入密码,很不幸,事情往往超乎我们的想象。

所以,我们需要建立一个脚本,来替我们输入密码,并且对脚本进行加密,来防止客户肆意窥探我们管理设备的密码。也有,拿密钥做认证来免密码登陆,不建议大家这么做,这样虽然方便管理,但同样意味着客户可以使用该设备随意进入我们的管理设备,这是我们不愿意发生的事情,虽然我们的客户很可爱而且善良和蔼可亲。

脚本内容如下,我们需要借助自动化工具expect,至于expect是怎样的套件和工具,具体使用方法,大家可以去查资料学习,这个是我们自动化运维较常用的交互工具,建议大家掌握。

except安装方法,建议使用yum安装:

----------------------------------------------

yum -y install expect*

----------------------------------------------

#!/bin/sh
# description:The script file for keepalive ssh session
# Founder broadband interconnection.DE created by John.zhang
# update 20151104passwd=********expect -c "
/usr/bin/ssh -NfR 2233:localhost:2211 root@extrahost -p 2200
set timeout 5
expect \"password:\"
send \"${passwd}\r\"
expect eof
"

脚本内容功能实现简单,大家可以尽情发挥,然后我们对该脚本文件进行加密,较常用的有三四种,我们这里推荐大家使用SHC工具,方便安全容易。

详细的安装方法大家去网上检索,这里简单飘过,我们只说使用方法。

下载地址:wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz

下载后,我们进行解包,

tar -xvf shc-3.8.9b.tgz

这个包下到的不是源代码,是预编译好的文件,直接安装即可make install

使用示例:[root@Intrahost]#shc -r -f ~/ReverseSsh_pass.sh

运行后会生成两个文件,ReverseSsh_pass.x 和 ReverseSsh_pass.x.c.   其中sReverseSsh_pass.x是加密后的可执行的二进制程序;用./ReverseSsh_pass.x即可运行,ReverseSsh_pass.x.c是生成ReverseSsh_pass.x的原文件,建议大家拷贝到自己电脑,从服务器上删除。并且对该程序添加执行权限,添加到开机启动。

                [root@Intrahost]# vi /etc/rc3.d/S99local

在该文件下边写入我们加密脚本后的程序 /root/ReverseSsh_pass.x,用于开机自启动。注意这里是命令行方式,注意启动级别。

三、原理阐述,大神可忽略。

1.SSH reverse tunnel

如图,为ssh服务的正向和反向两种会话连接示意图,正常情况下(正向),我们由客户端发起会话请求到服务端,使用ssh协议为我们建立起一条连接通讯,我们可以将这条连接看做是条隧道(tunnel),这样我就可以使用终端工具来远程管理我们的服务器,注意,这里我们并不是真正意思上打开了终端,而是我们在网络层上,通过建立起来的隧道来连接到终端,所以我们把像使用putty,Securecrt这类工具,建立起连接呈现的终端也叫仿真终端。

既然我们建立起这样一条隧道,那必然每条隧道都有相同的端点,起始端和结束端,而这两端的端点正是我们的客户端和服务端,不同的是,正向连接是声明要连接的对端ip和端口,而反向连接则是由服务端声明可以连接到本机的对端ip和通讯端口。

这里提醒大家的是,正向连接和反向连接,建立起隧道的方向是一致的,都是由客户端作为起始端创建的通讯隧道,所谓的正向连接和反向连接取决于服务端在建立隧道的行为,正向连接,是被动接受来自客户端的请求,建立连接;而反向连接则是由服务端主动请求连接,但创建会话连接的起始端始终是客户端。

同样,弄懂原理后,那么像Telnet,FTP,甚至是我们用来连接windows桌面的RDP,也可以实现反向连接,大家可以在网上搜搜具体方法。

2.nohup

刚才我们提到了nohup这个命令,这个理解其实很容易,从字面不难理解禁止挂断,官方手册解释也很简单,ignoring hangup signals,忽略挂断信号,个人认为把它解释为截断挂断信号,更好点,nohup实现原理像一个守护进程,但它工作的机制是信号量级的,当我们所运行的进程在异常中断,或者超时的时候,会产生中断信号,来结束该进程,节约资源开销,nohup原理就是当收到来自针对该进程的中断信号时,会阻止该信号的发送,从而保持进程的运行不会因为异常情况而中断。

使用这个命令的优势很明显,autossh保持会话的工作原理基本和我们编写的脚本类似,而nohup工作机制直接是信号量级的,不需要通过执行另外的程序产生信号结果反馈,linux的信号机制起源于Unix系统,信号量由软件产生,进程之间的通讯均由信号完成,所以nohup执行效率和稳定性相比autossh很高,或者说两个没有可比性,因为它们实现的方式不一样。

就写到这吧,路漫漫上下而求索,希望大家能提出更好的方法,最后附上相关组件和工具。

转载于:https://blog.51cto.com/zj1991/1764244

ssh反向主动连接 及脚本加密相关推荐

  1. ssh 反向代理连接内网服务器并配置开机自启动(解决autossh无法开机自启动)

    Q:现有公网服务器A和内网服务器B,如何通过ssh连接B呢 A: 安装autossh 配置B免密登录A,弄了之后B运行ssh root@123.123.123.123,以便将A加入到B的know_ho ...

  2. 用ssh反向连接访问内网主机 ( 实例使用autossh隧道实现mysql的同步 )

    一.准备知识 什么是autossh? 假设有两台主机: A主机为外网,B主机为内网 通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有 两种方法: 1 ...

  3. 利用SSH 反向代理 ,实现跨局域网连接家里的linux 主机 (树莓派)

    最近我买了一台树莓派主机 ,并且装上了官方系统(Raspbian ).打算用它来跑跑脚本之类的.但是遇到一个问题,我在外的时候,怎么远程连接家里的在局域网中的主机呢? 我已经成功的解决了这个问题,期间 ...

  4. SSH反向连接及Autossh

    SSH反向连接及Autossh http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触 ...

  5. [转]SSH反向连接及Autossh

    http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触Linux恐怕对SSH再熟悉不过 ...

  6. 【环境配置】反向SSH——家中电脑连接校园内网服务器

    1. 需求描述 1.1 具体情境 实验室有一台校园内网GPU服务器,校园内网的特点是只允许内网机器主动访问外网机器,而不允许外网机器主动访问内网机器. 现在需要使用家中的电脑(无公网IP的机器,其可能 ...

  7. SSH连接方式及加密方式

    Begin 1.关于对称加密与非对称加密: 对称加密:加密解密使用同一个密钥,即消息发送方与接收方需要协商一个共同的密钥用于消息传输中加解密. 优势:加解密效率高,对计算机要求更低. 劣势: 需要有安 ...

  8. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...

  9. 使用SSH反向隧道进行内网穿透

    这篇文章主要介绍了如何利用SSH 反向隧道穿透NAT,并演示了如何维持一条稳定的SSH 隧道. 假设有机器A 和B,A 有公网IP,B 位于NAT 之后并无可用的端口转发,现在想由A 主动向B 发起S ...

最新文章

  1. 详解分布式系统与消息投递
  2. 【hdu1241Oil Deposits】【HDU 2612 Find a way】
  3. 区块链基础知识系列 第二课 区块链共识算法
  4. sigmastarSSD201/SSD202 github上开源了!
  5. SAP 电商云 Spartacus UI 的 style library 介绍
  6. [ActionScript 3.0] AS3.0 下雨及涟漪效果
  7. struts2 kindeditor teatarea拿不到值问题。
  8. WildFly Swarm –将Java EE应用程序部署为独立的Jar
  9. conflicting types for ‘方法名’ 的错误
  10. 扔盘子(51Nod-1279)
  11. js使用showModalDialog,弹出一个自适应大小窗口
  12. 一个价值$1.5万的 PS NOW 漏洞
  13. Android中Fragment生命周期和基本用法
  14. 计算机组成原理思维导图——中央处理器(CPU)
  15. Honeywell EPKS通用中文操作手册
  16. 网校平台对在线教育的好处
  17. 六级阅读真题词组(2016)
  18. Win7旗舰版电脑插耳机没声音怎么解决
  19. slack 使用说明_我如何使用Slack作为自己的个人助理
  20. 关于MFC的使用总结之八——CGridListCtrlEx鼠标响应事件

热门文章

  1. java:栈空间,堆空间,方法区
  2. redis 4.0.8 源码包安装集群
  3. Heap Allocation Profiles (heap=sites)
  4. 分享Silverlight/WPF/Windows Phone一周学习导读(10月16日-10月22日)
  5. [设计模式]原型模式
  6. ArcGIS Runtime for .Net Quartz开发探秘(三):承接来自GIS服务器的服务
  7. 使用SharedPreferences进行数据存储
  8. 《C语言课程设计》一第3章 文 件 类
  9. Server 2012 RDS ‘there are no Remote Desktop License Servers available to provide a license.’
  10. linux系统下搭建php环境之-Discuz论坛