標籤:

用ssh和socat分分鐘搞定Linux各種埠轉發

本地埠映射

小明寫了一個Web服務,監聽hosta上8080埠,小王現在想訪問這個服務,有沒有快速的方法?

其實很簡單,小明只需要做這兩件事情:

  1. 申請一台帶公網IP的公有雲伺服器hostb,我們假設ip地址是12.34.56.78
  2. 在hosta上執行下面的命令,它會建立一個從hosta到hostb的ssh會話,同時將8080埠映射到hostb的1080埠。

ssh -R 1080:localhost:8080 root@12.34.56.78

這樣,小王就可以愉快的用12.34.66.78:1080訪問小明的服務了。

遠程Unix Socket映射

除了將我們本地服務通過埠映射提供給其它人訪問,我們還可以通過埠轉發玩一些更high的。比如下面這條命令,它把監聽在遠程主機12.34.56.78上的mysql服務unix socket映射到本地的/var/run/mysqld.temp.sock,這樣,小明就可以用mysql -S /var/run/mysqld/mysqld.temp.sock來訪問遠程主機的mysql服務了。

socat "UNIX-LISTEN:/var/run/mysqld.temp.sock,reuseaddr,fork" EXEC:"ssh root@12.34.56.78 socat STDIO UNIX-CONNECT:/var/run/mysqld/mysqld.sock"

當然,小明如果不喜歡本地unix socket,他還可以用下面的命令把12.34.56.78上的mysql映射到本地的5500埠,然後使用mysql -p 5500命令訪問。

socat TCP-LISTEN:5500 EXEC:ssh root@12.34.56.78 "socat STDIO UNIX-CONNECT:/var/run/mysqld/mysqld.sock"

UDP也不在話下,比如下面這條命令可以把12.34.56.78的udp 161埠映射到本地的1611埠:

socat udp-listen:1611 system:ssh root@12.34.56.78 "socat stdio udp-connect:remotetarget:161"

上面代碼和使用方法,我都已經上傳到我的github


推薦閱讀:

關於固態硬碟的定址原理和定址速度的一個疑問?
現在的 Linux 內核和 Linux 2.6 的內核有多大區別?
Linux 下進行 PHP 開發,相比 Windows 環境有哪些好處?
Ubuntu 系統下有哪些整理硬碟的工具?

TAG:SSH | Linux |