ssh隧道

一.概述

因爲工做緣由,老是要鏈接到各類不能直接訪問的環境,因此大部分環境必需要使用ssh隧道進行訪問。其實只是簡單的會用,說道具體的原理和方式不是很清楚,因此我經過這篇文章來深刻學習一下ssh隧道,也讓各位能夠了解下。
下面是一個最簡單也是最多見的一種狀況:javascript


 
ssh隧道

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

1.本地鏈接

 
正向本地轉發

例如:若是server段運行着mysql服務可是隻監聽着127.0.0.1,可在client搭建ssh隧道sql

ssh -N -f -L 3306:localhost:3306 $server_ip 

這時轉發數據流是:shell

  • client上的應用客戶端將數據發送到本地的3306端口上
  • client上的ssh客戶端將本地3306端口收到的數據發送到server端的ssh server上
  • SSH Server 會解密收到的數據並將之轉發到監聽的3306端口
  • 最後再將從mysql返回的數據原路返回以完成整個流程。

2.遠程鏈接

 
反向本地轉發

例如仍是上面的訪問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的相應端口便可。

六.xshell搭建ssh隧道

大部分狀況下咱們的client可能不是linux系統,而是windows系統,須要使用xshell等客戶端去鏈接。這裏介紹創建隧道的方式。
在咱們經過xshell鏈接到了ssh server後,在查看--隧道窗格--轉移規則--右鍵添加會出現下面的窗口:


 
xshell轉發

經過上面的討論,這裏就一目瞭然了。 類型就是local 本地鏈接,remote 遠程鏈接(通常不用,由於用xshell的都是client),dynamic 動態鏈接 源主機就是client本地,例如localhost 監聽端口就是client自定義的端口 目標主機和端口就是須要訪問的ip和端口

相關文章
相關標籤/搜索