[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
如果有成功連到遠端,就是成功囉!
留言
張貼留言