SSH端口轉發詳解及實例


一、SSH端口轉發簡介

  SSH會自動加密和解密所有SSH客戶端與服務端之間的網絡數據。但是,SSH還能夠將其他TCP端口的網絡數據通SSH鏈接來轉發,並且自動提供了相應的加密及解密服務。這一過程也被叫做"隧道"(tunneling),這是因為SSH為其他TCP鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet ,SMTP ,LDAP這些TCP應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境許中的防火牆限制了一些網絡端口的使用,但是允許SSH的連接,也能夠將通過將TCP用端口轉發來使用SSH進行通訊。

1.1 SSH端口轉發的兩大功能

  • 加密SSH Client端至SSH Server端之間的通訊數據。
  • 突破防火牆的簡直完成一些之前無法建立的TCP連接。

 

二、本地轉發

命令:-L localport:remotehost:remotehostport sshserver

說明:localport       本機開啟的端口號

      remotehost      最終連接機器的IP地址

      remotehostport        轉發機器的端口號

      sshserver       轉發機器的IP地址

選項:-f 后台啟用

      -N 不打開遠程shell,處於等待狀態(不加-N則直接登錄進去)

      -g 啟用網關功能

    接下來,我們通過實驗來詳細的說明一下如何實現本地轉發:

實驗一:實現SSH端口轉發——本地轉發

  • 背景:企業內部C服務器只允許telnet連接(23端口)訪問,不允許外部直接訪問,B服務器是一個ssh服務器;有一個用戶需要從外部連接到企業內部的C服務器。
  • 前提:防火牆允許22端口進來(或者企業內部有一個堡壘機,ssh -t通過堡壘機進去)。
  • 原理:A用戶通過ssh協議連接到B機器上,再通過B機器做跳板,連接至C機器。
  • 機器:rhel5模擬A用戶,centos6模擬B機器,centos7模擬C機器
  • 圖示如下:

  • 實驗步驟:

1)模擬C機器不允許A用戶連接,並且開啟B機器的telnet服務端口23。

在centos7上輸入以下口令:

iptables -A INPUT -s 192.168.191.55 -j REJECT

此時,從rhel5用ssh命令連接centos7,是拒絕的:

同時,我們還要開啟7的telnet服務端口23:

systemctl start telnet.soc ket

ss -ntl命令可以查看的服務端口是否已開啟

2)開啟端口轉發(telnet隧道)

    首先,我們在5機器上確認已經開啟的端口有哪些:

 

我們使用的端口是9527端口,從上圖中我么已經看出,9527端口沒有被占用,所以我們可以使用~

接着我們建立本地轉發的隧道(5上輸入以下命令):

ssh -L 9527:192.168.191.77:23 -fN 192.168.191.66

    在這里,我們可以使用ps aux來查詢后台運行的進程。也可以通過ss -nt查看接口連接情況:

3)在rhel5上輸入以下命令,用9527端口連接自己:

    telnet 127.0.0.1 9527

    此時,我們可以查看一下centos6和centos7的連接情況:

    至此,我們已經實現了A用戶在公司外部遠程連接C機器的需求,接下來我們就來講一講實現過程:

    data <- -> localhost:9527端口 <- -> localhost:XXXXX(隨機在客戶端6開一個端口) <- -> sshsrv:22(通過ssh封裝) <- -> sshsrv:YYYYY(服務器解封裝,開一個端口,代表telnet客戶端) <- -> telnetsrv:23

  用大白話來解釋就是:當rhel5(A用戶)連接自己的9527端口時,該請求自然會通過ssh協議封裝發送給centos6(B機器),然后在centos6(C機器)上解封裝,形成telnet流量,發送給centos7(C機器)。

  實驗做完了,如果我們想要停止這個隧道,直接把后台的隧道進程殺死就可以了,命令如下:

  killall ssh

  我們的實驗圓滿完成ヾ()ノ

 

三、遠程轉發

  在我們實驗一的場景下,首先要滿足的是防火牆上必須打開22端口,但是在現實生活中,企業處於安全考慮,一般是不會打開防火牆,只允許出不允許進。所以,當防火牆的端口沒有打開的時候,我們要怎么辦呢?這就要用到我們接下來要說的遠程轉發了:

命令:-R sshserverport:remotehost:remotehostport sshserver

說明:sshserverport         被轉發機器開啟的端口號

      remotehost          最終連接機器的IP地址

      remotehostport        被轉發機器的端口號

      sshserver             被轉發機器的IP地址

  同樣的,我們以實驗來具體說明我們的遠程轉發:

實驗二、實現SSH端口轉發——遠程轉發

  • 背景:企業內部C服務器只允許telnet連接(23端口)訪問,不允許外部直接訪問,B服務器是一個ssh服務器;有一個用戶需要從外部連接到企業內部的C服務器。
  • 原理:B機器訪問A用戶,給A用戶轉發
  • 機器:rhel5模擬A用戶,centos6模擬B機器,centos7模擬C機器
  • 圖示如下:

  • 實驗步驟:

1)模擬C機器不允許A用戶連接,並且開啟B機器的telnet服務端口23。

  在centos7上輸入以下口令:

  iptables -A INPUT -s 192.168.191.55 -j REJECT

  此時,從rhel5用ssh命令連接centos7,是拒絕的:

  同時,我們還要開啟7的telnet服務端口23:

  systemctl start telnet.soc ket

  用ss -ntl命令可以查看的服務端口是否已開啟

2)開啟隧道轉發(telnet隧道)

    這一次,由於防火牆完全關閉,外部的設備連接不進來,所以我們要通過B機器去連接A用戶的機器,因此,我們的開啟隧道命令要在B機器(centos6)上運行:

    首先,我們要確定一下centos6上開啟了哪些端口:

    然后,我們選擇一個沒有被開啟的端口開啟隧道,進行實驗:

  同樣的,在這里,我們可以使用ps aux來查詢后台運行的進程。也可以通過ss -nt查看接口連接情況:

3)在rhel5上輸入以下命令,用9527端口連接自己:

    telnet 127.0.0.1 9527

    此時,我們可以查看一下centos6和centos7的連接情況:

    至此,我們已經實現了A用戶在公司外部遠程連接C機器的需求,接下來我們就來講一講實現過程:

  data <- -> sshsrv:9527端口 <- -> sshsrv:22(通過ssh封裝) <- -> localhost:XXXXX(隨機在客戶端6開一個端口) <- -> localhost:YYYYY(服務器解封裝,開一個端口,代表telnet客戶端) <- -> telnetsrv:23

  用大白話來解釋就是:當rhel5(A用戶)連接自己的9527端口時,該請求自然會通過ssh協議封裝發送給centos6(B機器),然后在centos6(C機器)上解封裝,形成telnet流量,發送給centos7(C機器)。

  實驗做完了,如果我們想要停止這個隧道,直接把后台的隧道進程殺死就可以了,命令如下:

  killall ssh

  我們的實驗圓滿完成ヾ()ノ

 

四、動態轉發

  眾所周知,我國有一個功能強大的防火牆,用來避免我們訪問谷歌等外國的部分網站,嗯。。。翻牆的方法有很多,相信大家不比小編懂的少,所以我們就不一一舉例說明了。接下來,小編就給大家說一說如何通過ssh轉發技術實現翻牆~

  這里,就要用到我們的動態轉發技術了:

  當用firefox 訪問internet 時,本機的1080 端口做為代理服務器,firefox 的訪問請求被轉發到sshserver 上,由sshserver替之訪問internet。

  接下來,我們還是以實驗進行說明:

實驗三、實現SSH端口轉發——動態轉發

  • 背景:模擬Google的服務器C不允許國內網站A直接訪問,B服務器是國外的一個小型的學習用的服務器;國內網站A可以訪問國外學習服務器B;實現國內網站A訪問模擬Google服務器C。
  • 原理:國內網站A通過ssh協議連接到國外學習服務器B上,再通過國外學習服務器B做跳板,連接至Google服務器C。
  • 機器:centos6模擬國內網站A,rhel5模擬國外學習服務器B,centos7模擬Google服務器C
  • 圖示如下:

  • 實驗步驟:

1)在模擬google服務器C上搭建一個網頁,從互聯網上訪問centos7時,頁面顯示"Welcome to www.google.com"

  命令如下:

[root@centos7 ~]# cd /var/www/html/
[root@centos7 html]# vim index.html
<h1> Welcome to www.google.com </h1> 

    編寫完文件以后,記得重啟一下httpd服務:

[root@centos7 html]# systemctl restart httpd 

2)模擬Google服務器C不允許國內網站A連接

  在centos7上輸入以下口令:

  [root@centos7 ~]# iptables -A INPUT -s 192.168.191.66 -j REJECT

  此時,我們來測試一下centos6和rhel5能否訪問centos7,命令為:

  curl 192.168.191.77 links 192.168.191.77

[root@rhel5 ~]# curl 192.168.191.77
<h1> Welcome to www.google.com </h1>

 
[root@centos6 ~]# curl 192.168.191.77
curl: (7) couldn't connect to host 

  可以看出,rhel5可以連接到centos7,但是centos6不能連接到centos7。我們現在的需求就是希望centos6可以借助於rhel5訪問centos7,方法也很簡單,接下來就給大家說一說。

3)動態端口轉發

    首先,我們在6機器上確認已經開啟的端口有哪些:

  我們使用1080端口,從上圖中我么已經看出,1080端口沒有被占用,所以我們可以使用~

  接着我們建立動態轉發的隧道(6上輸入以下命令):

  ssh -D 1080 -fN 192.168.191.55

    在這里,我們可以在rhel5上查看到centos6的連接:

4)設置代理rhel5訪問centos7,命令如下(在centos6上輸入):

  curl --socks5 127.0.0.1:1080 http://192.168.191.77

5)在圖形化界面,在centos6上的firefox瀏覽器設置代理:

  我們的實驗圓滿完成ヾ()ノ

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM