因爲工做緣由,老是要鏈接到各類不能直接訪問的環境,因此大部分環境必需要使用ssh隧道進行訪問。其實只是簡單的會用,說道具體的原理和方式不是很清楚,因此我經過這篇文章來深刻學習一下ssh隧道,也讓各位能夠了解下。
下面是一個最簡單也是最多見的一種狀況:javascript
client爲了訪問到server的服務,可是因爲網段不一樣(內外網不一樣)或者防火牆的阻攔,這就用到了ssh隧道。java
本質上就是端口轉發。它可以將其餘 TCP 端口的網絡數據經過 SSH 連接來轉發,而且自動提供了相應的加密及解密服務。這一過程也被叫作「隧道」(tunneling),這是由於 SSH 爲其餘 TCP 連接提供了一個安全的通道來進行傳輸而得名。
SSH 端口轉發可以提供兩大功能:
1.加密 SSH Client 端至 SSH Server 端之間的通信數據。
2.突破防火牆的限制完成一些以前沒法創建的 TCP 鏈接。mysql
SSH 端口轉發天然須要 SSH 鏈接,而 SSH 鏈接是有方向的,從 SSH Client 到 SSH Server 。而咱們的應用也是有方向的,好比須要鏈接 LDAP Server 時,LDAP Server 天然就是 Server 端,咱們應用鏈接的方向也是從應用的 Client 端鏈接到應用的 Server 端。若是這兩個鏈接的方向一致,那咱們就說它是本地轉發。而若是兩個方向不一致,咱們就說它是遠程轉發。
另外一個方便記憶的方法是,Server 端的端口都是預約義的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是動態可供咱們選擇的端口(如上述例子中選用的 7001 端口)。若是 Server 端的兩個端口都在同一臺機器,Client 端的兩個端口都在另外一臺機器上,那麼這就是本地鏈接;若是這四個端口交叉分佈在兩個機器上,每臺機器各有一個 Server 端端口,一個 Client 端端口,那就是遠程鏈接。linux
例如:若是server段運行着mysql服務可是隻監聽着127.0.0.1,可在client搭建ssh隧道sql
ssh -N -f -L 3306:localhost:3306 $server_ip
這時轉發數據流是:shell
例如仍是上面的訪問mysql的,反向的話,在server段執行windows
ssh -N -f -R $(client port):localhost:$(server port) $(client ip)
上面說的都只涉及到2臺機器,仍是沒有說明開篇說的那個問題。下面說下進階版的端口轉發。本地轉發命令中的 <remote host> 和 <SSH hostname> 能夠是不一樣的機器的。瀏覽器
這種就是開篇說的那種常見的狀況,服務在第三臺機器上,在client端訪問$(client port),就至關於訪問到了remote server。安全
例如:ruby
ssh -N -f -L $(client port):$(remote server ip):$(remote server port) $(sshserver ip)
同理,也是在server端執行。在client端訪問$(client port),就至關於訪問到了remote server
ssh -N -f -R $(client port):$(remote server ip):$(remote server port) $(client ip)
當你看到這裏時,有沒有想過咱們以前討論的本地轉發,遠程轉發,前提都是要求有一個固定的應用服務端的端口號,例如前面例子中的mysql服務端的3306端口。那若是沒有這個端口號怎麼辦?什麼樣的應用會沒有這個端口號呢?好比說用瀏覽器進行 Web 瀏覽,好比說 MSN 等等。
當咱們在一個不安全的 WiFi 環境下上網,用 SSH 動態轉發來保護咱們的網頁瀏覽及 MSN 信息無疑是十分必要的。讓咱們先來看一下動態轉發的命令格式:
$ ssh -D <local port> <SSH Server>
例如:
$ ssh -D 7001 <SSH Server>
咱們依然選擇了 7001 做爲本地的端口號,其實在這裏 SSH 是建立了一個 SOCKS 代理服務。以後的使用就簡單了,咱們能夠直接使用 localhost:7001 來做爲正常的 SOCKS 代理來使用,直接在瀏覽器或 MSN 上設置便可。在 SSH Client 端沒法訪問的網站如今也均可以正常瀏覽。
你會發現以前創建的ssh隧道監聽的端口都是127.0.0.1,因此只能client一臺主機進行鏈接。若是想讓client同網段的其餘主機也能訪問到呢,那就須要加一個參數 -g。加了這個參數監聽的ip就是0.0.0.0,這樣同網段的其餘主機能夠訪問client的相應端口便可。
大部分狀況下咱們的client可能不是linux系統,而是windows系統,須要使用xshell等客戶端去鏈接。這裏介紹創建隧道的方式。
在咱們經過xshell鏈接到了ssh server後,在查看--隧道窗格--轉移規則--右鍵添加會出現下面的窗口:
經過上面的討論,這裏就一目瞭然了。 類型就是local 本地鏈接,remote 遠程鏈接(通常不用,由於用xshell的都是client),dynamic 動態鏈接 源主機就是client本地,例如localhost 監聽端口就是client自定義的端口 目標主機和端口就是須要訪問的ip和端口