如何巧用SSH突破防火墻
前言
眾所周知,一個公司內部與外部網絡之間是由防火墻存在的,防火墻的的存在保證了,企業內部的
安全性。像一些明文傳輸的協議telnet或者一些安全性不是那麽高的協議icmp,走這些協議的數據時 極
度不安全的,在防火墻規則中都是明令禁止的,有時我們由於業務的 需求,需要在外網與內網傳輸一些
像telnet這樣的流量,而我們又沒有權利去要求相關的部門隨意修改防火墻策略。此時SSH協議便可助你
突破防火墻的障礙,成功完成數據傳輸。
ssh工作原理
SSH 會自動加密和解密所有SSH客戶端與服務端之間的網絡數據。但是,SSH還能夠將其他TCP端
口的網絡數據通過SSH鏈接來轉發,並且自動提供了相應的加密及解密服務。這一過程也被叫做"隧道"
(tunneling),這是因為SSH為其他TCP鏈接提供了一個安全的通道來進行傳輸而得名。例如,
Telnet,SMTP,LDAP這些TCP應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。
而與此同時,如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許SSH的連接,也能夠通過
將TCP端口轉發來使用SSH進行通訊。
ssh本地轉發
1、原理圖
圖解:Host A以Host B為跳板機,通過ssh協議先打通自己與局域網的“隧道”,然後以Host B
的為telnet client端,建立與Host C的telnet連接,最終實現Host A能夠與目標主機Host C之間實現
telnet流量創輸。而在外圍有ssh協議為這些telnet流量“保駕護航”,我們在也不用擔心自己的數據被
截獲。
2、實現ssh本地轉發
1)準備階段
準備3臺虛擬機,可以使CentOS系列,也可以是RHEL系列。為了實驗能夠順利實現,我們手動關
閉防火墻(iptables -F)和SELinux(setenforce 0)當然了這僅僅是為了實驗的需要,在生產場景中實
不允許的。然後確保Host C主機都有telnet server服務,而Host B具有ssh server功能。通過rpm -q 來
查看服務是否安裝。
2)建立連接
首先:測試Host A能否使用telnet與Host C建立連接,如果能,那麽在Host C上使用防火墻規則禁
用Host A在訪問(iptables -A INPUT -s HostA_ip -j REJECT)。
建立ssh隧道,實現防火墻的突破,進入LAN。
上圖中,使用命令ssh -L實現隧道的建立。4000表示我們隨機指定開啟的端口,確保該端口是不被
任何服務使用。172.18.253.159表示目標主機(Host C)的的地址;23表示要連接目標主機的相應服務
端口,如果是telnet服務則是23,smtp則監聽在25。-N表示不打開遠程shell,處於等待狀態,-f表示後
臺啟用。172.18.18.13則表示“跳板機”的地址,在本例中即Host B的IP地址。
上例中,我們用過ssh -tn查看發現,我們其實不是與目錄主機建立了連接,而是與Host B建立了連
接,這就說明,該隧道已經建立好了。其次:我們再去查看Host C機器的連接情況,發現,並沒有任何
主機與自己建立連接。
最後:實現telnet流量傳輸。在Host A主機是哪個使用telnet去連接目標主機Host B,出現下圖所
示的內容,則說明telnet鏈路已通,然後連接進入目標主機Host C,使用ss -tn 查看,你會發現並不是
Host A與自己建立的telnet連接,而是“跳板機”Host B。
建立telnet連接之後我們在來看看Host A上的連接情況。ss -tn
而Host B在收到Host A的telnet流量後,自己充當telnet客戶端去連接Host C的telnet服務氣端。
到此,基於SSH的本地轉發就實現了。
ssh端口轉發
1、應用場景
ssh基於端口轉發的應用場景一般是這樣:當我們在企業內部想要訪問外部的某些站點,但是有防
火墻禁用訪問站點的端口,例如httpd服務的80端口,這樣我們便不能訪問外部網站。此時我們就可以使
用ssh端口轉發的方法實現,訪問外部站點。
2、原理圖
上圖中,由於防火墻的原因,Host A 並不能訪問Host C站點,此時我們可以在外部找一個主機
Host B,以Host B 為代理服務器,這樣,Host A 通過ssh協議突破防火墻,訪問代理服務器,在由代理
服務器將Host A的訪問請求發送給Host C服務器,獲取相應的信息(例如,網頁信息),然後在回傳給
客戶端Host A。
3、實例
1)準備階段
準備3臺主機,Host A 、HostB、Host C,用HostA 客戶端,Host C作為服務器端,而Host B作
為代理服務器agent。實驗需求,將Host B的防火墻關閉,關閉所有主機的SELinux功能。
2)方案實現
模擬防火墻,我們在Host C上設置防火墻規則,拒絕Host A 的任何請求 :
在主機Host A上試著去抓取Host C的網頁:
[ [email protected] ~ ]#curl http://172.18.18.13 curl: (7) Failed connect to 172.18.252.50:80; Connection refused # 被拒絕 [ [email protected] ~ ]#
然後在Host A上建立ssh連接
此時在你用Host A去訪問依然不行,我們需要在Host B上做代理配置。這樣才能轉發數據信息。
[ [email protected] ~ ]#curl --socks5 127.0.0.1 <h1>I love linux...</h1> # 成功抓取到網頁
ssh遠程轉發
1、原理圖
原理與ssh本地轉發大體相同,這裏就不放實驗過程了,只是ssh的服務器端與客戶端的角色發生了
改變,由於,在一個企業內部,我們想要從內向外訪問某端口,防火墻是沒有限制的,但是想要從外向
裏訪問就很困難。ssh遠程轉發的就是通過,局域網內部的主機充當ssh客戶端與LAN外的主機建立連
接,從而打通外部與內部的通道。此時有人可能會有疑問,不還是進步來麽?其實不然,防火墻也是有
鏈路記憶功能的,通過出去的通道在回來時,防火墻是不會做限制的。
2、數據過程
首先,Host B以ssh客戶端的身份訪問外部的主機Host A (此時Host A充當ssh服務器)建立隧
道,然後,Host A充當telnet客戶端向Host B發送telnet流量。當收到Host A發來數據之後,Host B解
封裝,然後充當telnet客戶端的身份,建立與Host C的連接,從而將數據安全的傳輸至目標主機。
3、實現命令
在Host B上執行:ssh –R 9527:ip_HostC:23 –Nf ip_HostA 建立隧道,端口9527是在Host A上打開的
在Host A上執行:telnet 127.0.0.1 9527
總結
本篇詳細了介紹了基於SSH“巧妙”的突破防火墻的方法,包括ssh端口轉發,本地轉發以及遠程轉
發,都有各自的使用場景。但本文也存在很多不足,有許多地方講述的不夠詳細,在ssh端口轉發與本地
轉發的實驗中,原理說的多些,實驗步驟較少,還望見諒。歡迎閱讀~~
本文出自 “vinsent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1964953
如何巧用SSH突破防火墻