您好,登錄后才能下訂單哦!
之前一直在糾結什么是端口轉發,現在寫下自己的理解,并試驗本地端口,遠程端口轉發
SSH(Secure Shell,安全外殼協議),在SSH的通道上傳輸數據都是通過加密的,每次連接SSH會執行指紋核對來確認用戶連接到正確的遠程主機上,如果在其它協議的數據通過SSH端口進行轉發,SSH連接作為其它協議傳輸的通道(隧道),這種方式也叫做SSH端口轉發或SSH隧道.
作用:加密數據傳輸、突破防火墻限制
分類:本地轉發、遠程轉發、動態轉發
一、本地端口轉發
本地轉發中的本地是指將本地的某個端口轉發到其他主機的某個端口,這樣當我們的程序連接本地的這個端口時,其實間接連上了其他主機的某個端口,當我們發數據包到這個端口時數據包就自動轉發到了那個遠程端口上了
命令語法:ssh -L [bind-address:]port:host:hostport server_address
解釋下:bind_address表示本地主機的ip(綁定地址),這是針對系統有多塊網卡,不指定默認是127.0.0.1
port:本地主機指定監聽的端口
host:遠程主機的ip
hostport:指定遠程主機的端口,如果遠程主機是HTTP,就是80,FTP(21)。。。
server_address:遠程主機的ip,也可以是能夠訪問到遠程主機的另一個ip(我們通過實驗來理解)
另外有幾個參數需要知道:
-L:指定本地(客戶端)主機上的指定端口轉發到給定的遠端的主機和端口
-N:不執行遠程指令
- f:放在后臺執行
實驗:主機A(192.168.31.100)、主機B(192.168.31.150)、主機C(192.168.31.163)三臺主機
A、B、C都可以互相連接
在主機A上執行命令:# ssh -Nf -L 192.168.31.100:7900:192.168.31.163:22 192.168.31.150
這里需要注意的是本例中我們選擇了 7900 端口作為本地的監聽端口,在選擇端口號時要注意非管理員帳號是無權綁定 1-1023 端口的,所以一般是選用一個 1024-65535 之間的并且尚未使用的端口號即可。
當執行完這條命令后,我們發現終端沒有反應,那是因為放到后臺執行了,那我們怎么知道是否開啟了端口轉發?
netstat -nt:列出tcp網絡數據的端口
netstat -ntlp:列出系統已在監聽的網絡連接端口及PID
上圖我們發現,主機A的7900端口已被監聽了,是被ssh(ssh就是客服端)監聽的,和192.168.31.150(主機B)建立了一個SSH隧道,并且我們知道主機B和主機C是可以通信的,我們可以通過主機A的端口訪問時,其實就是間接用主機B在訪問,為了效果我們可以用主機C訪問主機A:(-p:是指定遠程端口)
在主機C上執行:ssh 192.168.31.100 -p 7900(如果沒有隧道前,主機C登錄主機A時,登陸的ip肯定是主機C的ip,有了隧道后,通過主機A的端口和主機B建立的隧道,就是主機B在登錄的ip)
上面我們說到命令語法: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這臺主機的“端口”訪問,就相當于是192.168.31.163這臺主機在訪問
實驗二:主機C(192.168.31.163)不允許主機A訪問,但是允許主機B訪問,通過ssh隧道實現A訪問C
搭建環境:在主機C上為了不讓主機A訪問,可以在/etc/hosts.deny這個配置文件中添加一行:“sshd:192.168.31.100”,加上主機A的ip即可,連接已被關閉
環境搭好了,我們在主機A上執行:ssh -Nf -L 192.168.31.100:9000:192.168.31.163:22 192.168.31.163
隧道有了,我們在被拒絕訪問的主機A上執行:ssh -p 9000 192.168.31.100(意思是連接主機A的9000端口,而9000端口又與主機B連成隧道,當用主機A的9000端口訪問時,則是在用主機B訪問,所以主機A被禁止訪問也無妨)
最后需要提醒的是,如果想關閉某個ssh隧道,只能用kill殺死相關進程,隧道被關閉后,指定的連接也會關閉。
二、遠程端口轉發可以實現訪問內網
SSH遠程端口轉發:
遠程轉發和本地很相似,原理也差不多,但是不同的是,本地轉發是在本地主機指定的一個端口,而遠程轉發是在遠程的主機上指定一個端口將指向該端口的連接轉發到本地端口。本質一樣,區別在于需要轉發的端口是在遠程主機上還是在本地主機山。
但遠程轉發使用的命令選項也不同:
ssh -R [bind-address:]post:host:hostport server_address
這里需要注意的是:
bind-address指定的是遠程主機ip,不是本機
port:遠程主機指定監聽的端口
host:你需要訪問的主機
hostport:指定被訪問主機的端口
server_address:遠程主機和誰?建立的隧道,指定誰
我們都知道內網通過路由器(SNAT)可以訪問外網,而外網是無法訪問到內網的,我們利用ssh來實現訪問內網,要搭建這種環境,我首先想到的是VMware的NAT模式,我將主機C設置NAT模式
主機A:192.168.31.100(外網)
主機B:192.168.31.150(外網)
主機C:192.168.200.133(內網)
在主機C執行命令:ssh -Nf -R 192.168.31.150:9000:192.168.200.133:22 192.168.31.150
netstat -nt:
主機C已經和192.168.31.150(主機B)建立好隧道了
這時你在主機C上執行 netstat -ntlp 并沒有什么監聽的9000端口,因為你是在對方主機上開的一個端口,你需要在主機B上執行netstat -ntlp:
我們發現,127.0.0.1:9000這是什么意思呢?這是說指本機,并沒有隨便指定一個ip,那樣太危險,后面也變成sshd監聽,就是ssh服務端,所以我們也叫 反向隧道。
在外網的主機B上執行:ssh -p 9000 127.0.0.1
主要不再是ssh -p 9000 192.168.31.150了,完成
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。