基於SSH協議的端口轉發


【前言】

最近一直在使用ssh協議的端口轉發(隧道)功能,完成對內網空透等。這篇文章將主要講解3種常用的ssh tunnelling使用方法和基本原理。

在介紹具體內容前,我先奉上端口轉發的常用情景:

圖中的“我”,現在是要訪問內部網站的192.168.1.0/24網段里面的服務器,然而由於不在一個網段,我是不可以直接ssh到內部網絡的服務器。

通常的做法是先ssh到“SSH Server”,然后再在ssh server上訪問內部網站的服務器

我能不能不用上ssh server就直接ssh到內部服務器呢?從下面的文章你將得到答案。

 

SSH 端口轉發主要有3種方式:

  • 本地端口轉發

格式如下:

ssh -L [bind_address:]port:host:hostport <user>@<ssh server>

如上圖我現在要直接訪問IP地址為192.168.1.2的服務器,可以在本地(SSH Client)這樣做:

Step 1:

 

ssh -N -L 11122:192.168.1.2:22 peter@10.1.1.1

或者:

ssh -N -L 10.10.10.10:11122:192.168.1.2:22 peter@10.1.1.1
# 如果你想綁定本機特定的IP可以在port前加上IP地址,如上面的10.10.10.10

注意:peter是SSH Server上的一個用戶名,“-N” 表示不執行命令,也就是不登錄到SSH Server上去。

輸入SSH Server密碼,命令會等在那,不要結束這個就行

Step 2:

 

ssh -p 11122 <192.168.1.2的用戶名>@127.0.0.1

或者:

ssh -p 11122 <192.168.1.2的用戶名>@10.10.10.10

 

輸入192.168.1.2服務器的密碼,就登錄了內部網絡的192.168.1.2的機器了。

原理分析:

當你執行Step 1的命令時,ssh client程序會在本地監聽指定的11122端口,你可以通過下面命令看到

netstat -ntlp |grep 11122

然后我們在Step 2中,我們ssh其實連接的是本地的11122端口,ssh client程序會幫我們轉發到SSH Server的,然后SSH Server再幫我們轉發到我們指定的192.168.1.2上的22端口


 

  • 遠程端口轉發

格式如下:

ssh -R [bind_address:]port:host:hostport <user>@<ssh server>

與 “本地端口轉發”最大的不同是,這個命令后,綁定的端口不在是本地的端口,而是SSH Server(10.1.1.1/192.168.1.1)上的端口

注意:由於默認配置下,遠程SSH Server只能綁定到127.0.0.1地址上,所以SSH Server以外的機器是不能使用到這個端口轉發的,解決方法:

用sudo權限打開SSH Server上的/etc/ssh/sshd_config: sudo vim /etc/ssh/sshd_config ,加入 

GatewayPorts yes

然后重啟ssh service: sudo service ssh restart

Step 1:

ssh -N -R *:11122:10.10.10.11:22 peter@10.1.1.1

*是用來表示使用SSH Server的所有地址,你也可以使用10.1.1.1這個地址,其中10.10.10.11是我上圖 SSH Client同網絡的其他客戶端機器的IP.

Step 2:

ssh -p 11122 <192.168.1.2上的用戶>@10.1.1.1

注意,跟本地端口轉發不同的是,上面的地址和端口都是遠程SSH Server的。

192.168.1.X 網絡的機器就通過gateway與ssh client之間的SSH隧道訪問到了10.10.10.X網絡的IP:10.10.10.11

 

  • 動態端口轉發

格式如下:

ssh -D [bind_address:]port <user>@<ssh server>

 

前面我介紹的兩種方式都有一個比較大的問題,只能做到點對點的代理,或者說一個主機的port到另一個主機port上的映射,

動態端口就是用來解決這個問題的,完成從點到面的代理,或者說完成本機一個port到任意遠程地址和端口的映射

一個比較典型的應用就是web代理服務器,下面我們准備把SSH Server變成一個web代理服務器

Step 1:

ssh -N -D 3456 peter@10.1.1.1

注意:現在SSH Client的3456就被用來轉發http請求了

Step 2:

 設置Firefox使用本地127.0.0.1的3456端口來做http代理,如下圖設置:


 注意上圖,一定要選擇SOCK5 或者SOCK4,因為ssh只能作為SOCK主機而不是一般的HTTP主機代理

這樣,我們就可以使用SSH Server的代理,用Firefox來訪問所有的頁面了。

 

【結尾】

當然,上面所提到的SSH Client,不一定要Linux主機,也可以是Windows裝上putty等ssh客戶端,具體設置是,打開putty設置 Connecction->SSH->Tunnels,相信你只要理解上面的內容,設置putty是很簡單的事。

如果putty設置有什么問題,可以留言,一起探討。

 


 

參考文章:

https://mikeash.com/ssh_socks.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM