Linux – 設定 SSH Tunneling (Port Forwarding)

什麼是 SSH Tunneling (Port Forwarding)?

SSH Tunneling 是網路上的 A、B 兩點形成一個「隧道」,讓兩端能夠穿透某些限制(Ex. 防火牆),或是能將其傳輸內容加密。而 SSH Tunneling 在有開放 SSH port (預設阜號 22) 下可以順利進行,就好像是雪山隧道一樣(不受山脈限制穿透臺北與宜蘭兩地) ~

  • Note SSH Tunneling 將 A 點的 Port 轉發給 B 點 Port ,所以又稱為 SSH Port Forwarding

SSH Tunneling ( Port Forwarding ) 三種模式:

  1. Local Port Forwarding
  2. Remote Port Forwarding
  3. Dynamic Port Forwarding

1. Local Port Forwarding 轉發模式

1.1 基本指令

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER]@SSH_SERVER

1.2 使用情境

目標伺服器 (Server) 防火牆只有開放 SSH 22 阜號其餘均關閉,想要訪問該目標 8088 服務。

此時可以透過 Local Port Forwarding 轉發功能將伺服器端的 8088 port 服務透過 SSH (22 port) 隧道傳遞,並在 Client 使用 9453 port (可任意選擇沒有使用的 Port) 讀取該服務。

1.3 使用指令

ssh -L 9453:127.0.0.1:8088 [USER]@SSH_SERVER
  • Note
      1. Client 可以透過瀏覽器輸入 127.0.0.1:9453 訪問服務
      1. LOCAL_IP 可以不填寫,預設就是 127.0.0.1 ,如要開啟給別的人訪問轉發的服務,將 LOCAL_IP 改為 0.0.0.0 即可。

2. Remote Port Forwarding 轉發模式

2.1 基本指令

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER]@SSH_SERVER

2.2 使用情境

伺服器( server ) 防火牆只有開放 SSH 22 阜號其餘均關閉,伺服器( server )反相要訪問 Client 啟動的 8088 服務。

此時可以透過 Remote Port Forwarding 轉發功能將 Client 端的 8088 port 服務透過 SSH (22 port) 隧道傳遞,並在 Server 使用 9453 port (可任意選擇沒有使用的 Port) 讀取該服務。

2.3 使用指令

ssh -R 9453:127.0.0.1:8088 [USER]@SSH_SERVER
  • Note
    • Server 端可以透過 curl 127.0.0.1:9453 訪問服務

2.4 進階使用(透過 Server 端分享轉發 Client 服務出去)

在 Server 使用 Nginx 反向代理 9453 port 至 80 port (防火牆開放 80 port) , 就可以透過外部網路訪問 Client 8080 服務。

  • Question
    • 問什麼不直接開啟 Server 防火牆 9453 Port ,讓外部網路訪問就好了,何必再透過 Nginx 多繞一圈呢?
      • 因為 ssh 安全機制,預設在 Server 端只能透過 Localhost 訪問,故需透 Nginx 多一層代理。
      • 如果要強迫關閉該安全機制,需要在 Server 端的 /etc/ssh/sshd_config 配置檔內的 GatewayPorts 改成 yes (非常不安全,建議不使用此方案)

3 Dynamic Port Forwarding

3.1 基本指令

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER]@SSH_SERVER

3.2 使用情境

在 SSH Server 上啟動一個 SOCKS 代理伺服器,簡單的來說就是讓 Sever 變成自己的代理伺服器,可以來瀏覽網頁隱藏自己的真實IP以及跳板至其他國家 (VPN的概念)

3.3 使用指令

  1. 客戶端輸入
ssh -D 127.0.0.1:9453 [USER]@SSH_SERVER
  1. 修改瀏覽器 Proxy socks (以 Firefox 為例)

  1. 瀏覽器就能快樂的訪問 ( 跳到日本的伺服器 )


進階小技巧,主廚私房菜

  • 轉發常用的 SSH 指令參數

    • -N 不要執行任何遠端指令。
    • -f 讓 ssh 指令在背景執行,讓你可以繼續用 Shell 做事情。通常會搭上面的 -N 使用。

結論

  • Local 跟 Remote Forwarding 的差異主要在 Port 開啟的地方,一個是客戶端向伺服器端請求資料,另一個者反之;另外 Dynamic Port Forwarding 就是常用的 Proxy 的功能。

  • 透過上述的教學,是不是就能感受的 SSH Tunneling 特別的強大好用,容易操作又能有效的達成目的,還不快點來試試康 ~~~~

Similar Posts