SSH端口轉發詳解及實例-轉載
出處:http://www.cnblogs.com/keerya/
目錄
- 1.1 SSH端口轉發的兩大功能
- 實驗一:實現SSH端口轉發——本地轉發
- 實驗二、實現SSH端口轉發——遠程轉發
- 實驗三、實現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
我們的實驗圓滿完成ヾ(??▽?)ノ
四、動態轉發
眾所周知,我國有一個功能強大的防火墻,用來避免我們訪問谷歌等外國的部分網站,嗯。。。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端口轉發詳解及實例-轉載