1. 程式人生 > >SSH端口轉發詳解及實例

SSH端口轉發詳解及實例

table 選項 重啟 str net tle 工作環境 srv 現在

正文

一、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

技術分享圖片

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

四、動態轉發

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

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

  當用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瀏覽器設置代理:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

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

SSH端口轉發詳解及實例