在一開(kāi)始學(xué)習(xí)ssh端口轉(zhuǎn)發(fā)的時(shí)候,總是被本地端口轉(zhuǎn)發(fā)和遠(yuǎn)程端口轉(zhuǎn)發(fā)的區(qū)別搞得頭大,纏斗數(shù)日無(wú)果,沉思一番之后,決定逐個(gè)攻破,先揪住一個(gè)掰開(kāi)揉碎,另一個(gè)再如法炮制,如此一來(lái),迷惑可解矣。ssh一般會(huì)涉及到3個(gè)角色:兩個(gè)端之間建立ssh連接,還有一個(gè)角色則是轉(zhuǎn)發(fā)的目的地,為避免A、B、C這樣一看便覺(jué)枯燥的指代名詞,我們請(qǐng)出在東方大陸婦孺皆知的取經(jīng)隊(duì)伍
(資料圖)
某一日悟空又和三藏鬧矛盾了,三藏賭氣不理悟空了,這時(shí)悟空想要和三藏建立聯(lián)系就需要八戒來(lái)當(dāng)傳聲筒。現(xiàn)在利用三臺(tái)虛擬機(jī)來(lái)具象化這個(gè)例子悟空:192.168.1.1(CentOS7.8)八戒:192.168.1.2(CentOS7.8)三藏:192.168.1.3(Ubuntu20.04)192.168.1.3的防火墻設(shè)置拒絕來(lái)自192.168.1.1的訪問(wèn)ufw deny from 192.168.1.1
這時(shí),192.168.1.1想要和192.168.1.3建立連接,就可以通過(guò)192.168.1.2來(lái)建立一個(gè)隧道,在192.168.1.1上執(zhí)行ssh -L 30000:192.168.1.3:22 root@192.168.1.2,這樣隧道就建立起來(lái)了。這里-L即Local,指本地端口轉(zhuǎn)發(fā);30000:192.168.1.3:22指把對(duì)192.168.1.1的30000端口的訪問(wèn)轉(zhuǎn)發(fā)到192.168.1.3的22端口(在做轉(zhuǎn)發(fā)之前應(yīng)該先檢查192.168.1.1的30000端口是否已經(jīng)被占用了,可以使用lsof -i:port來(lái)進(jìn)行檢查);最后面的root@192.168.1.2要和最前面的ssh放在一起看,也就是說(shuō),192.168.1.1先執(zhí)行了ssh root@192.168.1.2,依據(jù)這個(gè)ssh連接建立起了一個(gè)本地端口轉(zhuǎn)發(fā)的隧道,隧道實(shí)現(xiàn)了 30000:192.168.1.3:22所指的轉(zhuǎn)發(fā)工作。
當(dāng)完成了上面所說(shuō)的建立隧道的工作,就可以測(cè)試隧道的連通性了,在任意一個(gè)192.168.1.1的終端執(zhí)行telnet localhost 30000進(jìn)行測(cè)試,如果測(cè)試通過(guò)(輸出結(jié)果為已連接,而不是連接被拒絕),說(shuō)明隧道沒(méi)問(wèn)題,下一步可以嘗試使用ssh通過(guò)隧道連接到192.168.1.3了,在任意一個(gè)192.168.1.1的終端執(zhí)行ssh root@localhost -p 30000,即可以ssh登錄到192.168.1.3,在192.168.1.3看來(lái),該ssh會(huì)話的來(lái)源是192.168.1.2。
有個(gè)小細(xì)節(jié),在192.168.1.1上執(zhí)行ssh -L 30000:192.168.1.3:22 root@192.168.1.2之后,終端會(huì)打開(kāi)192.168.1.1到192.168.1.2的會(huì)話,但是這樣原來(lái)192.168.1.1的終端就被占用了,為了節(jié)省出這個(gè)終端,執(zhí)行端口轉(zhuǎn)發(fā)可以加上-Nf參數(shù),-N表示不執(zhí)行命令,使得該ssh連接只起到隧道的作用,-f表示在后臺(tái)運(yùn)行該ssh連接。還有一點(diǎn)要注意,-f參數(shù)不能單獨(dú)使用,因?yàn)樵跊](méi)有 -N特別指明的情況下,無(wú)法把沒(méi)有指定登錄后要執(zhí)行的命令的ssh會(huì)話放到后臺(tái)。
除了在192.168.1.1執(zhí)行端口轉(zhuǎn)發(fā),192.168.1.1要和192.168.1.3建立會(huì)話,在192.168.1.2做一個(gè)本地端口轉(zhuǎn)發(fā)也能達(dá)到同樣的目的。在192.168.1.2執(zhí)行:ssh -NfL 30000:192.168.1.3:22 root@localhost,這里192.168.1.2與自身建立了一個(gè)會(huì)話,把對(duì)自己的30000端口的訪問(wèn)轉(zhuǎn)發(fā)到了192.168.1.3的22端口。但是這樣還不能達(dá)到目的,這是因?yàn)镺penSSH有一個(gè)限制,默認(rèn)情況下,ssh只監(jiān)聽(tīng)來(lái)自本機(jī)的回環(huán)地址的對(duì)于本地轉(zhuǎn)發(fā)端口的訪問(wèn),在這里也就是只有192.168.1.2自己才能訪問(wèn)30000這個(gè)本地轉(zhuǎn)發(fā)端口。想要達(dá)到目的,還需要一個(gè)參數(shù):-g,-g能夠取消這個(gè)限制,使得其他主機(jī)也能夠訪問(wèn)這個(gè)本地轉(zhuǎn)發(fā)端口,所以192.168.1.2應(yīng)該執(zhí)行的完整的命令是:ssh -g -NfL 30000:192.168.1.3:22 root@localhost。此外,如果192.168.1.2開(kāi)啟了iptables,iptables的INPUT鏈中相關(guān)的 target 為 REJECT 的規(guī)則也會(huì)阻止其他主機(jī)訪問(wèn)本地轉(zhuǎn)發(fā)端口。
某一日悟空又和三藏鬧矛盾了,三藏把悟空趕走了,悟空于是回到花果山,開(kāi)始過(guò)逍遙自在的日子。沒(méi)過(guò)多久,三藏那邊取經(jīng)形式日益嚴(yán)重,路上遇到的妖怪八戒和沙僧解決起來(lái)力有不逮,唐僧于是責(zé)怪八戒能力不足,八戒開(kāi)始懷念大師兄在的日子,但是此時(shí)唐僧和猴哥都不愿說(shuō)軟話,八戒沒(méi)得辦法,只得主動(dòng)去找大師兄,陪著笑臉,意在溝通唐僧和悟空彼此思念之情。
仍然以三臺(tái)虛擬機(jī)來(lái)創(chuàng)建實(shí)例悟空:192.168.1.1(CentOS7.8)八戒:192.168.1.2(CentOS7.8)三藏:192.168.1.3(Ubuntu20.04)192.168.1.3的防火墻設(shè)置拒絕來(lái)自192.168.1.1的訪問(wèn)ufw deny from 192.168.1.1
這一回,192.168.1.1無(wú)意主動(dòng)通過(guò)192.168.1.2建立隧道,反過(guò)來(lái),192.168.1.2要主動(dòng)與192.168.1.1建立連接,在192.168.1.1和192.168.1.3之間建立一個(gè)隧道。為此,192.168.1.2需要執(zhí)行:ssh -NfR 30000:192.168.1.3:22 root@192.168.1.1,-R即remote,30000:192.168.1.3:22同樣是指把對(duì)192.168.1.1的30000端口的訪問(wèn)轉(zhuǎn)發(fā)到192.168.1.3的22端口,注意不要把這里的轉(zhuǎn)發(fā)端口當(dāng)成是執(zhí)行端口轉(zhuǎn)發(fā)命令的一方。最后的root@192.168.1.1的解釋參考本地端口轉(zhuǎn)發(fā)部分。
測(cè)試隧道的連通性同本地端口轉(zhuǎn)發(fā)部分,在任意一個(gè)192.168.1.1的終端執(zhí)行telnet localhost 30000進(jìn)行測(cè)試。
還有一件事,來(lái)看這種情況:192.168.1.1執(zhí)行 ssh -L 30000:localhost:22 root@192.168.1.2,這里不考慮轉(zhuǎn)發(fā)的合理性,只關(guān)注一件事:命令中的localhost指的是誰(shuí),根據(jù)實(shí)際測(cè)試,上面命令中的localhost指的是192.168.1.2;而如果192.168.1.1執(zhí)行的是 ssh -R 30000:localhost:22 root@192.168.1.2,情況是否相同呢?根據(jù)實(shí)際測(cè)試,這種情況下的localhost指的是192.168.1.1。也就是說(shuō),如果是本地端口轉(zhuǎn)發(fā),localhost指的是接受ssh連接的一方;如果是遠(yuǎn)程端口轉(zhuǎn)發(fā),localhost指的是發(fā)起ssh連接的一方(也就是執(zhí)行端口轉(zhuǎn)發(fā)命令的一方)。更統(tǒng)一的說(shuō)法是:不論本地端口轉(zhuǎn)發(fā)還是遠(yuǎn)程端口轉(zhuǎn)發(fā),localhost都是指連通隧道兩端的那個(gè)主機(jī)。
[1] SSH, the Secure Shell, 2nd Edition (Barrett, Daniel J)-Chapter 9. Port Forwarding and X Forwarding[2] Ubuntu 防火墻命令(查看,關(guān)閉,啟動(dòng)) 博客園[3] 如何列出和刪除防火墻規(guī)則UFW myfreax
關(guān)鍵詞:
版權(quán)與免責(zé)聲明:
1 本網(wǎng)注明“來(lái)源:×××”(非商業(yè)周刊網(wǎng))的作品,均轉(zhuǎn)載自其它媒體,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。
2 在本網(wǎng)的新聞頁(yè)面或BBS上進(jìn)行跟帖或發(fā)表言論者,文責(zé)自負(fù)。
3 相關(guān)信息并未經(jīng)過(guò)本網(wǎng)站證實(shí),不對(duì)您構(gòu)成任何投資建議,據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。
4 如涉及作品內(nèi)容、版權(quán)等其它問(wèn)題,請(qǐng)?jiān)?0日內(nèi)同本網(wǎng)聯(lián)系。