主頁(yè) > 知識(shí)庫(kù) > SSH端口轉(zhuǎn)發(fā),本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),動(dòng)態(tài)端口轉(zhuǎn)發(fā)詳解

SSH端口轉(zhuǎn)發(fā),本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),動(dòng)態(tài)端口轉(zhuǎn)發(fā)詳解

熱門(mén)標(biāo)簽:網(wǎng)站建設(shè) 硅谷的囚徒呼叫中心 智能手機(jī) 使用U盤(pán)裝系統(tǒng) 阿里云 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 美圖手機(jī) 檢查注冊(cè)表項(xiàng)

第一部分 SSH端口轉(zhuǎn)發(fā)概述

當(dāng)你在咖啡館享受免費(fèi) WiFi 的時(shí)候,有沒(méi)有想到可能有人正在竊取你的密碼及隱私信息?當(dāng)你發(fā)現(xiàn)實(shí)驗(yàn)室的防火墻阻止了你的網(wǎng)絡(luò)應(yīng)用端口,是不是有苦難言?來(lái)看看 SSH 的端口轉(zhuǎn)發(fā)功能能給我們帶來(lái)什么好處吧!

SSH端口轉(zhuǎn)發(fā)概述

讓我們先來(lái)了解一下端口轉(zhuǎn)發(fā)的概念吧。我們知道,SSH 會(huì)自動(dòng)加密和解密所有 SSH 客戶端與服務(wù)端之間的網(wǎng)絡(luò)數(shù)據(jù)。但是,SSH 還同時(shí)提供了一個(gè)非常有用的功能,這就是端口轉(zhuǎn)發(fā)。

它能夠?qū)⑵渌?TCP 端口的網(wǎng)絡(luò)數(shù)據(jù)通過(guò) SSH 鏈接來(lái)轉(zhuǎn)發(fā),并且自動(dòng)提供了相應(yīng)的加密及解密服務(wù)。這一過(guò)程有時(shí)也被叫做“隧道”(tunneling),這是因?yàn)?SSH 為其他 TCP 鏈接提供了一個(gè)安全的通道來(lái)進(jìn)行傳輸而得名。

例如,Telnet,SMTP,LDAP 這些 TCP 應(yīng)用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時(shí),如果您工作環(huán)境中的防火墻限制了一些網(wǎng)絡(luò)端口的使用,但是允許 SSH 的連接,那么也是能夠通過(guò)將 TCP 端口轉(zhuǎn)發(fā)來(lái)使用 SSH 進(jìn)行通訊。

總的來(lái)說(shuō) SSH 端口轉(zhuǎn)發(fā)能夠提供兩大功能:

加密 SSH Client 端至 SSH Server 端之間的通訊數(shù)據(jù)。

突破防火墻的限制完成一些之前無(wú)法建立的 TCP 連接。

圖 1. SSH 端口轉(zhuǎn)發(fā)

如上圖所示,使用了端口轉(zhuǎn)發(fā)之后,TCP 端口 A 與 B 之間現(xiàn)在并不直接通訊,而是轉(zhuǎn)發(fā)到了 SSH 客戶端及服務(wù)端來(lái)通訊,從而自動(dòng)實(shí)現(xiàn)了數(shù)據(jù)加密并同時(shí)繞過(guò)了防火墻的限制。

第二部分 SSH本地端口轉(zhuǎn)發(fā)與遠(yuǎn)程端口轉(zhuǎn)發(fā)

SSH本地端口轉(zhuǎn)發(fā)實(shí)例分析

我們先來(lái)看第一個(gè)例子,在實(shí)驗(yàn)室里有一臺(tái) LDAP 服務(wù)器(LdapServerHost),但是限制了只有本機(jī)上部署的應(yīng)用才能直接連接此 LDAP 服務(wù)器。

如果我們由于調(diào)試或者測(cè)試的需要想臨時(shí)從遠(yuǎn)程機(jī)器(LdapClientHost)直接連接到這個(gè) LDAP 服務(wù)器 , 有什么方法能夠?qū)崿F(xiàn)呢?

答案無(wú)疑是本地端口轉(zhuǎn)發(fā)了,它的命令格式是:

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

在 LdapClientHost 上執(zhí)行如下命令即可建立一個(gè) SSH 的本地端口轉(zhuǎn)發(fā),例如:

$ ssh -L 7001:localhost:389 LdapServerHost

圖 2. 本地端口轉(zhuǎn)發(fā)

這里需要注意的是本例中我們選擇了 7001 端口作為本地的監(jiān)聽(tīng)端口,在選擇端口號(hào)時(shí)要注意非管理員帳號(hào)是無(wú)權(quán)綁定 1-1023 端口的,所以一般是選用一個(gè) 1024-65535 之間的并且尚未使用的端口號(hào)即可。

然后我們可以將遠(yuǎn)程機(jī)器(LdapClientHost)上的應(yīng)用直接配置到本機(jī)的 7001 端口上(而不是 LDAP 服務(wù)器的 389 端口上)。之后的數(shù)據(jù)流將會(huì)是下面這個(gè)樣子:

我們?cè)?LdapClientHost 上的應(yīng)用將數(shù)據(jù)發(fā)送到本機(jī)的 7001 端口上,

而本機(jī)的 SSH Client 會(huì)將 7001 端口收到的數(shù)據(jù)加密并轉(zhuǎn)發(fā)到 LdapServertHost 的 SSH Server 上。

SSH Server 會(huì)解密收到的數(shù)據(jù)并將之轉(zhuǎn)發(fā)到監(jiān)聽(tīng)的 LDAP 389 端口上,

最后再將從 LDAP 返回的數(shù)據(jù)原路返回以完成整個(gè)流程。

我們可以看到,這整個(gè)流程應(yīng)用并沒(méi)有直接連接 LDAP 服務(wù)器,而是連接到了本地的一個(gè)監(jiān)聽(tīng)端口,但是 SSH 端口轉(zhuǎn)發(fā)完成了

剩下的所有事情,加密,轉(zhuǎn)發(fā),解密,通訊。

這里有幾個(gè)地方需要注意:

SSH 端口轉(zhuǎn)發(fā)是通過(guò) SSH 連接建立起來(lái)的,我們必須保持這個(gè) SSH 連接以使端口轉(zhuǎn)發(fā)保持生效。一旦關(guān)閉了此連接,相應(yīng)的端口轉(zhuǎn)發(fā)也會(huì)隨之關(guān)閉。

我們只能在建立 SSH 連接的同時(shí)創(chuàng)建端口轉(zhuǎn)發(fā),而不能給一個(gè)已經(jīng)存在的 SSH 連接增加端口轉(zhuǎn)發(fā)。

你可能會(huì)疑惑上面命令中的 <remote host> 為什么用 localhost,它指向的是哪臺(tái)機(jī)器呢?在本例中,它指向 LdapServertHost 。我們?yōu)槭裁从?localhost 而不是 IP 地址或者主機(jī)名呢?

其實(shí)這個(gè)取決于我們之前是如何限制 LDAP 只有本機(jī)才能訪問(wèn)。

如果只允許 lookback 接口訪問(wèn)的話,那么自然就只有 localhost 或者 IP 為 127.0.0.1 才能訪問(wèn)了,而不能用真實(shí) IP 或者主機(jī)名。

命令中的 <remote host><SSH hostname> 必須是同一臺(tái)機(jī)器么?其實(shí)是不一定的,它們可以是兩臺(tái)不同的機(jī)器。我們?cè)诤竺娴睦永飼?huì)詳細(xì)闡述這點(diǎn)。

好了,我們已經(jīng)在 LdapClientHost 建立了端口轉(zhuǎn)發(fā),那么這個(gè)端口轉(zhuǎn)發(fā)可以被其他機(jī)器使用么?比如能否新增加一臺(tái) LdapClientHost2 來(lái)直接連接 LdapClientHost 的 7001 端口?

答案是不行的,在主流 SSH 實(shí)現(xiàn)中,本地端口轉(zhuǎn)發(fā)綁定的是 lookback 接口,這意味著只有 localhost 或者 127.0.0.1 才能使用本機(jī)的端口轉(zhuǎn)發(fā)

其他機(jī)器發(fā)起的連接只會(huì)得到“ connection refused. ”。

好在 SSH 同時(shí)提供了 GatewayPorts 關(guān)鍵字,我們可以通過(guò)指定它與其他機(jī)器共享這個(gè)本地端口轉(zhuǎn)發(fā)。

ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

SSH遠(yuǎn)程端口轉(zhuǎn)發(fā)實(shí)例分析

我們來(lái)看第二個(gè)例子,這次假設(shè)由于網(wǎng)絡(luò)或防火墻的原因我們不能用 SSH 直接從 LdapClientHost 連接到 LDAP 服務(wù)器(LdapServertHost),但是反向連接卻是被允許的。那此時(shí)我們的選擇自然就是遠(yuǎn)程端口轉(zhuǎn)發(fā)了。

它的命令格式是:

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

例如在 LDAP 服務(wù)器(LdapServertHost)端執(zhí)行如下命令:

$ ssh -R 7001:localhost:389 LdapClientHost

圖 3. 遠(yuǎn)程端口轉(zhuǎn)發(fā)

和本地端口轉(zhuǎn)發(fā)相比,這次的圖里,SSH Server 和 SSH Client 的位置對(duì)調(diào)了一下,但是數(shù)據(jù)流依然是一樣的。

我們?cè)?LdapClientHost 上的應(yīng)用將數(shù)據(jù)發(fā)送到本機(jī)的 7001 端口上,而本機(jī)的 SSH Server 會(huì)將 7001 端口收到的數(shù)據(jù)加密并轉(zhuǎn)發(fā)到 LdapServertHost 的 SSH Client 上。

SSH Client 會(huì)解密收到的數(shù)據(jù)并將之轉(zhuǎn)發(fā)到監(jiān)聽(tīng)的 LDAP 389 端口上,最后再將從 LDAP 返回的數(shù)據(jù)原路返回以完成整個(gè)流程。

看到這里,你是不是會(huì)有點(diǎn)糊涂了么?為什么叫本地轉(zhuǎn)發(fā),而有時(shí)又叫遠(yuǎn)程轉(zhuǎn)發(fā)?這兩者有什么區(qū)別?

本SSH地端口轉(zhuǎn)發(fā)與SSH遠(yuǎn)程端口轉(zhuǎn)發(fā)的對(duì)比與分析

不錯(cuò),SSH Server,SSH Client,LdapServertHost,LdapClientHost,本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),

這么多的名詞的確容易讓人糊涂。

讓我們來(lái)分析一下其中的結(jié)構(gòu)吧。

首先,SSH 端口轉(zhuǎn)發(fā)自然需要 SSH 連接,而 SSH 連接是有方向的,從 SSH Client 到 SSH Server 。

而我們的應(yīng)用也是有方向的,比如需要連接 LDAP Server 時(shí),LDAP Server 自然就是 Server 端,我們應(yīng)用連接的方向也是從應(yīng)用的 Client 端連接到應(yīng)用的 Server 端。

如果這兩個(gè)連接的方向一致,那我們就說(shuō)它是本地轉(zhuǎn)發(fā)。而如果兩個(gè)方向不一致,我們就說(shuō)它是遠(yuǎn)程端口轉(zhuǎn)發(fā)。

我們可以回憶上面的兩個(gè)例子來(lái)做個(gè)對(duì)照。

本地端口轉(zhuǎn)發(fā)時(shí):

LdapClientHost 同時(shí)是應(yīng)用的客戶端,也是 SSH Client,這兩個(gè)連接都從它指向 LdapServertHost(既是 LDAP 服務(wù)端,也是 SSH Server)。

遠(yuǎn)程端口轉(zhuǎn)發(fā)時(shí):

LdapClientHost 是應(yīng)用的客戶端,但卻是 SSH Server ;而 LdapServertHost 是 LDAP 的服務(wù)端,但卻是 SSH Client 。這樣兩個(gè)連接的方向剛好相反。

另一個(gè)方便記憶的方法是

Server 端的端口都是預(yù)定義的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是動(dòng)態(tài)可供我們選擇的端口(如上述例子中選用的 7001 端口)。

如果 Server 端的兩個(gè)端口都在同一臺(tái)機(jī)器,Client 端的兩個(gè)端口都在另一臺(tái)機(jī)器上,那么這就是本地端口連接;

如果這四個(gè)端口交叉分布在兩個(gè)機(jī)器上,每臺(tái)機(jī)器各有一個(gè) Server 端端口,一個(gè) Client 端端口,那就是遠(yuǎn)程端口連接。

弄清楚了兩者的區(qū)別之后,再來(lái)看看兩者的相同之處。

如果你所在的環(huán)境下,既允許 LdapClientHost 發(fā)起 SSH 連接到 LdapServerHost,也允許 LdapServerHost 發(fā)起 SSH 連接到 LdapClientHost 。

那么這時(shí)我們選擇本地轉(zhuǎn)發(fā)或遠(yuǎn)程轉(zhuǎn)發(fā)都是可以的,能完成一樣的功能。

接著讓我們來(lái)看個(gè)進(jìn)階版的端口轉(zhuǎn)發(fā)。

我們之前涉及到的各種連接 / 轉(zhuǎn)發(fā)都只涉及到了兩臺(tái)機(jī)器,還記得我們?cè)诒镜剞D(zhuǎn)發(fā)中提到的一個(gè)問(wèn)題么?

本地端口轉(zhuǎn)發(fā)命令中的 <remote host><SSH hostname> 可以是不同的機(jī)器么?

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

答案是可以的!讓我們來(lái)看一個(gè)涉及到四臺(tái)機(jī)器 (A,B,C,D) 的例子。

圖 4. 多主機(jī)轉(zhuǎn)發(fā)應(yīng)用

在 SSH Client(C) 執(zhí)行下列命令來(lái)建立 SSH 連接以及端口轉(zhuǎn)發(fā):

$ ssh -g -L 7001:<B>:389 <D>

然后在我們的應(yīng)用客戶端(A)上配置連接機(jī)器(C )的 7001 端口即可。

注意我們?cè)诿钪兄付恕?-g ”參數(shù)以保證機(jī)器(A)能夠使用機(jī)器(C)建立的本地端口轉(zhuǎn)發(fā)。

而另一個(gè)值得注意的地方是,在上述連接中,(A)<-> (C) 以及 (B)<->(D) 之間的連接并不是安全連接,它們之間沒(méi)有經(jīng)過(guò) SSH 的加密及解密。

如果他們之間的網(wǎng)絡(luò)并不是值得信賴的網(wǎng)絡(luò)連接,我們就需要謹(jǐn)慎使用這種連接方式了。

第三部分 其他類(lèi)型的端口轉(zhuǎn)發(fā)

SSH動(dòng)態(tài)端口轉(zhuǎn)發(fā)實(shí)例分析

恩,動(dòng)態(tài)轉(zhuǎn)發(fā),聽(tīng)上去很酷。

當(dāng)你看到這里時(shí),有沒(méi)有想過(guò)我們已經(jīng)討論過(guò)了本地轉(zhuǎn)發(fā),遠(yuǎn)程轉(zhuǎn)發(fā),但是前提都是要求有一個(gè)固定的應(yīng)用服務(wù)端的端口號(hào),

例如前面例子中的 LDAP 服務(wù)端的 389 端口。那如果沒(méi)有這個(gè)端口號(hào)怎么辦?等等,

什么樣的應(yīng)用會(huì)沒(méi)有這個(gè)端口號(hào)呢?嗯,比如說(shuō)用瀏覽器進(jìn)行 Web 瀏覽,比如說(shuō) MSN 等等。

當(dāng)我們?cè)谝粋€(gè)不安全的 WiFi 環(huán)境下上網(wǎng),用 SSH 動(dòng)態(tài)轉(zhuǎn)發(fā)來(lái)保護(hù)我們的網(wǎng)頁(yè)瀏覽及 MSN 信息無(wú)疑是十分必要的。讓我們先來(lái)看一下動(dòng)態(tài)轉(zhuǎn)發(fā)的命令格式:

$ ssh -D <local port> <SSH Server>

例如:

$ ssh -D 7001 <SSH Server>

圖 5. 動(dòng)態(tài)端口轉(zhuǎn)發(fā)

似乎很簡(jiǎn)單,我們依然選擇了 7001 作為本地的端口號(hào),其實(shí)在這里 SSH 是創(chuàng)建了一個(gè) SOCKS 代理服務(wù)。來(lái)看看幫助文檔中對(duì) -D 參數(shù)的描述:

-D port
 This works by allocating a socket to listen to port on the local
 side, and whenever a connection is made to this port, the con-
 nection is forwarded over the secure channel, and the applica-
 tion protocol is then used to determine where to connect to from
 the remote machine.  Currently the SOCKS4 and SOCKS5 protocols
 are supported, and ssh will act as a SOCKS server.  Only root
 can forward privileged ports.  Dynamic port forwardings can also
 be specified in the configuration file.

之后的使用就簡(jiǎn)單了,我們可以直接使用 localhost:7001 來(lái)作為正常的 SOCKS 代理來(lái)使用,直接在瀏覽器或 MSN 上設(shè)置即可。

在 SSH Client 端無(wú)法訪問(wèn)的網(wǎng)站現(xiàn)在也都可以正常瀏覽。而這里需要值得注意的是,此時(shí) SSH 所包護(hù)的范圍只包括從瀏覽器端(SSH Client 端)到 SSH Server 端的連接,并不包含從 SSH Server 端 到目標(biāo)網(wǎng)站的連接。

如果后半截連接的安全不能得到充分的保證的話,這種方式仍不是合適的解決方案。

X 協(xié)議端口轉(zhuǎn)發(fā)實(shí)例分析

好了,讓我們來(lái)看最后一個(gè)例子 - X 協(xié)議轉(zhuǎn)發(fā)。

我們?nèi)粘9ぷ鳟?dāng)中,可能會(huì)經(jīng)常會(huì)遠(yuǎn)程登錄到 Linux/Unix/Solaris/HP 等機(jī)器上去做一些開(kāi)發(fā)或者維護(hù),也經(jīng)常需要以 GUI 方式運(yùn)行一些程序,比如要求圖形化界面來(lái)安裝 DB2/WebSphere 等等。

這時(shí)候通常有兩種選擇來(lái)實(shí)現(xiàn):VNC 或者 X 窗口,讓我們來(lái)看看后者。

使用 X 窗口通常需要分別安裝:X Client 和 X Server 。

在本例中我們的 X Client 就是所訪問(wèn)的遠(yuǎn)程 Linux/Unix/Solaris/HP,而我們的 X Server 則是發(fā)起訪問(wèn)的本地機(jī)器(例如你面前正在使用的筆記本或臺(tái)式機(jī))。

把 X Client 端的 X 窗口顯示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:

export DISPLAY=<X Server IP>:<display #>.<virtual #>

例如:

export DISPLAY=myDesktop:1.0

然后直接運(yùn)行 X 應(yīng)用即可,X 窗口就會(huì)自動(dòng)在我們的本地端打開(kāi)。

一切運(yùn)行正常,但是,這時(shí)候 IT 部門(mén)突然在遠(yuǎn)程 Linux/Unix/Solaris/HP 前面加了一道防火墻。

非常不幸的是,X 協(xié)議并不在允許通過(guò)的列表之內(nèi)。怎么辦?只能使用 VNC 了么?不,其實(shí)只要使用了 SSH 端口轉(zhuǎn)發(fā)即可通過(guò),同時(shí)也對(duì) X 通訊數(shù)據(jù)做了加密,真是一舉兩得。

(當(dāng)然,使用此方法前最好先咨詢相關(guān) IT 部門(mén)是否符合相應(yīng)的安全條例,以免造成違規(guī)操作。)

建立命令也很簡(jiǎn)單,直接從本地機(jī)器(X Server 端)發(fā)起一個(gè)如下的 SSH 連接即可:

$ ssh -X <SSH Server>

圖 5. X 轉(zhuǎn)發(fā)

建立連接之后就可以直接運(yùn)行遠(yuǎn)程的 X 應(yīng)用。注意建立 X 轉(zhuǎn)發(fā)之后會(huì)自動(dòng)設(shè)置 DISPLAY 環(huán)境變量,通常會(huì)被設(shè)置成localhost:10.0,我們無(wú)需也不應(yīng)該在連接之后再進(jìn)行修改此環(huán)境變量。

一個(gè)比較常見(jiàn)的場(chǎng)景是,我們的本地機(jī)器是 Windows 操作系統(tǒng),這時(shí)可以選擇開(kāi)源的 XMing 來(lái)作為我們的 XServer,而 SSH Client 則可以任意選擇了,例如 PuTTY,Cygwin 均可以配置 訪問(wèn) SSH 的同時(shí)建立 X 轉(zhuǎn)發(fā)。

第四部分 SSH端口轉(zhuǎn)發(fā)總結(jié)

至此,我們已經(jīng)完成了本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),動(dòng)態(tài)端口轉(zhuǎn)發(fā)以及 X 轉(zhuǎn)發(fā)的介紹。

回顧起來(lái),總的思路是通過(guò)將 TCP 連接轉(zhuǎn)發(fā)到 SSH 通道上以解決數(shù)據(jù)加密以及突破防火墻的種種限制。

對(duì)一些已知端口號(hào)的應(yīng)用,例如 Telnet/LDAP/SMTP,我們可以使用本地端口轉(zhuǎn)發(fā)或者遠(yuǎn)程端口轉(zhuǎn)發(fā)來(lái)達(dá)到目的。

動(dòng)態(tài)端口轉(zhuǎn)發(fā)則可以實(shí)現(xiàn) SOCKS 代理從而加密以及突破防火墻對(duì) Web 瀏覽的限制。

對(duì)于 X 應(yīng)用,無(wú)疑是 X 轉(zhuǎn)發(fā)最為適用了。雖然每一部分我們都只是簡(jiǎn)單的介紹了一下,

但如果能靈活應(yīng)用這些技巧,相信對(duì)我們的日常生活 / 工作也是會(huì)有所幫助的。

更多關(guān)于SSH端口轉(zhuǎn)發(fā)的文章請(qǐng)點(diǎn)擊下面的相關(guān)文章

標(biāo)簽:懷化 煙臺(tái) 通遼 湘潭 賀州 山南 黃山 湖北

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SSH端口轉(zhuǎn)發(fā),本地端口轉(zhuǎn)發(fā),遠(yuǎn)程端口轉(zhuǎn)發(fā),動(dòng)態(tài)端口轉(zhuǎn)發(fā)詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266