[Linux] SSH Tunnel

前情提要
由於中華電信最近除了海底纜線斷掉之外,連內部路由都有問題,造成部分用戶的 socket 會連不到我們架設的伺服器,於是想到把自建的 socket server 從機房中複製一份到 GCP 上面。

但由於安全性的問題,資料庫是在機房內網,且沒有對外 IP,還有 redis 也是在機房內網,同樣沒有對外 IP,這時候該怎麼辦?

厲害同事介紹了一招,SSH Tunnel。

SSH Tunnel 單純就是幫忙做 Port Forwarding。
假設我現在我有台主機 A,需要連線到內網的資料庫,但只有主機 B 才可以直接透過內網連線到資料庫,則我們可以透過 SSH Tunnel 將內網資料庫的 3306 port,對應到主機 A 的自定義 port,流量則是透過主機 B 轉給內網的資料庫。

定義一下名詞:
主機 A => socket server
主機 B => ap
資料庫 => db

1. 先在 db 內開一個專門用來 ssh 的帳號,假設叫 tunneluser

2. 在 db 開的 tunneruser 的 ~/.ssh/authorized_keys 內新增 socket server 的 public key

3. 在 ap 內開一個專門用來 ssh 的帳號,假設叫 tunneluser

4. 在 ap 開的 tunneruser 的 ~/.ssh/authorized_keys 內新增 socket server 的 public key

5. 接下來在 socket server 上的 ~/.ssh/config內新增

Host ap
HostName 1.2.3.4
User tunneluser
Port 22
IdentityFile ~/.ssh/id_rsa

Host db
HostName 2.2.3.4
Port 22
User tunneluser
ProxyCommand ssh -q -W %h:%p ap
IdentityFile ~/.ssh/id_rsa

6. 接著在 socket server 中輸入
nohup ssh -N -L 3306:localhost:3306 db &
nohup 跟後面的 & 是為了把 ssh tunnel 放在背景持續執行
第一個 3306 是 socket server 的 port
中間的 localhost 指的也是 socket server 本身
最後的 3306 是 db 的 3306 port

這樣基本上就大功告成
如果要測試看看
可以先在 socket server 上面裝 mysql-client
用 mysql -u 帳號 -p
如果有成功連到遠端,就是成功囉!




留言

這個網誌中的熱門文章

[翻譯] 介紹現代網路負載平衡與代理伺服器

Grafana K6

Linux 事件驅動筆記