溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SSH端口轉(zhuǎn)發(fā)的理解(精華)

發(fā)布時間:2020-09-07 06:53:12 來源:網(wǎng)絡(luò) 閱讀:6035 作者:小旭ZX 欄目:網(wǎng)絡(luò)安全

之前一直在糾結(jié)什么是端口轉(zhuǎn)發(fā),現(xiàn)在寫下自己的理解,并試驗(yàn)本地端口,遠(yuǎn)程端口轉(zhuǎn)發(fā)

SSH(Secure Shell,安全外殼協(xié)議),在SSH的通道上傳輸數(shù)據(jù)都是通過加密的,每次連接SSH會執(zhí)行指紋核對來確認(rèn)用戶連接到正確的遠(yuǎn)程主機(jī)上,如果在其它協(xié)議的數(shù)據(jù)通過SSH端口進(jìn)行轉(zhuǎn)發(fā),SSH連接作為其它協(xié)議傳輸?shù)耐ǖ溃ㄋ淼溃?,這種方式也叫做SSH端口轉(zhuǎn)發(fā)或SSH隧道.

作用:加密數(shù)據(jù)傳輸、突破防火墻限制

分類:本地轉(zhuǎn)發(fā)、遠(yuǎn)程轉(zhuǎn)發(fā)、動態(tài)轉(zhuǎn)發(fā)


一、本地端口轉(zhuǎn)發(fā)

    本地轉(zhuǎn)發(fā)中的本地是指將本地的某個端口轉(zhuǎn)發(fā)到其他主機(jī)的某個端口,這樣當(dāng)我們的程序連接本地的這個端口時,其實(shí)間接連上了其他主機(jī)的某個端口,當(dāng)我們發(fā)數(shù)據(jù)包到這個端口時數(shù)據(jù)包就自動轉(zhuǎn)發(fā)到了那個遠(yuǎn)程端口上了

    命令語法:ssh -L [bind-address:]port:host:hostport server_address

解釋下:bind_address表示本地主機(jī)的ip(綁定地址),這是針對系統(tǒng)有多塊網(wǎng)卡,不指定默認(rèn)是127.0.0.1

              port:本地主機(jī)指定監(jiān)聽的端口

              host:遠(yuǎn)程主機(jī)的ip

              hostport:指定遠(yuǎn)程主機(jī)的端口,如果遠(yuǎn)程主機(jī)是HTTP,就是80,F(xiàn)TP(21)。。。

              server_address:遠(yuǎn)程主機(jī)的ip,也可以是能夠訪問到遠(yuǎn)程主機(jī)的另一個ip(我們通過實(shí)驗(yàn)來理解)

另外有幾個參數(shù)需要知道:

              -L:指定本地(客戶端)主機(jī)上的指定端口轉(zhuǎn)發(fā)到給定的遠(yuǎn)端的主機(jī)和端口

              -N:不執(zhí)行遠(yuǎn)程指令

              - f:放在后臺執(zhí)行


實(shí)驗(yàn):主機(jī)A(192.168.31.100)、主機(jī)B(192.168.31.150)、主機(jī)C(192.168.31.163)三臺主機(jī)

A、B、C都可以互相連接

    在主機(jī)A上執(zhí)行命令:# ssh -Nf -L 192.168.31.100:7900:192.168.31.163:22  192.168.31.150

這里需要注意的是本例中我們選擇了 7900 端口作為本地的監(jiān)聽端口,在選擇端口號時要注意非管理員帳號是無權(quán)綁定 1-1023 端口的,所以一般是選用一個 1024-65535 之間的并且尚未使用的端口號即可。

當(dāng)執(zhí)行完這條命令后,我們發(fā)現(xiàn)終端沒有反應(yīng),那是因?yàn)榉诺胶笈_執(zhí)行了,那我們怎么知道是否開啟了端口轉(zhuǎn)發(fā)?

    netstat -nt:列出tcp網(wǎng)絡(luò)數(shù)據(jù)的端口

    netstat -ntlp:列出系統(tǒng)已在監(jiān)聽的網(wǎng)絡(luò)連接端口及PID

SSH端口轉(zhuǎn)發(fā)的理解(精華)

上圖我們發(fā)現(xiàn),主機(jī)A的7900端口已被監(jiān)聽了,是被ssh(ssh就是客服端)監(jiān)聽的,和192.168.31.150(主機(jī)B)建立了一個SSH隧道,并且我們知道主機(jī)B和主機(jī)C是可以通信的,我們可以通過主機(jī)A的端口訪問時,其實(shí)就是間接用主機(jī)B在訪問,為了效果我們可以用主機(jī)C訪問主機(jī)A:(-p:是指定遠(yuǎn)程端口)

    在主機(jī)C上執(zhí)行:ssh 192.168.31.100 -p 7900(如果沒有隧道前,主機(jī)C登錄主機(jī)A時,登陸的ip肯定是主機(jī)C的ip,有了隧道后,通過主機(jī)A的端口和主機(jī)B建立的隧道,就是主機(jī)B在登錄的ip)

SSH端口轉(zhuǎn)發(fā)的理解(精華)

上面我們說到命令語法:ssh -L [bind-address:]port:host:hostport server_address

    server_address 可以和host不一樣,也可以一樣

# ssh -Nf -L 192.168.31.100:7900:192.168.31.163:22  192.168.31.163

    上面這條的意思是,“192.168.31.100”和“192.168.31.163”建立一個ssh隧道,

只要通過192.168.31.100這臺主機(jī)的“端口”訪問,就相當(dāng)于是192.168.31.163這臺主機(jī)在訪問


實(shí)驗(yàn)二:主機(jī)C(192.168.31.163)不允許主機(jī)A訪問,但是允許主機(jī)B訪問,通過ssh隧道實(shí)現(xiàn)A訪問C

搭建環(huán)境:在主機(jī)C上為了不讓主機(jī)A訪問,可以在/etc/hosts.deny這個配置文件中添加一行:“sshd:192.168.31.100”,加上主機(jī)A的ip即可SSH端口轉(zhuǎn)發(fā)的理解(精華),連接已被關(guān)閉

環(huán)境搭好了,我們在主機(jī)A上執(zhí)行:ssh -Nf -L 192.168.31.100:9000:192.168.31.163:22  192.168.31.163

隧道有了,我們在被拒絕訪問的主機(jī)A上執(zhí)行:ssh -p 9000 192.168.31.100(意思是連接主機(jī)A的9000端口,而9000端口又與主機(jī)B連成隧道,當(dāng)用主機(jī)A的9000端口訪問時,則是在用主機(jī)B訪問,所以主機(jī)A被禁止訪問也無妨)

最后需要提醒的是,如果想關(guān)閉某個ssh隧道,只能用kill殺死相關(guān)進(jìn)程,隧道被關(guān)閉后,指定的連接也會關(guān)閉。


二、遠(yuǎn)程端口轉(zhuǎn)發(fā)可以實(shí)現(xiàn)訪問內(nèi)網(wǎng)

SSH遠(yuǎn)程端口轉(zhuǎn)發(fā):

    遠(yuǎn)程轉(zhuǎn)發(fā)和本地很相似,原理也差不多,但是不同的是,本地轉(zhuǎn)發(fā)是在本地主機(jī)指定的一個端口,而遠(yuǎn)程轉(zhuǎn)發(fā)是在遠(yuǎn)程的主機(jī)上指定一個端口將指向該端口的連接轉(zhuǎn)發(fā)到本地端口。本質(zhì)一樣,區(qū)別在于需要轉(zhuǎn)發(fā)的端口是在遠(yuǎn)程主機(jī)上還是在本地主機(jī)山。

    但遠(yuǎn)程轉(zhuǎn)發(fā)使用的命令選項(xiàng)也不同:

    ssh -R [bind-address:]post:host:hostport server_address

這里需要注意的是:

              bind-address指定的是遠(yuǎn)程主機(jī)ip,不是本機(jī)

              port:遠(yuǎn)程主機(jī)指定監(jiān)聽的端口

              host:你需要訪問的主機(jī)

              hostport:指定被訪問主機(jī)的端口

              server_address:遠(yuǎn)程主機(jī)和誰?建立的隧道,指定誰



我們都知道內(nèi)網(wǎng)通過路由器(SNAT)可以訪問外網(wǎng),而外網(wǎng)是無法訪問到內(nèi)網(wǎng)的,我們利用ssh來實(shí)現(xiàn)訪問內(nèi)網(wǎng),要搭建這種環(huán)境,我首先想到的是VMware的NAT模式,我將主機(jī)C設(shè)置NAT模式

主機(jī)A:192.168.31.100(外網(wǎng))

主機(jī)B:192.168.31.150(外網(wǎng))

主機(jī)C:192.168.200.133(內(nèi)網(wǎng))


在主機(jī)C執(zhí)行命令:ssh -Nf -R 192.168.31.150:9000:192.168.200.133:22 192.168.31.150

netstat -nt:

SSH端口轉(zhuǎn)發(fā)的理解(精華)主機(jī)C已經(jīng)和192.168.31.150(主機(jī)B)建立好隧道了

這時你在主機(jī)C上執(zhí)行    netstat -ntlp 并沒有什么監(jiān)聽的9000端口,因?yàn)槟闶窃趯Ψ街鳈C(jī)上開的一個端口,你需要在主機(jī)B上執(zhí)行netstat -ntlp:

SSH端口轉(zhuǎn)發(fā)的理解(精華)

我們發(fā)現(xiàn),127.0.0.1:9000這是什么意思呢?這是說指本機(jī),并沒有隨便指定一個ip,那樣太危險,后面也變成sshd監(jiān)聽,就是ssh服務(wù)端,所以我們也叫 反向隧道。

在外網(wǎng)的主機(jī)B上執(zhí)行:ssh -p 9000 127.0.0.1

主要不再是ssh -p 9000 192.168.31.150了,完成

SSH端口轉(zhuǎn)發(fā)的理解(精華)







向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI