SSH 有不少功能,SSH 管道就是其中一個。SSH管道是兩臺機器間的安全鏈接,常常被稱爲「SSH隧道」,或者「端口轉發」。瀏覽器
使用SSH,咱們能夠綁定本地計算機的指定端口到遠程計算機上的指定端口。這將在這些機器之間建立加密的SSH 管道,並容許經過本地主機套接字地址直接與遠程主機通訊。咱們可使用SSH管道來保護不安全的鏈接或繞過防火牆的不一樣限制。安全
在咱們建立咱們的第一個SSH管道以前,你能夠在你機器上的命令行下輸入 「ssh」 命令來測試是否已經安裝了SSH。若是你運行的是CentOS 6 迷你版本的系統,那麼你可能須要安裝 openssh-clients 軟件包(Ubuntu 用戶須要安裝 openssh-client 軟件包)。服務器
這裏有三種類型的端口轉發,以及使用SSH管道的三種方式:網絡
本地端口轉發(容許經過中間SSH服務器,從本地套接字地址訪問目的套接字地址)app
遠程端口轉發(容許經過中間SSH服務器套接字地址,從遠程位置訪問localsocket地址)ssh
動態端口轉發(SOCKS代理服務器 - 在本文中不涉及詳細信息!)socket
我天天都使用「SSH管道」(本地端口轉發),由於個人一個客戶的環境被設計爲只能在SSH服務的22端口上訪問工做站的Linux服務器。全部其餘基礎設施設備都經過這個工做站才能訪問,因此使用SSH管道是直接訪問不一樣服務的最佳路徑。測試
本地端口轉發,您能夠從本地機器鏈接到遠程計算機,即便你不能經過本地機器直接鏈接到遠程機器。爲了達到這個目的,你須要一個能夠經過SSH訪問的中間服務器,而且這個服務器能夠訪問這些遠程的機器。這個中間服務器能夠駐留在您的本地網絡內,並受到不一樣的防火牆策略影響或者是在你的本地網絡以外。加密
咱們能夠經過SSH的22端口訪問一個工做站機器(用戶名:wsuser,主機名:workstation),工做站機器的後面是一個應用服務器(主機名:appserver),在8080端口上運行着Apache Tomcat。咱們不能經過本地機器在8080端口上訪問這個Apache Tomcat的管理員頁面,可是這個工做站機器能夠訪問Apache Tomcat 網頁的8080端口。所以,咱們能夠建立一個SSH 管道,經過這個工做站,把咱們本地機器的本地8080端口轉發到這個應用服務器。
咱們能夠在咱們的本地機器上運行下面的命令來實現這個需求:
ssh -f wsuser@workstation -L 8080:appserver:8080 -N
等到這個工做站機器的SSH 服務器認證成功後,鏈接就會被創建,當咱們在本地機器上打開瀏覽器,輸入 http://localhost:8080 就能夠訪問到那個應用服務器的Apache Tomcat 網頁。
假設咱們的狀況跟例子1同樣,除了一個不一樣,那就是在工做站機器( 用戶名: wsuser, 主機名: workstation)和應用服務器(用戶名: appuser, 主機名: appserver)之間有一個防火牆,只容許經過SSH在22端口上從工做站機器訪問應用服務器,意味着工做站機器不能直接訪問Apache Tomcat 的8080端口。
還有一種從本地機器訪問Apache Tomcat 管理員網頁的方法,可是咱們須要經過SSH進行兩跳。
SSH 鏈接到工做站機器
ssh wsuser@workstation
當鏈接到工做站機器,經過SSH,把8080端口轉發到應用服務器
ssh -f appuser@appserver -L 8080:localhost:8080 -N
下一步須要經過SSH,把本地機器的8080端口轉發到工做站機器
ssh -f wsuser@workstation -L 8080:localhost:8080 -N
瞧,當咱們在本地機器上打開瀏覽器,輸入 http://localhost:8080 就能夠訪問到那個應用服務器的Apache Tomcat 網頁了。
遠程端口轉發的實現與本地端口轉發的實現同樣。經過本地端口轉發,咱們可使用一個有SSH服務的中間機器,從本地訪問遠程的機器。而經過遠程端口轉發,咱們可使用一個有SSH服務的中間機器,從遠程訪問本地機器。固然,爲了實現這個,咱們須要經過SSH鏈接到一箇中間機器。當咱們沒有路由器的管理權限,不能在路由器級別上配置端口轉發時,遠程端口轉發就顯得很是有用,SSH管道就能夠完成這種伎倆。
在咱們開始遠程端口轉發以前,咱們必須從新配置一箇中間的機器上的SSH服務器來啓用它。咱們必須編輯「/ etc/ SSH/ sshd_config文件」,把如下選項取消註釋並更改成「yes」:
GatewayPorts yes
固然,咱們須要重啓SSH服務。
咱們在本地的8080端口上運行了Apache Tomcat 服務。咱們但願某個朋友,不是在本地網絡上的,能夠在8080端口上訪問咱們的Apache Tomcat管理員頁面,幫助咱們配置或者部署新的應用程序。幸運的是,咱們有一個WebServer(用戶名:myuser, 主機名:webserver),管理着一些網頁,能夠經過因特網訪問的。同時也能夠經過SSH,從咱們本地機器訪問這個WebServer。咱們將配置一個遠程端口轉發,讓咱們的朋友能夠經過這個WebServer來訪問運行在咱們本地機器上的Apahce Tomcat服務。
咱們能夠經過下面的代碼來實現:
ssh -f myuser@webserver -R 8080:localhost:8080 -N
瞧,咱們的朋友就能夠經過WebServer 的8080端口來訪問咱們本地機器上運行的Apache Tomcat 服務了。
正如咱們剛到的,這個命令與配置本地端口轉發的命令惟一的不一樣就是把 「-L」 變成了「-R」。
動態端口轉發會把你的機器變成一個SOCKS代理。SOCKS代理能夠代理全部經過網絡或者因特網的請求。但程序一般必須被配置爲使用SOCKS代理。 SOCKS代理能夠用下面的命令開啓:
ssh -C -D 1080 localmachine
其中,-c選項啓用壓縮,-D選項指定動態端口轉發和1080是標準的SOCKS代理服務器的端口。下一步將是從新配置你的Web瀏覽器在端口1080使用127.0.0.1做爲SOCKS代理。
使用動態端口轉發和配置瀏覽器以使用本地SOCKS代理服務器將加密全部訪問您的Web瀏覽器的流量,使您的鏈接安全。
若是你是在一個非默認端口上運行SSH服務器,運行SSH服務時,須要經過 「-p」 來指定端口。
ssh -f wsuser@workstation -p 22222 -L 8080:appserver:8080 -N
在進行本地端口轉發或者遠程端口轉發以前,仔細檢查那些已經在中間服務器上使用的端口,您可使用netstat命令和grep命令來檢查要轉發的端口。
netstat -anp |grep 8080
不要忘了在進行遠程端口轉發以前,從新配置SSH 服務,已經重啓SSH服務器。
GatewayPorts yes
「-f」選項要求SSH運行在後臺,「-N」選項告訴SSH不要執行遠程命令。若是你不想SSH進入後臺,能夠移除這兩個選項。
請確保你的iptables的配置與你配置的端口轉發規則兼容!