ssh反向主动连接 及脚本加密

近来,在为公司客户部署相关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

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

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

 [[email protected] ]# ssh -NfR 2233:localhost:2211 [email protected] -p 2200

输入密码即可

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

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

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

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

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

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

[[email protected]]#ssh [email protected] -p 2233 

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

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

问题

一.连接稳定问题

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

1.使用autossh工具

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

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

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

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

[[email protected]]autossh -M 1100 -NfR 2233:localhost:2211 [email protected] -p 2200

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

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

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

or:  nohup OPTION

示例:

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

[[email protected]]nohup ssh -NfR 2233:localhost:2211 [email protected] -p 2200

来中断对ssh的挂起信号。

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

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

#!/bin/bash 
 createTunnel() {  
/usr/bin/ssh -NfR 2233:localhost:2211 [email protected] -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 20151104

passwd=********

expect -c "
/usr/bin/ssh -NfR 2233:localhost:2211 [email protected] -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

使用示例:[[email protected]]#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的原文件,建议大家拷贝到自己电脑,从服务器上删除。并且对该程序添加执行权限,添加到开机启动。

                [[email protected]]# 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很高,或者说两个没有可比性,因为它们实现的方式不一样。

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

时间: 2024-08-26 16:01:29

ssh反向主动连接 及脚本加密的相关文章

买阿里云 搭建ssh反向远程连接

1,创建反向链接 [email protected]:~$ ssh -f -N -R 8888:localhost:22 [email protected] OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 debug1: Reading configuration data /home/chunli/.ssh/config debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ss

ssh 反向隧道连接

A 办公室内局域网内 一台linux主机  IP 192.168.6.1xxB 公网 一台linux VPS             IP 139.129.6.xxxC 家里 一台linux主机             IP 192.168.125.xxx A向B发起,建立连接: ssh -f -N -R 10001:localhost:22 [email protected] 从C主机登录B主机 [email protected]:/var/www/html# ssh [email prote

SSH反向连接及Autossh

转自: http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞).稍懂一点网络的童鞋会明白,Internet上去主动连接一台

[转]SSH反向连接及Autossh

http://www.cnblogs.com/eshizhan/archive/2012/07/16/2592902.html SSH反向连接及Autossh 0.接触Linux恐怕对SSH再熟悉不过了,还有scp,sftp各种方便的功能,一般的使用都需要ip:port(如果不是默认22的话),但有些情况比较特殊,就是想连接一台内网主机(比如公司内网,当然你肯定做不了Port Forwarding,除非你想在公司防火墙上拆个洞).稍懂一点网络的童鞋会明白,Internet上去主动连接一台内网是不

利用ssh反向代理以及autossh实现从外网连接内网服务器

1. 描述一下目前的机器状况,梳理梳理: 机器 IP 用户名 备注 A 10.21.32.106 gdut728 目标服务器,处于内网 B 123.123.123.123 root 外网服务器,相当于桥梁的作用 PS:123.123.123.123只是我随意起的,大家请别攻击别人的服务器啊啊啊 2. 解决方法: 通俗地说:就是在机器A上做到B机器的反向代理:然后在B机器上做正向的代理实现本地端口的转发 2.1 实现前的准备 每台都要安装ssh的客户端. 在这里我使用的是centos7,都自带ss

SSH反向代理

问题描述 很多人肯定碰到这样一个问题:自己办公室的电脑回家之后就没法通过家里的电脑远程连接过来了.除非通过拨通VPN或者其他方式先连接到公司内网.如果公司没有VPN,那么我们如何通过SSH连接到公司的电脑呢?这里我们可以使用SSH反向代理 实验环境 机器编号 IP 用户名 备注 A 172.16.206.131 aaa 目标服务器,在局域网中,可以访问 A B 10.10.10.206 bbb 代理服务器,在外网中,无法访问 A C 10.10.10.202 可以直接访问 B,无法直接访问 A

〖Linux〗自动连接VPN脚本(开机执行)

最近发现VPN经常会断线.. 环境:Ubuntu 14.04 一.创建VPN配置 单击桌面右上网络图标 -- 编辑连接 -- 添加 -- PPTP -- 新建 (填写上网关.用户名.密码...) 高级 -- 使用点到点加密(MPPE) -- 确定 二.查看刚刚新建网络UUID: nmcli con list 记录下你的VPN连接UUID 三.编写自动连接脚本: sudo vi /etc/init.d/autovpn sudo chmod +x /etc/init.d/autovpn 1 #!/b

SSH防暴力破解shell脚本

写的一个SSH的防暴力破解脚本. 原理是检测SSH连接日志,过滤登录失败的IP,超过登录次数就将其添加进hosts.deny文件中,限制其登录. 脚本如下: #! /bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /root/black.txt DEFINE="10" for i in `cat  /root/bla

利用云主机做 ssh 反向隧道

[背景] 有三台主机 A.S.B,系统均为Linux.主机 A 和主机 B 在各自不同的内网,主机 S 为一台具有公网 IP 的云主机.主机 A 与主机 B 都可以通过 ssh 连接主机 S.如下图: [需求] 主机 A 需要通过主机 S 连接主机 B. 主机A信息: ip [方法] 1.设置主机 S. 1.1.编辑 /etc/ssh/sshd_config 文件,在里面修改或添加: GatewayPorts yes 1.2.重启 sshd 服务. sudo service sshd resta