ssh端口轉發(fā)
在一開始學習ssh端口轉發(fā)的時候,總是被本地端口轉發(fā)和遠程端口轉發(fā)的區(qū)別搞得頭大,纏斗數(shù)日無果,沉思一番之后,決定逐個攻破,先揪住一個掰開揉碎,另一個再如法炮制,如此一來,迷惑可解矣。
ssh一般會涉及到3個角色:兩個端之間建立ssh連接,還有一個角色則是轉發(fā)的目的地,為避免A、B、C這樣一看便覺枯燥的指代名詞,我們請出在東方大陸婦孺皆知的取經(jīng)隊伍
本地端口轉發(fā)
某一日悟空又和三藏鬧矛盾了,三藏賭氣不理悟空了,這時悟空想要和三藏建立聯(lián)系就需要八戒來當傳聲筒。
現(xiàn)在利用三臺虛擬機來具象化這個例子
悟空:192.168.1.1(CentOS7.8)
八戒:192.168.1.2(CentOS7.8)
三藏:192.168.1.3(Ubuntu20.04)
192.168.1.3的防火墻設置拒絕來自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
,指本地端口轉發(fā);30000:192.168.1.3:22
指把對192.168.1.1的30000端口的訪問轉發(fā)到192.168.1.3的22端口(在做轉發(fā)之前應該先檢查192.168.1.1的30000端口是否已經(jīng)被占用了,可以使用lsof -i:port
來進行檢查);最后面的root@192.168.1.2
要和最前面的ssh
放在一起看,也就是說,192.168.1.1先執(zhí)行了ssh root@192.168.1.2
,依據(jù)這個ssh連接建立起了 一個本地端口轉發(fā)的隧道,隧道實現(xiàn)了 30000:192.168.1.3:22
所指的轉發(fā)工作。
當完成了上面所說的建立隧道的工作,就可以測試隧道的連通性了,在任意一個192.168.1.1的終端執(zhí)行telnet localhost 30000
進行測試,如果測試通過(輸出結果為已連接,而不是連接被拒絕),說明隧道沒問題,下一步可以嘗試使用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。
有個小細節(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í)行端口轉發(fā)可以加上-Nf
參數(shù),-N
表示不執(zhí)行命令,使得該ssh連接只起到隧道的作用,-f
表示在后臺運行該ssh連接。還有一點要注意,-f
參數(shù)不能單獨使用,因為在沒有 -N
特別指明的情況下,無法把沒有指定登錄后要執(zhí)行的命令的ssh會話放到后臺。
除了在192.168.1.1執(zhí)行端口轉發(fā),192.168.1.1要和192.168.1.3建立會話,在192.168.1.2做一個本地端口轉發(fā)也能達到同樣的目的。在192.168.1.2執(zhí)行:ssh -NfL 30000:192.168.1.3:22 root@localhost
,這里192.168.1.2與自身建立了一個會話,把對自己的30000端口的訪問轉發(fā)到了192.168.1.3的22端口。但是這樣還不能達到目的,這是因為OpenSSH有一個限制,默認情況下,ssh只監(jiān)聽來自本機的回環(huán)地址的對于本地轉發(fā)端口的訪問,在這里也就是只有192.168.1.2自己才能訪問30000這個本地轉發(fā)端口。想要達到目的,還需要一個參數(shù):-g
,-g
能夠取消這個限制,使得其他主機也能夠訪問這個本地轉發(fā)端口,所以192.168.1.2應該執(zhí)行的完整的命令是:ssh -g -NfL 30000:192.168.1.3:22 root@localhost
。此外,如果192.168.1.2開啟了iptables,iptables的INPUT鏈中相關的 target 為 REJECT 的規(guī)則也會阻止其他主機訪問本地轉發(fā)端口。
遠程端口轉發(fā)
某一日悟空又和三藏鬧矛盾了,三藏把悟空趕走了,悟空于是回到花果山,開始過逍遙自在的日子。沒過多久,三藏那邊取經(jīng)形式日益嚴重,路上遇到的妖怪八戒和沙僧解決起來力有不逮,唐僧于是責怪八戒能力不足,八戒開始懷念大師兄在的日子,但是此時唐僧和猴哥都不愿說軟話,八戒沒得辦法,只得主動去找大師兄,陪著笑臉,意在溝通唐僧和悟空彼此思念之情。
仍然以三臺虛擬機來創(chuàng)建實例
悟空:192.168.1.1(CentOS7.8)
八戒:192.168.1.2(CentOS7.8)
三藏:192.168.1.3(Ubuntu20.04)
192.168.1.3的防火墻設置拒絕來自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端口的訪問轉發(fā)到192.168.1.3的22端口,注意不要把這里的轉發(fā)端口當成是執(zhí)行端口轉發(fā)命令的一方。最后的root@192.168.1.1
的解釋參考本地端口轉發(fā)部分。
測試隧道的連通性同本地端口轉發(fā)部分,在任意一個192.168.1.1的終端執(zhí)行telnet localhost 30000
進行測試。
容易產(chǎn)生歧義的
還有一件事,來看這種情況:192.168.1.1執(zhí)行 ssh -L 30000:localhost:22 root@192.168.1.2
,這里不考慮轉發(fā)的合理性,只關注一件事:命令中的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。也就是說,如果是本地端口轉發(fā),localhost
指的是接受ssh連接的一方;如果是遠程端口轉發(fā),localhost
指的是發(fā)起ssh連接的一方(也就是執(zhí)行端口轉發(fā)命令的一方)。更統(tǒng)一的說法是:不論本地端口轉發(fā)還是遠程端口轉發(fā),localhost
都是指連通隧道兩端的那個主機。文章來源:http://www.zghlxwxcb.cn/news/detail-661978.html
參考資料
[1] SSH, the Secure Shell, 2nd Edition (Barrett, Daniel J)-Chapter 9. Port Forwarding and X Forwarding
[2] Ubuntu 防火墻命令(查看,關閉,啟動) 博客園
[3] 如何列出和刪除防火墻規(guī)則UFW myfreax文章來源地址http://www.zghlxwxcb.cn/news/detail-661978.html
到了這里,關于ssh端口轉發(fā)-本地端口轉發(fā)和遠程端口轉發(fā)的具體用法實例的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!