1. 程式人生 > >如何巧用SSH突破防火墻

如何巧用SSH突破防火墻

策略 安裝 站點 sim 地址 use 情況 nload str

前言


眾所周知,一個公司內部與外部網絡之間是由防火墻存在的,防火墻的的存在保證了,企業內部的

安全性。像一些明文傳輸的協議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突破防火墻