SSH Secure tunnel forwarding

在 SSH 連線有一個 Secure Tuunel (加密通道)方式,

可以將 local 與remote server 之間建立一條 secure tunneling 通道。

這通道的方向可以是 local -> server 或者 server -> local。

首先關於 local to server 以 L (left) 表示, server to local 以 R (right) 表示。

其中在通道的傳輸都是透過 SSH 22port 來做 proxy,以下會再舉例說明:

本地 local 導入遠端端口服務

ssh -L 可以讓我們方便在本地就可以使用到遠端server 的服務。

建立的方式如下:

ssh -L [local_port]:[remore_host]:[remote_port] sshuser@serverip

或者

SSH -L [localhost:]port:remore_host:hostport

舉例來說,在我們本地端的 3306 希望導向 hello.org 的 3308,此時會透過 local 的 3306 port 透過 local 22 port 傳送到 server 的 22 port ,再傳送到 hello.org 的 3308 port,在本地的 localhost:3306 就會等同對應到 hello.org:3308 port:

ssh -L 3306:hello.org:3308 sshuser@serverip

我們可以在透過 netstat -ntlp 確認 port 是否已連接,移除連線最簡單可透過 top 找出 process 進行 PID kill 。

遠端主機導入本地 local 端口服務連線

ssh -R 可以反方向,由地端的服務端口導向遠端主機,讓遠端主機可以使的本地指定端口的服務。

建立的方式如下:

ssh -R [remote_port]:[localhost]:[local_port] sshuser@serverip

例如,我們希望將 server 的 80 導向本地的 8081,假設 server 80 有對外開放,則外面的人就可以透過 server 80 port 來訪問到本地 8081 的服務。

ssh -R 80:localhost:8081 sshuser@serverip

範例:本地連結遠端 Reids

Tunnle, SSH 來建立隧道並連接到跳板機時,你的終端會出現在跳板機上的 shell,這是正常行為。SSH 隧道依然在後台運行,允許你從你的本地機器通過指定的本地端口(在這個例子中是 6379)

ssh -L 本地端口:目標Redis主機:目標Redis端口 你的SSH用戶名@跳板機地址

ssh -L 6379:redis.jumpertoredishost:6379 jumperuser@site.jumperhost

如果想讓 SSH 連接在背景執行,可以添加 -f 選項。通常這會與 -N 一起使用,讓連接進入背景並不開啟遠端 shell。

//背景執行
ssh -f -N -L 6379:redis.jumpertoredishost:6379 jumperuser@site.jumperhost

連結成功後

隧道設置完成後,你可以在本地機器上測試連接到 Redis:

redis-cli -p 6379

如果使用 Redis CLI(ex. Another Reids Desktop Manager ) 直接連結 localhost:6379 即可