![](https://img.51dongshi.com/20250105/wz/18523368852.jpg)
端口轉(zhuǎn)發(fā)原理和使用-端口轉(zhuǎn)發(fā)原理和使用方法0x00ssh支持的通用端口轉(zhuǎn)發(fā)一般我們使用ssh來遠(yuǎn)程登錄主機(jī),在上面執(zhí)行命令.但是ssh還有portforward的功能,關(guān)于ssh的portforward的詳細(xì)命令,可以看命令的man輸出.本文主要對sshportforwarding的工作原理進(jìn)行介紹.ssh的通用端口轉(zhuǎn)發(fā)分為localforward(本地端口轉(zhuǎn)發(fā)),remoteforward(遠(yuǎn)端端口轉(zhuǎn)發(fā)),dynamicforward(動態(tài)端口轉(zhuǎn)發(fā)).還有X11forward也是屬于端口轉(zhuǎn)發(fā)的一種,但是其是特殊用途的,不在這兒討論.0x01ssh中的client和server我們需要弄清楚local和remote的概念.ssh是典型的client,server架構(gòu),我們要連接的服務(wù)器是remote端,發(fā)起ssh連接的是client端.在client端,我們常用的軟件有:windows下面的xshell,putty,mobaxterm;linux下面自帶的openssh-client,mac上也是openssh-client.而在server端,一般就是各個(gè)發(fā)行版安裝的openssh-server了.0x02ssh端口轉(zhuǎn)發(fā)localforword下圖是localforward的工作原理圖:其中client和client_1在本地網(wǎng)絡(luò)的兩臺機(jī)器,相互直接是可以直接訪問的.server和server_1是遠(yuǎn)端網(wǎng)絡(luò)的兩臺機(jī)器,相互之間是可達(dá)的.但是本地網(wǎng)絡(luò)和遠(yuǎn)端網(wǎng)絡(luò)是不可隨意訪問的(可能是路由本身有特殊設(shè)置,但是大部分情況下是因?yàn)榉阑饓Φ母綦x設(shè)置),只有其中的client_1可以發(fā)起向server_1的22端口ssh連接.使用ssh提供的localforward,從client可以訪問到server的22端口,也就是從client可以直接登錄到server上.在client_1上我們輸入命令,并保持這個(gè)窗口打開不關(guān)閉如果是linux和mac,那么直接輸入這個(gè)命令就可以了,其中的server和server_1換成相應(yīng)的IP,如果是windows,可以下載一個(gè)mobaxerm,里面有openssh的完全實(shí)現(xiàn)也有這個(gè)命令.當(dāng)然windows下面的xshell,putty之類的軟件也有相應(yīng)的配置.ssh-L10000:server:22server_1此時(shí)會完成如下的事情:client_1完成到server_1的ssh連接,這條tcp通道就存在了在client_1端的ssh進(jìn)程會在本地的tcp:10000端口開啟監(jiān)聽然后在client上輸入如下命令ssh-p10000client_1此時(shí)會完成如下的事情:client_1發(fā)起到client的10000端口連接client完成連接server_1上的sshd進(jìn)程發(fā)起到server的22端口的連接所有通過client到client_1的10000端口的數(shù)據(jù)通過client_1和server_1之間的連接到server_1上,然后接著到server22端口上.回來的數(shù)據(jù)也是走這個(gè)通道.也就是說,上面圖中的3個(gè)實(shí)線箭頭組成的鏈路通道相當(dāng)于虛線箭頭的通道.達(dá)到的效果是,在本地網(wǎng)絡(luò)中任何client機(jī)器通過訪問client_1的10000端口,就相當(dāng)于訪問了server的22端口了.當(dāng)然,這兒可以把22端口換成任何server上面的端口,比如80或者443之類的(不過這個(gè)web請求的訪問最好還是用下面的動態(tài)轉(zhuǎn)發(fā))0x03ssh端口轉(zhuǎn)發(fā)remoteforward和localforward對應(yīng)的是remoteforward.注意這兒的local和forward說的是端口是開在哪邊的,如果是開在ssh(client)這邊,就是localforward.如果是開在sshd(server)那邊,就是remoteforward.那localforward可以讓我們跨過防火墻的限制,打一條通道到遠(yuǎn)端.那么remoteforward有什么用么?1.既然遠(yuǎn)端可以有服務(wù)要被訪問,那么本地端也可以有的,也就是讓遠(yuǎn)端的機(jī)器可以跨過防火墻訪問本端機(jī)器提供的服務(wù).2.一個(gè)更好的用處,如果想讓開在自己本機(jī)的服務(wù)直接被公網(wǎng)訪問到(這個(gè)在調(diào)試的時(shí)候很有用,讓各種`實(shí)際`的流量進(jìn)入自己的機(jī)器一會兒),那么remotefroward可以幫上大忙.命令和localforward類似,在client1上敲ssh-R10000:client:22server_1client_1和server_1建立ssh連接的過程都是一樣的.不過第二步開端口是server_1上的ssh進(jìn)程開一個(gè)監(jiān)聽到tcp:10000的端口然后在和server_1可達(dá)的網(wǎng)絡(luò)中的機(jī)器server發(fā)起到server_1的10000端口的連接時(shí),client_1上的ssh會將流量導(dǎo)入到client的22端口.在解釋一下第二個(gè)用處,server換成是客戶的瀏覽器,server_1上的10000端口換成80端口,client換成是client_1,而且都是自己的電腦,client:22換成127.0.0.1:80.效果就是客戶的瀏覽器訪問server_1的80端口時(shí),流量直接進(jìn)入到自己的PC的80端口了.0x04ssh端口轉(zhuǎn)發(fā)dynamicforwardlocalforward可以完成本地端口到遠(yuǎn)端端口的一對一訪問.dynamicforward就是socks5代理.通過在client_1上敲ssh-D10000server_1前面client_1和server_1之間連接建立過程都是相同的.此時(shí)在client_1上就會開啟socks5的10000端口.我們在client上的web瀏覽器進(jìn)行如下的代理設(shè)置,那么所有從server_1上能放到導(dǎo)的網(wǎng)址,在client上就能訪問到了.相當(dāng)于把client放到了server_1的位置.0xff總結(jié)openssh的端口映射是一個(gè)強(qiáng)大的功能.基本上防火墻都會讓對環(huán)境中特定的機(jī)器的22端口可以通過,巧妙的使用ssh的portforward功能,可以讓很多遠(yuǎn)程支持的事情變得可能.如果再結(jié)合我上篇文章介紹的ProxyCommand功能,會發(fā)現(xiàn)我們可以把portforward的跳數(shù)繼續(xù)延長下去,只要環(huán)境有一個(gè)洞可以通,那么最終我們就能訪問到.