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