SSH隧道與端口轉發及內網穿透綁定本地端口

ssh是一種安全的傳輸協議,我一般使用就是在登陸服務器或遠端執行命令,最近我意識到這是個強大的命令。

開講~

本地ssh隧道

工作中由於防火牆導致訪問某些網站或某些ftp連接超時,有什麼解決辦法呢。ssh隧道就是一種解決方式。

首先你需要了解一些信息:

  1. 你自己的電腦不能訪問一個國外的ftp(10.10.10.10)。
  2. 你有一臺服務器(20.20.20.20),服務器可以訪問國外的ftp。
  3. 你和你的服務器是可以互通的。

你當然可以先連接到個人服務器進行文件下載後通過其他方式再放到本地,但low,這裏可以使用ssh的隧道功能來實現。先看命令

ssh -CfNg -L 21:10.10.10.10:21 20.20.20.20
ftp localhost:21 # 現在訪問本地21端口,就能連接10.10.10.10的21端口了
# 至此就可以連接下載了。

先對參數做說明:

  • -C:壓縮數據傳輸
  • -f:ssh客戶端在後臺執行
  • -N:不執行腳本或命令,僅進行端口轉發
  • -g:在-L/-R/-D參數中,允許遠程主機連接到建立的轉發的端口,如果不加這個參數,只允許本地主機建立連接。
  • -L:做本地映射端口,被冒號分割的三個部分含義分別是
    • 需要使用的本地端口號
    • 需要訪問的目標機器IP地址
    • 需要訪問的目標機器端口
  • 用來建立隧道的中間機器的IP地址

遠程ssh隧道

由於公司內網機器使用公共的路由器出口進行上網,由於公司內部的設備沒有自己的公網ip地址,所有也是個問題,但是ssh也能解決。

首先你需要有一些支持:

  • 擁有一臺有外網IP的服務器(20.20.20.20)。(這就夠了)

先上命令:

ssh -p 1207 -CfNg -R 2222:127.0.0.1:22 [email protected]
# 該命令在內網機執行
  • -R:該參數的三個部分的含義分別是
    • 映射到遠程機器使用的端口(2222)
    • 需要映射的內部機器的IP地址(127.0.0.1)
    • 需要映射的內部機器的端口(22)
  • 最後的參數是外網連接的服務器。

很簡單。基本都瞭解了。

ssh 隧道建立socket服務

如果我們需要藉助一臺中間服務器訪問很多資源,一個個映射顯然不是高明的辦法。幸好,SSH客戶端爲我們提供了通過SSH隧道建立SOCKS服務器的功能。

通過下面的命令我們可以建立一個通過20.20.20.20的SOCKS服務器。

ssh -N -f -D 1080 20.20.20.20 # 將端口綁定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 20.20.20.20 # 將端口綁定在0.0.0.0上

ssh隧道使用問題及解決辦法

自動重連

隧道可能因爲某些原因斷開,例如重啓,長時間沒有數據通信而被路由器切斷等等。因此我們可以使用簡單的循環或supervisor來控制隧道的重新連接。重連時要避免要求輸入密碼而卡死程序,對於密碼登陸可以採用sshpass或免密登陸方式。如果通過其他程序控制隧道連接,應當避免將SSH客戶端放到後臺執行,也就是去掉-f參數。

保持長連接

有些路由器會把長時間沒有通信的連接斷開。SSH客戶端的TCPKeepAlive選項可以避免這個問題的發生,默認情況下它是被開啓的。如果它被關閉了,可以在ssh的命令上加上-o TCPKeepAlive=yes來開啓。

另一種方法是,去掉-N參數,加入一個定期能產生輸出的命令。例如: top或者vmstat。

ssh -R 2222:localhost:22 [email protected] "vmstat 30"

檢查隧道狀態

有些時候隧道會因爲一些原因通信不暢而卡死,例如:由於傳輸數據量太大,被路由器帶入stalled狀態。這種時候,往往SSH客戶端並不退出,而是卡死在那裏。一種應對方法是,使用SSH客戶端的ServerAliveInterval和ServerAliveCountMax選項。 ServerAliveInterval會在隧道無通信後的一段設置好的時間後發送一個請求給服務器要求服務器響應。如果服務器在 ServerAliveCountMax次請求後都沒能響應,那麼SSH客戶端就自動斷開連接並退出,將控制權交給你的監控程序。這兩個選項的設置方法分別是在ssh時加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定義。

如果將ip綁定到外網地址上

使用上面的方法,映射的端口只能綁定在127.0.0.1這個接口上。也就是說,只能被本機自己訪問到。如何才能讓其他機器訪問這個端口呢?我們可以把這個映射的端口綁定在0.0.0.0的接口上,方法是加上參數-b 0.0.0.0。同時還需要打開SSH服務器端的一個選項-GatewayPorts。默認情況下它應當是被打開的。如果被關閉的話,可以在/etc /sshd_config中修改GatewayPorts no爲GatewayPorts yes來打開它。

~很煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章