Contents

Linux - 設定 SSH Tunneling (Port Forwarding)

SSH Tunneling (Port Forwarding) 是創建一個加密的隧道在客戶端與伺服器端之間,任何服務阜號均能轉發,可以在防火牆下也能順利通關。

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

https://i.imgur.com/LFg81A6.png

SSH Tunneling ( Port Forwarding ) 三種模式:

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

1. Local Port Forwarding 轉發模式

1.1 基本指令

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

1.2 使用情境

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

https://i.imgur.com/PVpqotS.png

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

https://i.imgur.com/jnS3q4J.png

1.3 使用指令

1
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 基本指令

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

2.2 使用情境

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

https://i.imgur.com/IcIzcJp.png

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

https://i.imgur.com/rOX4HoN.png

2.3 使用指令

1
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 服務。

https://i.imgur.com/MKYXHm6.png

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

3 Dynamic Port Forwarding

3.1 基本指令

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

3.2 使用情境

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

3.3 使用指令

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

https://i.imgur.com/3LKaJUT.png

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

https://i.imgur.com/0Onj9oF.png


進階小技巧,主廚私房菜

  • 轉發常用的 SSH 指令參數

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

結論

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

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



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!