懂點網路還有SSH的人就是很吃香,因為懂個幾招就可以突破網管暢行無阻!非常久之前已經介紹過SSH Tunnel的使用,前陣子FACEBOOK爆紅的時候,SSH Tunnel的使用也開始爆紅了起來,因為似乎沒有什麼事情比偷菜更重要了!因此我想若懂得SSH Tunnel的人應該也很熟悉了!(建議先閱讀:資訊安全 - SSH Tunnel 帶你遨遊,包含防火牆PREROUTING轉port的技巧)

ssh tunnel.gif

就我自己使用ssh tunnel的經驗來看,沒有使用之前光看介紹也是糊里糊塗,唯有使用過後就能更能了解運作原理,使用起來就會很順手!而ssh tunnel其實還有更進階的運用,這條無敵通道打通之後,除了可以單向的從這條通道出去之外,當然也應該可以反向的連回來,之前我對於反向這一塊很不熟悉,但是試了一次就懂了,這也就是說我可以毫無限制的連回到區網,相對的也代表這條tunnel就是一個危機,若是心臟不夠大顆絕對不推薦使用!
reverse tunnel.gif

【再次警告!這將成為公司內部的大漏洞,很多風險可能不是你可以承擔的】

就如上圖所表示的一樣,若你已經有能力建立一條ssh tunnel到外面的主機,那麼你就絕對有辦法從外面的主機連回區域網路,這該怎麼做呢?

ssh -NfR 遠端主機listen port:遠端連回時導向的主機:遠端連回本地主機時導向主機的port 帳號@遠端主機

ssh參數解釋:
-N:不執行任何指令
-f:背景執行
-R:主要建立reverse tunnel的參數
測試的時候其實不建議加上-N與-f的參數^^

範例環境:
區域網路主機:
ServerA / Linux / user userA / ip 192.168.0.123 / ssh port 22
ServerB / Linux / user userB / ip 192.168.0.125 / ssh port 22
PC / Windows / ip 192.168.0.128 / 遠端桌面 port 3389
遠端主機:
MyServer / Linux / user me / ip 1.2.3.4 / ssh port 22

範例1:從MyServer ssh連回ServerA
[userA@ServerA] $ ssh -NfR 2222:localhost:22 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep 127.0.0.1
tcp        0      0 127.0.0.1:2222              0.0.0.0:*                   LISTEN 
[me@MyServer] $ ssh userA@127.0.0.1 -p 2222
MyServer連線到本機2222 port會導向到ServerA的ssh port,成功連線到ServerA

範例2:從MyServer ssh連回ServerB
[userA@ServerA] $ ssh -NfR 2244:192.168.0.125:22 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep 127.0.0.1
tcp        0      0 127.0.0.1:2244              0.0.0.0:*                   LISTEN 
[me@MyServer] $ ssh userB@127.0.0.1 -p 2244
MyServer連線到本機2244 port會導向到ServerB的ssh port,成功連線到ServerB

範例3:從MyServer遠端桌面PC
[userA@ServerA] $ ssh -NfR 2266:192.168.0.128:3389 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep 127.0.0.1
tcp        0      0 127.0.0.1:2266              0.0.0.0:*                   LISTEN 
[me@MyServer] $ rdesktop 127.0.0.1:2266
若你在Linux的桌面環境則可以直接display遠端桌面PC的連線,不然就export DISPLAY到其他主機。

沒有覺得很難懂?自己做一次或許就知道囉!透過Linux連線出去,若是這條tunnel斷了線,就絕對無法再從外部連線了,因此為了要預防ssh tunnel斷線,第一種方式請在.ssh/config內加入「serveraliveinterval 60」保持KeepAlive連線;第二種可以透過autossh幫忙維持連線,若有任何斷線會再自動幫忙連線。

autossh 官方網站:http://www.harding.motd.ca/autossh/

autossh.gif

編譯的方式不再多說,簡單的「./configure && make && make install」就可以完成安裝。

autossh使用方式:

套用在上面的範例1:從MyServer ssh連回ServerA
[userA@ServerA] $ autossh -M 12345 -NfR 2222:localhost:22 me@MyServer

12345是隨機指定的,不管在MyServer或是ServerA都會Listen,連上之後可以測試砍掉MyServer上的ServerA的連線,autossh會自動在ServerA上重新連線,就是透過autossh保持tunnel永遠不斷線。

不透過ssh的command,直接利用ssh連線工具也可以達到反向tunnel的建立,拿上面的範例3做示範。

putty與pietty的方式
putty.gif

Xshell的方式
xshell.gif

有沒有看了滿頭霧水的感覺?其實我一開始也是滿頭霧水,但是實際做一次之後,我想你會更了解,轉換成自己的心得寫下筆記,就像我寫部落格成為備忘一樣,我想這會對reverse tunnel(反向tunnel)有更清楚的認識!若有問題在彼此切磋吧!
更多資訊請參考:
最新超值旗艦機開箱
比螺旋燈泡還省電的迷你 NAS
26800mAh筆電行動電源