【SSH隧道】使用

SSH隧道

SSH隧道(即SSH代理、端口轉發),接觸過Linux系統的都知道SSH,對於SSH隧道,如果之前沒接觸過,只知道這個概念、網上搜索這方面的資料的話,網上的資料把簡單的問題複雜化了,寫的很複雜很繁瑣。 主要還是理解映射二字。把本地端口映射到遠程機器端口,然後訪問遠程的端口就相當於訪問的本地端口,這就是遠程SSH隧道。把遠程機器的端口通過中間服務器映射到本地端口。然後訪問本地端口,就相當於訪問到了遠程的服務器端口,這就是本地SSH隧道。

建立SSH隧道命令

ssh -C -f -N -L listen_port:DST_Host:DST_port user@Tunnel_Host 
ssh -C -f -N -R listen_port:DST_Host:DST_port user@Tunnel_Host 
ssh -C -f -N -D listen_port user@Tunnel_Host

-L port:host:hostport #建立本地SSH隧道(本地客戶端建立監聽端口)
將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口. 

-R port:host:hostport #建立遠程SSH隧道(隧道服務端建立監聽端口)
將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口. 
# 有本地映射肯定有遠程映射,就是把-L換成-R,這樣我們訪問遠程主機的端口就相當於訪問本地的端口,但感覺作用不大。

-D port 
指定一個本地機器 “動態的’’ 應用程序端口轉發. 

-C 壓縮數據傳輸。

-N Do not execute a shell or command. 
不執行腳本或命令,僅僅做端口轉發。通常與-f連用。
-f Fork into background after authentication. 
後臺認證用戶/密碼,不用登錄到遠程主機。


-L X:Y:Z的含義是,將IP爲Y的機器的Z端口通過中間服務器映射到本地機器的X端口。把其他遠程機器的端口通過中間服務器映射到本地端口上來。然後本地就能通過中間服務器訪問了遠程服務器了。

-R X:Y:Z 的含義就是把我們本地的Y機器的Z端口映射到遠程機器的X端口上。把本地端口映射到遠程機器的端口上去。然後遠程機器訪問X端口,就相當於訪問的是本地機器了。前提是,本地到遠程機器的網絡是通的,才能把本地的端口映射到遠程機器上去。

建立本地SSH隧道

需求:A訪問服務器C,但是A--B之間的防火牆規則限制了A對C的訪問

在我們計劃建立一個本地SSH隧道之前,我們必須清楚下面這些數據:
  1. 中間服務器d的IP地址
  2. 要訪問服務器c的IP地址
  3. 要訪問服務器c的端口




線路A-B-C上A-B之間的防火牆屏蔽了對C服務器的訪問。與此同時,我們也很快注意到,線路A-B-D之間、D-C之間是不受阻礙的。相信你已經想到了,在A-B之間的防火牆規則不會屏蔽對機器D的訪問。因此 我們可以通過機器d建立一個通道A-B-D-C,從而訪問到機器C上的數據。
  1. 需要訪問234.234.234.234的FTP服務,也就是端口21
  2. 中間服務器是123.123.123.123
使用下面這條命令來達成我們的目的
 
ssh -N -f -L 2121:234.234.234.234:21123.123.123.123
ftp localhost:2121 # 現在訪問本地2121端口,就能連接234.234.234.234的21端口了
 
這裏我們用到了SSH客戶端的三個參數,下面我們一一做出解釋:
  • -N 告訴SSH客戶端,這個連接不需要執行任何命令。僅僅做端口轉發
  • -f 告訴SSH客戶端在後臺運行
  • -L 做本地映射端口,被冒號分割的三個部分含義分別是最後一個參數是我們用來建立隧道的中間機器的IP地址(IP: 123.123.123.123)
  • 需要使用的本地端口號
  • 需要訪問的目標機器IP地址(IP: 234.234.234.234)
  • 需要訪問的目標機器端口(端口: 21)
我們再重複一下-L參數的行爲。-L X:Y:Z的含義是,將IP爲Y的機器的Z端口通過中間服務器映射到本地機器的X端口。然後就能直接通過訪問本地IP+端口,訪問到映射的IP+端口了。所以理解就是,把本地的端口轉發到其他機器的端口上。在本地執行上面的命令。

建立遠程SSH隧道

大多數公司的網絡是通過路由器 接入互聯網的,公司內部的機器不會直接與互聯網連接,也就是不能通過互聯網直接訪問。通過線路D-B-A訪問公司裏的機器A便是不可能的。也許你已經注意 到了,雖然D-B-A這個方向的連接不通,但是A-B-D這個方向的連接是沒有問題的。那麼,我們能否利用一條已經連接好的A-B-D方向的連接來完成 D-B-A方向的訪問呢?答案是肯定的,這就是遠程SSH隧道的用途。
與本地SSH一樣,我們在建立遠程SSH隧道之前要清楚下面幾個參數:
  • 需要訪問內部機器的遠程機器的IP地址(這裏是123.123.123.123)
  • 需要讓遠程機器能訪問的內部機器的IP地址(這裏因爲是想把本機映射出去,因此IP是127.0.0.1)
  • 需要讓遠程機器能訪問的內部機器的端口號(端口:22)
在清楚了上面的參數後,我們使用下面的命令來建立一個遠程SSH隧道,在192.168.0.100的主機上執行下面的命令:
ssh -Nf -R 2222:127.0.0.1:22123.123.123.123
 
現在,在IP是123.123.123.123的機器上我們用下面的命令就可以登陸公司的IP是192.168.0.100的機器了。
ssh -p 2222 localhost
 
-N,-f 這兩個參數我們已經在本地SSH隧道中介紹過了。我們現在重點說說參數-R。該參數的三個部分的含義分別是:
  • 遠程機器使用的端口(2222)
  • 需要映射的內部機器的IP地址(127.0.0.1)
  • 需要映射的內部機器的端口(22)
例如:-R X:Y:Z 就是把我們內部的Y機器的Z端口映射到遠程機器的X端口上。
========================================================
在大多數情況下,我們建立ssh隧道的時候,往往是想通過一臺公網的主機或者是大家都可以訪問的主機做跳轉機,來訪問內部或者外部不能直接訪問的機器。所以一般像這種情況下,請將跳轉機中的ssh服務器中的GatewayPorts設爲yes
  1.建立本地的ssh隧道時,可以指定本地主機的地址,如下:
ssh -Nf -L 192.168.0.100:2121:234.234.234.234:21123.123.123.123
   那麼本地局域網的任何機器訪問192.168.0.100:2121都會自動被映射到234.234.234.234:21
  
  2.建立遠程的ssh隧道時,可以指定公網的主機地址,不過一般情況是要訪問內網的主機,所以這條命令應該在任何一臺內網主機上執行,比如在192.168.0.102的主機上運行:
ssh -Nf -R 123.123.123.123:2222:192.168.0.100:22123.123.123.123
 只要在局域網裏192.168.0.102可以直接連接內網主機192.168.0.100,且192.168.0.102可以直接與公網主機123.123.123.123建立ssh連接。那麼任何外網主機通過訪問公網主機123.123.123.123:2222就會被連接到192.168.0.100:22,從而可以完成外網穿越NAT到內網的訪問,而不需要在內網網關和路由器上做任何操作。


以上內容參考網上某位博客,忘了地址。不好意思。

end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章