最近一直在使用ssh協議的端口轉發(隧道)功能,完成對內網空透等。這篇文章將主要講解3種經常使用的ssh tunnelling使用方法和基本原理。html
在介紹具體內容前,我先奉上端口轉發的經常使用情景:web
圖中的「我」,如今是要訪問內部網站的192.168.1.0/24網段裏面的服務器,然而因爲不在一個網段,我是不能夠直接ssh到內部網絡的服務器。vim
一般的作法是先ssh到「SSH Server」,而後再在ssh server上訪問內部網站的服務器服務器
我能不能不用上ssh server就直接ssh到內部服務器呢?從下面的文章你將獲得答案。網絡
SSH 端口轉發主要有3種方式:ssh
格式以下:網站
ssh -L [bind_address:]port:host:hostport <user>@<ssh server>
如上圖我如今要直接訪問IP地址爲192.168.1.2的服務器,能夠在本地(SSH Client)這樣作:spa
Step 1:代理
ssh -N -L 11122:192.168.1.2:22 peter@10.1.1.1
或者:rest
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