ssh tunnel 連線 port 轉發

Ubuntu 系統網路 ssh 指令進行連線的本地端 ssh tunnel,將資料 port 轉發至遠端主機

有些主機會因為安全性的疑慮,所以關閉對外連線的 port,但如果我們可以透過 ssh 連線至主機時,可以透過 ssh tunnel

SSH Tunnel 指令

原理

=> SSH Tunnel 跳板(可以存取目標的主機) => 目標

指令

ssh -L <你的 port>:<目標 ip / dns>:<目標 port> <SSH Tunnel 跳板帳號>@<SSH Tunnel 跳板 ip / dns>

ssh -L <your-port>:<target-server-ip-or-dns>:<target-port> <ssh-tunnel-account>@<ssh-tunnel-ip-or-dns>

連線資料庫範例

ssh -L 33306:mysql.kejyun.com:3306 kj@mysql.kejyun.com

連線完成後,就可以在本地端透過 127.0.0.133306 port 連線至遠端的資料庫

連線網頁範例

ssh -L 8080:web.kejyun.com:80 kj@web.kejyun.com

連線完成後就可以在本地端透過 http://127.0.0.1:8080/ 連線至遠端網頁的 80 port

參數說明

說明 參數
建立本地端 port forwarding -L
背景執行 -f
不要執行遠端指令 -N

不要執行遠端指令並在背景執行範例

ssh -L 33306:mysql.kejyun.com:3306 -N -f kj@mysql.kejyun.com

SSH Tunnel 到不對外開放連線的主機

我們可能會有資料庫主機完全沒有對外連線,連 3306 port 都無法連線,但我們有允許其中一台 Web 主機可以連線至資料庫,我們可以 SSH Tunnel 至該 Web 主機,再連線至資料庫主機

我們允許主機 web.kejyun.com 可以連線至資料庫 mysql.kejyun.com,但資料庫 mysql.kejyun.com 主機是完全不對外開放的,可以使用 ssh 連線至 web.kejyun.com,再請求連線至資料庫 mysql.kejyun.com 主機,指令會像這樣

ssh -L <本地端 port>:<不對外開放資料庫主機 ip / dns>:<資料庫主機 port> <ssh 連線對外開放主機 ip / dns>

ssh -L 33306:mysql.kejyun.com:3306 -N -f kj@web.kejyun.com

除錯

列出目前所有 SSH Tunnel

lsof -i -n | egrep '\<ssh\>'

參考資料