一、本地ssh隧道
使用場(chǎng)景:工作中由于防火墻導(dǎo)致訪問某些網(wǎng)站或某些FTP等資源連接超時(shí),有什么解決辦法呢。SSH隧道就是一種解決方式。
具備條件:
- 自已PC,自己PC不能訪問但是又想訪問的FTP服務(wù)器,IP:8.8.8.8。
- 遠(yuǎn)程PC,IP:1.1.1.1,遠(yuǎn)程PC可以訪問國(guó)外的FTP。
- 你自已的PC能夠訪問遠(yuǎn)程的PC。
你當(dāng)然可以先連接到個(gè)人服務(wù)器進(jìn)行文件下載后通過其他方式再放到本地,但是這樣是不是覺得比較low,這里可以使用ssh的隧道功能來實(shí)現(xiàn)。
<<<<<<<一頓操作猛如虎>>>>>>>
執(zhí)行如下命令:
# ssh -CfNg -L 需要使用的本地端口號(hào):需要訪問的目標(biāo)機(jī)器IP地址:需要訪問的目標(biāo)機(jī)器端口 用來建立隧道的中間機(jī)器的IP地址
ssh -CfNg -L 21:8.8.8.8:21 1.1.1.1
# 至此就可以通過訪問本地21端口,就能連接8.8.8.8的21端口了
ftp localhost:21
SSH參數(shù)做說明:
-C:壓縮數(shù)據(jù)傳輸
-f:ssh客戶端在后臺(tái)執(zhí)行
-N:不執(zhí)行腳本或命令,僅進(jìn)行端口轉(zhuǎn)發(fā)
-g:在-L/-R/-D參數(shù)中,允許遠(yuǎn)程主機(jī)連接到建立的轉(zhuǎn)發(fā)的端口,如果不加這個(gè)參數(shù),只允許本地主機(jī)建立連接。
-L:做本地映射端口,被冒號(hào)分割的三個(gè)部分含義分別是
二、遠(yuǎn)程ssh隧道
使用場(chǎng)景:由于公司內(nèi)網(wǎng)機(jī)器使用公共的路由器出口進(jìn)行上網(wǎng),由于公司內(nèi)部的設(shè)備沒有自己的公網(wǎng)ip地址,所有也是個(gè)問題,但是SSH也能解決。
唯一條件:
能夠訪問外網(wǎng)IP的服務(wù)器(1.1.1.1)
執(zhí)行如下命令:
# 該命令在內(nèi)網(wǎng)機(jī)執(zhí)行
# ssh -p 1207 -CfNg -R 映射到遠(yuǎn)程機(jī)器使用的端口:需要映射的內(nèi)部機(jī)器的IP地址:需要映射的內(nèi)部機(jī)器的端口 最后的參數(shù)是外網(wǎng)連接的服務(wù)器。
ssh -p 1207 -CfNg -R 2222:127.0.0.1:22 root@1.1.1.1
三、SSH隧道建立Socket服務(wù)
使用場(chǎng)景:我們需要通過借助一臺(tái)中間服務(wù)器訪問很多資源,一個(gè)個(gè)映射顯然很麻煩。幸好,SSH客戶端為我們提供了通過SSH隧道建立SOCKS服務(wù)器的功能。
通過下面的命令我們可以建立一個(gè)通過1.1.1.1的SOCKS服務(wù)器。
ssh -N -f -D 1080 1.1.1.1 # 將端口綁定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 1.1.1.1 # 將端口綁定在0.0.0.0上
四、SSH隧道使用問題及解決辦法
1、自動(dòng)重連
隧道可能因?yàn)槟承┰驍嚅_,例如重啟,長(zhǎng)時(shí)間沒有數(shù)據(jù)通信而被路由器切斷等等。因此我們可以使用簡(jiǎn)單的循環(huán)或supervisor來控制隧道的重新連接。重連時(shí)要避免要求輸入密碼而卡死程序,對(duì)于密碼登陸可以采用sshpass或免密登陸方式。如果通過其他程序控制隧道連接,應(yīng)當(dāng)避免將SSH客戶端放到后臺(tái)執(zhí)行,也就是去掉-f參數(shù)。
2、保持長(zhǎng)連接
有些路由器會(huì)把長(zhǎng)時(shí)間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項(xiàng)可以避免這個(gè)問題的發(fā)生,默認(rèn)情況下它是被開啟的。如果它被關(guān)閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啟。
另一種方法是,去掉-N參數(shù),加入一個(gè)定期能產(chǎn)生輸出的命令。例如: top或者vmstat。
ssh -R 2222:localhost:22 root@1.1.1.1 "vmstat 30"
3、檢查隧道狀態(tài)
有些時(shí)候隧道會(huì)因?yàn)橐恍┰蛲ㄐ挪粫扯ㄋ溃纾河捎趥鬏敂?shù)據(jù)量太大,被路由器帶入stalled狀態(tài)。這種時(shí)候,往往SSH客戶端并不退出,而是卡死在那里。一種應(yīng)對(duì)方法是,使用SSH客戶端的ServerAliveInterval和ServerAliveCountMax選項(xiàng)。 ServerAliveInterval會(huì)在隧道無通信后的一段設(shè)置好的時(shí)間后發(fā)送一個(gè)請(qǐng)求給服務(wù)器要求服務(wù)器響應(yīng)。如果服務(wù)器在 ServerAliveCountMax次請(qǐng)求后都沒能響應(yīng),那么SSH客戶端就自動(dòng)斷開連接并退出,將控制權(quán)交給你的監(jiān)控程序。這兩個(gè)選項(xiàng)的設(shè)置方法分別是在ssh時(shí)加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定義。
四、將ip綁定到外網(wǎng)地址上
使用上面的方法,映射的端口只能綁定在127.0.0.1這個(gè)接口上。也就是說,只能被本機(jī)自己訪問到。如何才能讓其他機(jī)器訪問這個(gè)端口呢?我們可以把這個(gè)映射的端口綁定在0.0.0.0的接口上,方法是加上參數(shù)-b 0.0.0.0。同時(shí)還需要打開SSH服務(wù)器端的一個(gè)選項(xiàng)-GatewayPorts。默認(rèn)情況下它應(yīng)當(dāng)是被打開的。如果被關(guān)閉的話,可以在/etc/sshd_config中修改GatewayPorts no為GatewayPorts yes來打開它。