1. 程式人生 > >利用SSH埠轉發實現跨機器直接訪問

利用SSH埠轉發實現跨機器直接訪問

在實際專案測試中經常會遇到資料庫操作,但是因為公司安全問題,訪問資料庫往往需要通過跳板機。但通過跳板機,測試效率大打折扣,因此通過使用SSH埠轉發,從而達到跨機器直接訪問資料庫。實際專案中的應用會比下面內容相對複雜一些,但萬變不離其宗,基本原理是一樣的。

SSH簡介

SSH是什麼?

SSH是一種協議,是一種有關如何在網路上構建安全通訊的規範。SSH的協議涉及認證、加密、網路上傳輸資料的完整性。具體而言,SSH具有客戶端/伺服器(C/S)結構,SSH在計算機之間建立網路連線,並充分保障連線的雙方是真實可信的(認證),該連線傳輸的所有資料不會被竊聽(加密),不會被修改(完整)。

基於SSH的產品(即實現了SSH協議的產品)可能包含客戶端或伺服器,也可能都包含。Unix通常都包含有客戶端和服務端;其他平臺一般僅包含客戶端。

術語:SSH協議和產品

經常會見到SSH、SSH-1、SSH-2、ssh等等各種特別相似的詞彙,很容易讓大家有誤解,這裡就將這些進行簡單說明,方便後續大家理解。

SSH:通用的術語,泛指SSH協議或SSH軟體產品

SSH-1:SSH協議版本1

SSH-2:SSH協議版本2

SSH1:實現SSH-1 的一個產品(軟體),也是最早的SSH軟體

SSH2:實現了SSH-2的一個商業產品

OpenSSH:是OpenBSD專案的產品,它同時實現了SSH-1協議和SSH-2協議

ssh:執行安全終端會話和遠端命令的客戶端程式,是產品的一個子集,即客戶端部分

SSH的功能

1、 安全遠端登入
說到遠端登入不得不提起來Telnet協議,下面就對telnet和ssh進行簡單對比,從而幫助大家理解ssh的安全遠端登入功能。

  • Telnet:Telnet為使用者提供了在本地計算機上完成遠端主機工作的能力。但Telnet不是一種安全通訊協議,因為它並不使用任何安全機制,通過網路/網際網路傳輸明文格式的資料,包括密碼,所以誰都能嗅探資料包,獲得這個重要資訊。
  • SSH:SSH是一種非常安全的協議,因為它共享併發送經過加密的資訊,從而為通過網際網路等不安全的網路訪問的資料提供了機密性和安全性,SSH = Telnet + 安全機制。

2、安全檔案傳輸
傳統的檔案傳輸程式(ftp、rcp等)都不能提供安全解決方案,使用SSH,只需要使用一個安全拷貝命令(scp)就可以在計算機之間安全傳輸檔案。

3、 安全執行遠端命令。例如 ssh [email protected]

"pwd; cat hello.txt"

4、訪問控制
假設使用者允許另外一個人使用自己的計算機賬號,但他只能用於特定目的。例如,在你出差時,允許祕書使用你的賬號替你閱讀email,但不能執行其他操作。使用SSH,你不用把密碼告訴祕書,也不用修改密碼就可以授權祕書訪問自己的賬號,並限定他只能執行郵件程式。

5、埠轉發
SSH能為另外一個應用程式的資料流提供透明的加密措施,從而保護其他TCP/IP應用程式,後面會詳細解釋關於SSH的埠轉發功能。

常見的SSH產品

詳解SSH埠轉發

SSH使用的傳輸機制是TCP/IP,通常使用的是伺服器的TCP埠22,並對經過連線傳輸的資料進行加密/解密操作。SSH埠轉發就是SSH對其他應用程式在別的TCP埠上建立的TCP/IP傳輸進行加密和解密。Telnet、SMTP、IMAP和其他一些基於TCP/IP的不安全協議都可以將其連線通過SSH轉發變得安全。SSH埠轉發也叫做隧道傳輸,因為SSH連線提供了一條安全的“隧道”,其他TCP/IP連線可由此經過。

如上圖所示,使用了埠轉發之後,TCP 埠 A 與 B 之間現在並不直接通訊,而是轉發到了 SSH 客戶端及SSH服務端來通訊,從而自動實現了資料加密並同時繞過了防火牆的限制。

有一點需要注意的是,SSH埠轉發 是TCP使用的一種通用代理機制,而且只能用於TCP/IP協議。如果協議不是基於TCP的,比如基於UDP的DNS、DHCP的,就不能使用埠轉發機制。

本地轉發分析

假設你在家裡有一臺電腦名主機H,上面執行著某個支援IMAP的email閱讀器,你想連線到伺服器主機S上的IMAP伺服器,從而讀取併發送郵件。通常,這個連線是不安全的,你的郵箱賬號、密碼在IMAP伺服器和客戶端之間明文傳輸,我們可以使用SSH埠轉發,透明地將IMAP連線重新路由,使其通過SSH安全地對連線上的資料進行加密。

語法是這樣的:ssh -L <本地監聽埠號>:<目的主機>:<目的服務的埠號> <隧道終點主機>

具體到該例子:ssh –L 埠Y : S : 埠143 S

-L 表示是本地轉發,此時該TCP服務的客戶端與SSH客戶端同在H上。後面接著三個值,由冒號分開,分別表示:需要監聽的本地埠Y,目的主機(S),目的服務的埠號143(IMAP服務端通用的埠號是143)。

這個命令可分開下面兩個步驟理解:

  1. Hi,本地的ssh客戶端,請你在本地建立一個監聽埠,凡是到這個埠的資料,都請你通過ssh 通道傳給ssh服務端
  2. Hi,隧道終點主機,請你收到我的資料之後,把資料轉到我制定的目的主機和目的服務埠上

通過埠轉發,整個資料鏈路由原來(H,X)--> (S,143)轉為下面幾步

  1. (H,X)--> (H,Y),家中H上的IMAP客戶端向本地的Y埠傳送資料,其中Y就是本地埠轉發時SSH客戶端新建立的本地監聽埠
  2. (H,Z)--> (S,22),家中H上的SSH客戶端讀Y埠資料,加密資料,利用SSH通道,將加密後資料傳送到S
  3. (S,W)-->(S,143),SSH服務端將收到的加密資料解密,然後將其傳給S的143埠上監聽IMAP的伺服器

除了本地轉發還有遠端轉發,本次解決專案中實際問題時未涉及使用遠端轉發技術,因此不做詳細介紹,感興趣的可私下了解。

利用本地轉發技術實現跨機器直接訪問

現在很多公司為了加強網路安全,都會使用跳板機,所謂跳板機就是一臺伺服器,維護人員在維護過程中,首先要統一登入到這臺伺服器(跳板機)上,然後從這臺伺服器(跳板機)再登入到目標裝置進行維護。於是我們面臨一個情況,本機ssh->跳板機->目標機器,而跳板機一般作為通道,提供的許可權很低,很多命令無法執行,這個限制會讓我們工作效率大大降低。我們利用前面的SSH本地埠轉發技術來徹底解決該問題吧!

我們將上面的描述圖形化,見下圖。

圖中的“我”,現在是要訪問內部網站的192.168.1.0/24網段裡面的伺服器,然而由於不在一個網段,我是不可以直接ssh到內部網路的伺服器。通常的做法是先ssh到“SSH Server”,然後再在ssh server上訪問內部網站的伺服器。我能不能不用上ssh server就直接ssh到內部伺服器呢?

結合前面的SSH本地埠轉發,我可以這樣做:

  1. 挖隧道

ssh –L 11125 : 192.168.1.2 : 22 [[email protected]](mailto:[email protected])

在本地電腦建立監聽埠:11125,192.168.1.2:22就是我們無法直接訪問到目的主機及埠號,10.1.1.1就是我們這次挖隧道的終點主機,即可訪問的SSH服務端

2、使用隧道

如果我們希望繼續使用的TCP服務還是ssh客戶端,因此我們就需要再開啟一個ssh客戶端。

ssh –p 11125 localhost

這行命令看起來是說,用ssh連線到本地電腦的埠11125上。結合剛才步驟1建立的隧道,這條命令就會被轉發到跳板機10.1.1.1,然後跳板機會把這個ssh命令轉發到目的主機192.168.1.2。

當然我們還可以使用其他服務,例如連線資料庫,我們只需要連線當前主機11125埠即實現了連線在伺服器192.168.1.2的資料庫了。

到此,我們已經完美的實現了跨機器直接訪問的目的。