ssh反向主动连接 及脚本加密
????近來,在為公司客戶部署相關(guān)DNS系統(tǒng)服務(wù),用于資源調(diào)度服務(wù),但是客戶出口缺少公網(wǎng)ip地址,不能方便的去管理這臺(tái)服務(wù)器,開始想到使用teamviewer做中轉(zhuǎn),穿透內(nèi)網(wǎng),但是在Centos環(huán)境下,照teamviewer官方給出的手冊(cè)嘗試安裝多次,未果,始終未能獲取ID號(hào),甚至最后都安裝了圖形gnome環(huán)境,嘗試在圖形環(huán)境下安裝teamviewer,網(wǎng)絡(luò)始終是notReady,最后,只能放棄使用teamviewer,在公司找了臺(tái)有公網(wǎng)ip的機(jī)器,用ssh反向主動(dòng)連接,也就是常說的端口轉(zhuǎn)發(fā)。
? ? 這種方式跟最早網(wǎng)上流行的反彈式遠(yuǎn)程控制工具原理類似,像灰鴿子,任我行,Pcshare等等,包括現(xiàn)在很多***使用的遠(yuǎn)程控制***程序都是這種主動(dòng)連接反彈式***,“堡壘總是從內(nèi)部突破容易的多”。
? ? 回歸正題,先來實(shí)操,最后上原理。
系統(tǒng)環(huán)境:
? ? ? ? ?公司主機(jī):extrahost(代指主機(jī)名和ip,具有公網(wǎng)ip),用戶名:root ?ssh端口:2200
? ? ? ?客戶服務(wù)器:Intrahost(代指主機(jī)名和ip,私網(wǎng)ip做了NAT),用戶名:root ?ssh端口:2211
????????
ssh用到的參數(shù):
????????-N:不執(zhí)行何指令
????????????????-f:后臺(tái)執(zhí)行
????????????????-R:建立反向 tunnel
在客戶的系統(tǒng)中輸入如下命令:
----------------------------------------------------------------------------------------------------------
?[root@Intrahost ]# ssh -NfR 2233:localhost:2211 root@extrahost?-p 2200
輸入密碼即可
//port2233指綁定遠(yuǎn)程主機(jī)extrahost端口2233 ?
-------------------------------------------------------------------
?在公司管理設(shè)備查看端口2233是否在監(jiān)聽狀態(tài),netstat -ant,
?如果未成功監(jiān)聽,請(qǐng)檢查管理設(shè)備防火墻 和sshd是否有相關(guān)訪問控制
?在公司管理主機(jī)extrahost輸入如下命令和密碼,登陸到客戶系統(tǒng)intrahost
--------------------------------------------------------------------
[root@extrahost]#ssh root@127.0.0.1 -p 2233?
//即可連接到客戶的服務(wù)器上
------------------------------------------------------------------
問題
一.連接穩(wěn)定問題
? 由于是反向主動(dòng)連接,在會(huì)話異常中斷,無法由控制端發(fā)起連接,我們可以借助幾個(gè)工具來幫我們保持會(huì)話。
? 1.使用autossh工具 ?
????安裝方法 autossh工具不在linux源中,需要從第三方源下載
? ? ?地址:http://pkgs.repoforge.org/autossh/?安裝包有32位和64位,下載根據(jù)操作系統(tǒng)去選擇。
????使用方法 跟ssh類似,區(qū)別autossh需要不斷去檢測ssh連接狀態(tài),需要我們使用 -M參數(shù),來指定autossh監(jiān)聽端口:
---------------------------------------------------------------------------------------
???[root@Intrahost]autossh -M 1100 -NfR 2233:localhost:2211 root@extrahost?-p 2200
----------------------------------------------------------------------------------------
? ?2.使用nohup命令,截?cái)鄴炱鹦盘?hào)
????用法:Usage: nohup COMMAND [ARG]... ??
????????????or: ?nohup OPTION
????示例:
------------------------------------------------------------------------------------
[root@Intrahost]nohup ssh -NfR 2233:localhost:2211 root@extrahost?-p 2200
來中斷對(duì)ssh的掛起信號(hào)。
---------------------------------------------------------------------------
? 3.建議大家使用nohup命令,這種方法可靠性很高,原因稍后闡述,現(xiàn)在我們來編寫腳本使用crond定時(shí)任何計(jì)劃來保持ssh會(huì)話,腳本內(nèi)容如下。
?
#!/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? 添加定時(shí)任務(wù)計(jì)劃,重復(fù)執(zhí)行腳本來判斷通信隧道的建立
?-----------------------------------------------------
? ?命令:crontab -e
? ?*/1 * * * * /root/ReverseSsh.sh > tunnel.log 2>&1
??別忘了將腳本賦予執(zhí)行權(quán)限
? ----------------------------------------------------
????chmod u+x?/root/ReverseSsh.sh
? -----------------------------------------------------
鄙人能看到和想到的維持會(huì)話的方法,就在這了,歡迎大家分享自己的創(chuàng)新方法。
二、安全性問題
????雖然我們坦然的建立了這條tunnel,可是大家忽略了一個(gè)東西,就是建立反向連接的tunnel時(shí),我們需要輸入對(duì)方設(shè)備的密碼,假設(shè)我們的設(shè)備因?yàn)槲覀內(nèi)似返年P(guān)系,導(dǎo)致了重啟,這時(shí),無論再好的保持會(huì)話的工具和命令,都沒辦法替你輸入密碼,除非,公司的客戶是你的好朋友或者至少是你信任的人,讓他幫你輸入密碼,很不幸,事情往往超乎我們的想象。
? ??
? ?所以,我們需要建立一個(gè)腳本,來替我們輸入密碼,并且對(duì)腳本進(jìn)行加密,來防止客戶肆意窺探我們管理設(shè)備的密碼。也有,拿密鑰做認(rèn)證來免密碼登陸,不建議大家這么做,這樣雖然方便管理,但同樣意味著客戶可以使用該設(shè)備隨意進(jìn)入我們的管理設(shè)備,這是我們不愿意發(fā)生的事情,雖然我們的客戶很可愛而且善良和藹可親。
? ?
? 腳本內(nèi)容如下,我們需要借助自動(dòng)化工具expect,至于expect是怎樣的套件和工具,具體使用方法,大家可以去查資料學(xué)習(xí),這個(gè)是我們自動(dòng)化運(yùn)維較常用的交互工具,建議大家掌握。
?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 "? ? 腳本內(nèi)容功能實(shí)現(xiàn)簡單,大家可以盡情發(fā)揮,然后我們對(duì)該腳本文件進(jìn)行加密,較常用的有三四種,我們這里推薦大家使用SHC工具,方便安全容易。
? 詳細(xì)的安裝方法大家去網(wǎng)上檢索,這里簡單飄過,我們只說使用方法。
? ? ?下載地址:wget?http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
? ?
????下載后,我們進(jìn)行解包,
????tar -xvf?shc-3.8.9b.tgz
? ??
? 這個(gè)包下到的不是源代碼,是預(yù)編譯好的文件,直接安裝即可make install
? ?
????使用示例:[root@Intrahost]#shc -r -f ~/ReverseSsh_pass.sh
????
????運(yùn)行后會(huì)生成兩個(gè)文件,ReverseSsh_pass.x 和 ReverseSsh_pass.x.c.?? 其中sReverseSsh_pass.x是加密后的可執(zhí)行的二進(jìn)制程序;用./ReverseSsh_pass.x即可運(yùn)行,ReverseSsh_pass.x.c是生成ReverseSsh_pass.x的原文件,建議大家拷貝到自己電腦,從服務(wù)器上刪除。并且對(duì)該程序添加執(zhí)行權(quán)限,添加到開機(jī)啟動(dòng)。
????????????????[root@Intrahost]#?vi /etc/rc3.d/S99local
????在該文件下邊寫入我們加密腳本后的程序 /root/ReverseSsh_pass.x,用于開機(jī)自啟動(dòng)。注意這里是命令行方式,注意啟動(dòng)級(jí)別。
三、原理闡述,大神可忽略。
?1.SSH reverse tunnel
????????
?? ?如圖,為ssh服務(wù)的正向和反向兩種會(huì)話連接示意圖,正常情況下(正向),我們由客戶端發(fā)起會(huì)話請(qǐng)求到服務(wù)端,使用ssh協(xié)議為我們建立起一條連接通訊,我們可以將這條連接看做是條隧道(tunnel),這樣我就可以使用終端工具來遠(yuǎn)程管理我們的服務(wù)器,注意,這里我們并不是真正意思上打開了終端,而是我們?cè)诰W(wǎng)絡(luò)層上,通過建立起來的隧道來連接到終端,所以我們把像使用putty,Securecrt這類工具,建立起連接呈現(xiàn)的終端也叫仿真終端。
? ??
????既然我們建立起這樣一條隧道,那必然每條隧道都有相同的端點(diǎn),起始端和結(jié)束端,而這兩端的端點(diǎn)正是我們的客戶端和服務(wù)端,不同的是,正向連接是聲明要連接的對(duì)端ip和端口,而反向連接則是由服務(wù)端聲明可以連接到本機(jī)的對(duì)端ip和通訊端口。
????
????這里提醒大家的是,正向連接和反向連接,建立起隧道的方向是一致的,都是由客戶端作為起始端創(chuàng)建的通訊隧道,所謂的正向連接和反向連接取決于服務(wù)端在建立隧道的行為,正向連接,是被動(dòng)接受來自客戶端的請(qǐng)求,建立連接;而反向連接則是由服務(wù)端主動(dòng)請(qǐng)求連接,但創(chuàng)建會(huì)話連接的起始端始終是客戶端。
?????同樣,弄懂原理后,那么像Telnet,FTP,甚至是我們用來連接windows桌面的RDP,也可以實(shí)現(xiàn)反向連接,大家可以在網(wǎng)上搜搜具體方法。
?
????2.nohup
????
????剛才我們提到了nohup這個(gè)命令,這個(gè)理解其實(shí)很容易,從字面不難理解禁止掛斷,官方手冊(cè)解釋也很簡單,ignoring hangup signals,忽略掛斷信號(hào),個(gè)人認(rèn)為把它解釋為截?cái)鄴鞌嘈盘?hào),更好點(diǎn),nohup實(shí)現(xiàn)原理像一個(gè)守護(hù)進(jìn)程,但它工作的機(jī)制是信號(hào)量級(jí)的,當(dāng)我們所運(yùn)行的進(jìn)程在異常中斷,或者超時(shí)的時(shí)候,會(huì)產(chǎn)生中斷信號(hào),來結(jié)束該進(jìn)程,節(jié)約資源開銷,nohup原理就是當(dāng)收到來自針對(duì)該進(jìn)程的中斷信號(hào)時(shí),會(huì)阻止該信號(hào)的發(fā)送,從而保持進(jìn)程的運(yùn)行不會(huì)因?yàn)楫惓G闆r而中斷。
????使用這個(gè)命令的優(yōu)勢很明顯,autossh保持會(huì)話的工作原理基本和我們編寫的腳本類似,而nohup工作機(jī)制直接是信號(hào)量級(jí)的,不需要通過執(zhí)行另外的程序產(chǎn)生信號(hào)結(jié)果反饋,linux的信號(hào)機(jī)制起源于Unix系統(tǒng),信號(hào)量由軟件產(chǎn)生,進(jìn)程之間的通訊均由信號(hào)完成,所以nohup執(zhí)行效率和穩(wěn)定性相比autossh很高,或者說兩個(gè)沒有可比性,因?yàn)樗鼈儗?shí)現(xiàn)的方式不一樣。
?????就寫到這吧,路漫漫上下而求索,希望大家能提出更好的方法,最后附上相關(guān)組件和工具。
轉(zhuǎn)載于:https://blog.51cto.com/zj1991/1764244
總結(jié)
以上是生活随笔為你收集整理的ssh反向主动连接 及脚本加密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网格中的BFS,逆向(POJ2049)
- 下一篇: 幽若格格