【前言】
最近一直在使用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