SSH的端口轉(zhuǎn)發(fā)功能
SSH的端口轉(zhuǎn)發(fā)功能非常強(qiáng)大好用铛碑。
可是官方對(duì)SSH端口轉(zhuǎn)發(fā)功能的說(shuō)明文檔都非诚Ы悖晦澀,對(duì)一個(gè)新手非常難理解杨帽。本文以一個(gè)例子來(lái)試圖說(shuō)明這些概念。
SSH的端口轉(zhuǎn)發(fā)包括嗤军,本地端口轉(zhuǎn)發(fā)和遠(yuǎn)程端口轉(zhuǎn)發(fā)兩部分注盈。
1. 本地端口轉(zhuǎn)發(fā)
在本地(運(yùn)行命令的機(jī)器上)起一個(gè)監(jiān)聽(tīng)端口,把所有對(duì)該本地端口的訪問(wèn)轉(zhuǎn)發(fā)到服務(wù)器叙赚。命令行格式為:
$ ssh -L <local-port-to-listen>:<remote-host>:<remote-port> <sshserver>
命令行中的幾個(gè)概念:
- <local-port-to-listen> 本地端口老客,也就是命令運(yùn)行的機(jī)器的端口。
- <remote-host>:<remote-port> 目標(biāo)機(jī)器和端口震叮,是真正提供服務(wù)的端口胧砰。
- <sshserver> ssh服務(wù)器,是提供端口轉(zhuǎn)發(fā)功能的服務(wù)器苇瓣。
這個(gè)命令的功能就是把"本地機(jī)器:<local-port-to-listen>"映射到"<remote-host>:<remote-port>"尉间,這個(gè)功能通過(guò)sshserver實(shí)現(xiàn)。
本地端口轉(zhuǎn)發(fā)通常執(zhí)行在防火墻外的機(jī)器上击罪,用來(lái)給防火墻外的其他機(jī)器訪問(wèn)防火墻內(nèi)的資源:
下面以上圖的一個(gè)例子來(lái)說(shuō)明:
- 假設(shè)有一個(gè)服務(wù)器在端口8080提供web服務(wù):webserver:8080哲嘲。
- 這臺(tái)服務(wù)器在防火墻內(nèi),不允許外面的隨意訪問(wèn)媳禁。
- 而有一臺(tái)代理機(jī)器proxyserver眠副,可以繞過(guò)防火墻,訪問(wèn)webserver機(jī)器竣稽。
- 這臺(tái)代理服務(wù)器侦啸,能提供給用戶訪問(wèn)。
這種場(chǎng)景下丧枪,我們就可以使用SSH的端口轉(zhuǎn)發(fā)功能光涂,使得用戶訪問(wèn)proxyserver的方式來(lái)訪問(wèn)webserver:
在proxyserver機(jī)器上執(zhí)行下面的命令:
$ ssh -L 30000:webserver:8080 user@sshserver
這個(gè)命令會(huì)執(zhí)行下面的功能:
-
- 在proxyserver上的ssh客戶端會(huì)建立一個(gè)加密連接到sshserver服務(wù)器。
- 1.1. sshserver服務(wù)器提供的服務(wù)缺省監(jiān)聽(tīng)端口是22
- 1.2. proxyserver和sshserver肯定不能是同一臺(tái)機(jī)器拧烦,否則就沒(méi)必要建立SSH通道了忘闻。
- 1.3. sshserver和webserver可以是同一臺(tái)機(jī)器,也可以不同恋博;如果是不同那么必須保證他們之間的互通性齐佳,如果相同,webserver的地址可以使用localhost债沮,例如:
$ ssh -L 30000:localhost:8080 user@webserver
- proxyserver開(kāi)啟監(jiān)聽(tīng)端口30000
- 在sshserver機(jī)器上炼吴,會(huì)建立一個(gè)到webserver端口8080的連接。
- 至此通過(guò)proxyserver和sshserver之間建立的SSH隧道疫衩,所有向sshserver端口30000的請(qǐng)求都將被轉(zhuǎn)發(fā)到webserver的端口8080硅蹦,以此用戶通過(guò)訪問(wèn) http://proxyserver:30000來(lái)訪問(wèn)http://webserver:8080的目的。
端口轉(zhuǎn)發(fā)就完成了,總結(jié)一下就是完成下面的流程:
clients <----> proxyserver <--firewall--> sshserver <----> webserver
遠(yuǎn)程端口轉(zhuǎn)發(fā)
和本地端口轉(zhuǎn)發(fā)的區(qū)別是:
- 本地端口轉(zhuǎn)發(fā)童芹,起一個(gè)監(jiān)聽(tīng)端口在本地(執(zhí)行命令的機(jī)器)涮瞻;然后轉(zhuǎn)發(fā)所有向這個(gè)新起本地端口的請(qǐng)求, 到 sshserver假褪,再到目標(biāo)機(jī)器署咽。
- 遠(yuǎn)程端口轉(zhuǎn)發(fā),起一個(gè)監(jiān)聽(tīng)端口在遠(yuǎn)程(sshserver機(jī)器)生音;然后轉(zhuǎn)發(fā)所有向這個(gè)新起遠(yuǎn)程端口的請(qǐng)求宁否,到本地機(jī)器(執(zhí)行命令的機(jī)器),再到目標(biāo)機(jī)器缀遍。
遠(yuǎn)程端口轉(zhuǎn)發(fā)的命令行格式和本地端口轉(zhuǎn)發(fā)一樣:
$ ssh -R <local-port-to-listen>:<remote-host>:<remote-port> <sshserver>
所不同的是端口<local-port-to-listen>是起在sshserver上家淤,而不是在運(yùn)行命令的proxyserver機(jī)器上。然后把所有對(duì)<sshserver>:<local-port-to-listen>的請(qǐng)求都轉(zhuǎn)發(fā)到<remote-host>:<remote-port>上去瑟由。
遠(yuǎn)程端口轉(zhuǎn)發(fā)通常執(zhí)行在防火墻內(nèi)的機(jī)器上絮重,用來(lái)給防火墻外的其他機(jī)器訪問(wèn)防火墻內(nèi)的資源。
還是以上面的背景為例子:
在proxyserveer機(jī)器上執(zhí)行下面的命令:
$ ssh -R 30000:webserver:8080 user@sshserver
這個(gè)命令會(huì)執(zhí)行下面的功能:
-
- 在本地proxyserver上的ssh客戶端建立一個(gè)加密連接到ssh服務(wù)器
- 1.1 sshserver (缺省監(jiān)聽(tīng)在22端口)
- 1.2. proxyserver和webserver可以是同一臺(tái)機(jī)器歹苦,也可以不同青伤;如果是不同那么必須保證他們之間的互通性,如果相同殴瘦,webserver的地址可以使用localhost狠角,例如:
$ ssh -R 30000:localhost:8080 user@sshserver
- 在sshserver開(kāi)啟監(jiān)聽(tīng)端口30000
- 在proxyserver機(jī)器上,建立一個(gè)連接到webserver上蚪腋。
- 至此通過(guò)proxyserver和sshserver之間建立的SSH隧道丰歌,所有向sshserver端口30000的請(qǐng)求都將被轉(zhuǎn)發(fā)到webserver的端口8080,以此用戶通過(guò)訪問(wèn) http://sshserver:30000來(lái)訪問(wèn)http://webserver:8080的目的屉凯。
端口轉(zhuǎn)發(fā)就完成了立帖,總結(jié)一下就是完成下面的流程:
webserver <----> proxyserver <--firewall--> sshserver <----> clients
注意
命令行參數(shù)中
-L|R <local-port-to-listen>:<remote-host>:<remote-port>
- <local-port-to-listen>
都叫本地端口,其實(shí)針對(duì)本地轉(zhuǎn)發(fā)和遠(yuǎn)程轉(zhuǎn)發(fā)是在不同的機(jī)器上:
- 如果是本地轉(zhuǎn)發(fā)悠砚,那么端口起在執(zhí)行命令的機(jī)器上晓勇。
- 如果是遠(yuǎn)程轉(zhuǎn)發(fā),那么端口其在sshserver的機(jī)器上灌旧。
2 <remote-host>==localhost
當(dāng)<remote-host>==localhost時(shí)绑咱,雖然都叫l(wèi)ocalhost,其實(shí)針對(duì)本地轉(zhuǎn)發(fā)和遠(yuǎn)程轉(zhuǎn)發(fā)是指不同的機(jī)器:
- 如果是本地轉(zhuǎn)發(fā)枢泰,那么localhost指的是sshserver機(jī)器描融,也就是例子中sshserver和webserver是同一臺(tái)機(jī)器的場(chǎng)景。
- 如果是遠(yuǎn)程轉(zhuǎn)發(fā)衡蚂,那么localhost指的是執(zhí)行命令的機(jī)器窿克,也就是例子中proxyserver和webserver是同一臺(tái)機(jī)器的場(chǎng)景骏庸。