[教學] 透過 SSH Tunnel 將伺服器內部服務綁定到本機電腦上

有時會因為安全性的關係,一些資源像是資料庫或是 Internal API 會限制只有特定伺服器才能夠直接連線存取,無法從外部電腦直接存取,但是又想要在本機的電腦開發程式直接連線的話,這時候就能使用 SSH Tunnel 來透過 SSH 將資料從代理伺服器上的服務掛到自己電腦指定的 port 上,本篇將介紹 SSH Tunnel 以及教學如何使用。

SSH Tunnel 用途是開啟一個 SSH 通道連到代理伺服器,再透過代理伺服器連線到要目標伺服器上,在本機的電腦上對於該 port 的使用並不會有感覺有什麼不一樣,就像是直接連線到目標伺服器一樣,並且因為連線是透過 SSH 進行傳輸的,所以其中傳輸的資料是經過加密的。

使用指令開啟 SSH Tunnel

要開啟 SSH Tunnel 指令如下:

ssh -N -L 0.0.0.0:local-port:target-server:target-port username@proxy-server
  • -N:ssh 連線後不執行任何 command
  • -L:建立 Local forwarding
  • 0.0.0.0:local-port:將 port 綁定在 0.0.0.0 的 local-port 上
  • target-server:target-port:在 proxy-server 上要連線時的目標伺服器時的 domain 以及 port
  • username@proxy-server:ssh 連線到要幫忙轉發的代理伺服器

列出目前有的 SSH tunnel

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

使用 SSH Tunnel 連線 Mysql 資料庫

假設在 develop-server 可以直接連線到 mysql-server 這個資料庫

而從 develop-server 連線到 mysql-server 的 domain 與 port 是 mysql-server3306

  1. 開啟 ssh 通道連至遠端的伺服器幫忙 forward 到 mysql-server 的 3306 port,並綁定在 local 的 13236 上
ssh -N -L 0.0.0.0:13236:mysql-server:3306 username@develop-server
  1. 直接使用 mysql 連線綁定的 port
mysql -p --port=13236 -h 127.0.0.1 -u database_username

使用 SSH Tunnel 連線內部網頁或 API

假設目前 remote-server 可以直接連線到內部的 API internal-api-server

而現在想要在 local 使用 Postman 或者是瀏覽器直接瀏覽 internal-api-server 上的 API

  1. 開啟 ssh 通道連至遠端伺服器幫忙 forward 到 internal-api-server 的 80 port,並且綁定在 local 的 8080 port 上
ssh -N -L 0.0.0.0:8080:internal-api-server:80 username@remote-server
  1. 使用瀏覽器或者是 postman 開啟 8080 port
http://localhost:8080