有時會因為安全性的關係,一些資源像是資料庫或是 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 forwarding0.0.0.0:local-port
:將 port 綁定在 0.0.0.0 的 local-port 上target-server:target-port
:在 proxy-server 上要連線時的目標伺服器時的 domain 以及 portusername@proxy-server
:ssh 連線到要幫忙轉發的代理伺服器
列出目前有的 SSH tunnel
lsof -i -n | egrep '\<ssh\>'
使用 SSH Tunnel 連線 Mysql 資料庫
假設在 develop-server 可以直接連線到 mysql-server 這個資料庫
而從 develop-server 連線到 mysql-server 的 domain 與 port 是 mysql-server
及 3306
- 開啟 ssh 通道連至遠端的伺服器幫忙 forward 到
mysql-server
的 3306 port,並綁定在 local 的 13236 上
ssh -N -L 0.0.0.0:13236:mysql-server:3306 username@develop-server
- 直接使用 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
- 開啟 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
- 使用瀏覽器或者是 postman 開啟 8080 port
http://localhost:8080