Linux基礎教程之SSH端口轉發
1
2 3 4 5 6 7 8 |
? ? SSH 會自動加密和解密所有SSH 客戶端與服務端之間的網絡數據。但是,SSH 還能夠將其他TCP 端口的網絡數據通過SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為SSH 為其他TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許SSH 的連接,也能夠通過將TCP 端口轉發來使用SSH 進行通訊。
? ?SSH 端口轉發能夠提供兩大功能: ? (1)加密SSH Client 端至SSH Server 端之間的通訊數據 ? (2)突破防火墻的限制完成一些之前無法建立的TCP 連接 ? ? 例如這樣一種應用場景:B、C位于企業內部的同一個局域網,A位于互聯網上的某個網絡,企業內部設置了防火墻,A想通過互聯網訪問C機器上的telnet服務,由于telenet服務不安全,所以企業的防火墻策略中一般會禁止外部用戶訪問內部機器上的telnet,并且企業一般不允許開VPN,開VPN相當于直接連到企業內部。由于ssh服務是比較安全的,所以企業的防火墻策略中一般會允許外部用戶訪問內部某個運行著ssh服務的主機,所以A要訪問C上的telenet服務可以通過ssh端口轉發的方式,假設B就是一個ssh服務器,即A可以通過訪問B上的ssh服務進而去訪問C上的telenet服務,此時B是堡壘機,相當于一個跳板,A借助這個跳板訪問企業內部C的telnet服務,此時A和B之間是ssh連接,B和C之間。下面模擬一下這種場景: ? ?A:centos7(192.168.25.107) ? ?B:rhel5(192.168.25.100) ? ?C:centos6(192.168.25.106) |
1
|
查看C上是否安裝了telnet服務
|
1
|
查看telnet服務是否已打開(由圖中可看出telnet服務已設為開機啟動)
|
1
|
telnet服務的23端口已打開
|
1
|
先禁用一下C的防火墻
|
1
|
拒絕來自于A發起的請求,模擬防火墻對telnet連接的限制
|
1
|
A上確認一下沒有其他服務正在使用9527端口
|
1
|
? ?因為之前做了基于key驗證的實驗,所以沒有輸密碼直接就連上了,并且跳轉到了遠程shell即B上,即此時A與B已經建立起ssh連接,相當于為不安全的telnet連接搭建了一個安全的隧道。此時想在A上繼續執行命令,不能exit退出遠程shell,因為此時隧道已經建起來了,若exit,隧道就斷開了,所以要么再單獨開一個終端,要么加-Nf選項。
|
1
2 3 4 5 |
-N不打開遠程shell,不跳到遠程主機
-f直接在本機執行命令,不用再打開新終端,即后臺執行 ?192.168.25.106 目標主機C的IP ?23目標主機C上的服務端口,即telnet服務 ?192.168.25.100跳板機B的IP(應確保跳板機上有ssh服務) |
、
1
|
? ? 如圖第三個連接,是B的22端口(即B的ssh服務)連接到A的32926端口,即A和B的ssh連接已建立,即隧道已經搭好了,就等著發起telenet流量了,此時還沒有telenet連接。
|
1
|
本地的9527端口已處于監聽狀態
|
1
|
C上還沒有到23端口的連接,即還沒有到telenet服務的連接
|
1
2 3 4 |
? ?執行完ssh -L命令后,就在本機(即A)打開了一個隨機端口32926,用作ssh客戶端,并且建立起與ssh服務器(即B)的連接,并且打開本機(即A)的9527端口,讓其充當telenet服務器,去監聽本機的telnet請求
? ?執行完telenet 127.0.0.1 9527命令后,就在本機(即A)打開了隨機端口38528,充當telenet客戶端,由它發起telnet請求,本機的9527端口(即telnet服務端)監聽到請求后,就與本機的38528端口(即telenet客戶端)建立起telnet連接 ? ?本機的9527端口(即telnet服務端)接收到telnet數據包后,就將其轉交給本機32926端口(ssh客戶端),由它對telnet數據包進行加密封裝,封裝成ssh包,并由由它轉發給ssh服務器(即B)的22端口 ? ?圖中第一個連接是38528端口(即telenet客戶端)向9527端口(即telnet服務端)發起的連接,第三個連接是9527端口(即telnet服務端)向38528端口(即telenet客戶端)發起的連接,因為兩個端口位于同一臺主機,所以都在這里顯示了出來。 |
1
2 3 |
? ? ssh服務器(即B)收到ssh客戶端(即A)發來的ssh包后,將其解密解封裝,得到telnet數據包,然后在本機打開53580隨機端口用作telnet客戶端,并將telnet數據包轉發給telnet服務器(即C)的23端口
? ? 圖中第三條連接是ssh客戶端(即A,端口為32926)到B(即ssh服務器)的連接; ? ? 第一條是B(即telnet客戶端,端口為53580)到telnet服務器(即C,端口為23端口)的連接。 |
1
|
? ? 此時C上已建立起telnet連接,是由telnet客戶端(即B,端口為53580)發起的
|
1
|
? ?如圖可看出,A已經成功連上了C
|
1
|
? ?exit退出與遠程shell的連接
|
1
2 3 |
? ?退出后,A上telnet服務器(即本機的9527端口)與telenet客戶端(本機的38528端口)之間的telnet連接斷開,
? ?B(即telnet客戶端,端口為53580)到C(即telnet服務器,端口為23端口)的telnet連接斷開 ? ?此時只剩下ssh客戶端(即A)與ssh服務器(即B)的ssh連接,即隧道仍存在,本機的9527端口仍處于監聽狀態 |
1
|
? ?用ps aux可看到后臺執行的ssh服務
|
1
|
? ?關閉ssh進程
|
1
|
? ?關了之后本機的9527端口也關了
|
1
|
? 此時A再次發起telenet連接已經連不上了
|