Deep Learning 101, Taiwan’s pioneering and highest deep learning meetup, launched on 2016/11/11 @ 83F, Taipei 101

AI是一條孤獨且充滿惶恐及未知的旅程,花俏絢麗的收費課程或活動絕非通往成功的捷徑。
衷心感謝當時來自不同單位的AI同好參與者實名分享的寶貴經驗;如欲移除資訊還請告知。
TonTon Huang Ph.D. 發起,及其當時任職公司(台灣雪豹科技)無償贊助場地及茶水點心。

Deep Learning 101 Buy Me A Coffee

去 YouTube 訂閱 | Facebook | 回 GitHub Pages | 到 GitHub 點星 | 網站 | 到 Hugging Face Space 按愛心


大語言模型 語音處理 自然語言處理 電腦視覺
Large Language Model Speech Processing Natural Language Processing, NLP Computer Vision

用 AI 懂 AI

AI 技術 體驗/分享

手把手帶你一起踩 AI 坑https://www.twman.org/AI


AI 技術 開源/試用

作者TonTon Huang Ph.D.
Blog2025年06月23日,用 Cloudflared 實作 SSH / HTTP / RDP Tunnel


用 Cloudflared 實作 SSH / HTTP / RDP Tunnel

Cloudflared Tunnel:不裸奔全面穿透 HTTP、SSH、RDP

傳統雲端主機的遠端連線方式,如開啟 GCP 公網固定 IP 並設防火牆 port(如 22、3389、443 等),雖然快速直接,但也潛藏著不少諸如被掃 port、暴力破解、VPN 管理不易、身份控管與審計困難等風險。隨著資安攻擊手法日益進化,Zero Trust (零信任) 架構逐漸成為企業資安標準,其核心理念是「永不信任,持續驗證」:不論內外部網路來源,都必須經過身份驗證與存取政策評估才能進入系統。

記得好一陣子之前有做過這樣的一篇記錄,使用方法很簡單,去官網註冊跟取得key後,就能直接用,但有 1GB 流量限制。 在 虛擬機或者docker裡用 ngrok 穿透到本機 flask 的 nginx 跑 SSL WEB 或者 jupyter。

curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update \
&& sudo apt install ngrok

ngrok http 11434 --host-header="localhost:11434"

而本文將示範如何透過 Cloudflared Tunnel + Cloudflare Zero Trust,在不開放 GCP 公網固定 IP 的前提下,實現對 SSH、HTTP 與 RDP 主機的安全遠端連線;按慣例,先來個表格比對:

Deep Learning 101

整體方案具備以下基本特性:

1️⃣ 零信任為什麼重要?尤其在 AI 應用場景

大模型會「多問」、「亂問」、「記住」:比人更難控管;企業內部資源不應再預設信任任何網段或工具,Zero Trust 的四個核心:身份驗證、最小權限、動態評估、全程審計。

先說在前,這需有自己的網域跟設定 DNS;如果沒有,那就忍耐使用下面的快速Tunnel動態穿透網址吧

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -O cloudflared.deb

sudo dpkg -i cloudflared.deb

cloudflared tunnel --url http://localhost:80

有自己網域且能自己設定DNS (Ubuntu)

# Add cloudflare gpg key,先把 cloudflare的gpg key 安裝
sudo mkdir -p --mode=0755 /usr/share/keyrings

curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# Add this repo to your apt repositories,把 repo 加入
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# install cloudflared,直接安裝
sudo apt-get update && sudo apt-get install cloudflared

有自己網域且能自己設定DNS (CentOS)

#直接下載,不用 gpgkey 方式下載安裝
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm -O cloudflared.rpm

# 可能會碰上CentOS 7 已進入 EOL(終止支援) 的狀況,造成預設 yum repository 鏡像站已失效(404 或 503),導致 yum 嘗試從無效的源下載 metadata 檔案。 這 與 cloudflared rpm 本身無關,而是整個 yum 系統快掛掉了 😅
sudo cp -a /etc/yum.repos.d /etc/yum.repos.d.bak

sudo yum clean all

sudo yum makecache

sudo yum localinstall --nogpgcheck cloudflared.rpm -y

# 可能會找不到執行路徑
sudo ln -s /usr/bin/cloudflared /usr/local/bin/cloudflared

cloudflared --version

cloudflared version 2025.6.0 (built 2025-06-11-1108 UTC)

2️⃣ Cloudflared Tunnel 是什麼?如何協助實踐 Zero Trust

Deep Learning 101

接著就是要登入,然後創建相關設定檔,我是在主機端設定,也可以在網頁端設定就是;XXXXX 就是你要幫這個 Tunnel 取的名字

cloudflared login

cloudflared tunnel create XXXXX

沒意外的話這時會取得 xxxxx.pem 還有 一串字串的 tunnel ID 的 json 檔 credentials-file: /home/user/.cloudflared/XXXX-XXXX-XXXX-XXXX-XXXX.json

再來就是要陸續針對各個服務設定,把以下兩行先寫到 /home/user/.cloudflared/config

# 這行指定了 Tunnel 的 UUID,
tunnel: XXXX-XXXX-XXXX-XXXX-XXXX
credentials-file: /home/user/.cloudflared/XXXX-XXXX-XXXX-XXXX-XXXX.json

3️⃣ 🔧 Cloudflared Tunnel 實作教學 ▶️ SSH 遠端管理

🔸 SSH:Cloudflared 支援 SSH Proxy,讓你不用開啟 22 port,也能安全連進主機。這同時支援使用 Cloudflare Access 進行身份驗證(如 Google Workspace、Okta 等),完全不依賴公網 IP。

Cloudflared allows secure SSH access without opening port 22, by tunneling traffic through Cloudflare and enforcing Access policies (SSO, MFA).

接續前面所做的取得 xxxxx.pem/home/user/.cloudflared/XXXX-XXXX-XXXX-XXXX-XXXX.json 後,編輯新增 /home/user/.cloudflared/config ,裡面除了 tunnel ID 跟 credentials-file 還要加上這樣,xxx就是你的子網域

ingress:
    - hostname: xxx.twman.org
      service: ssh://localhost:22

同時再接著在 terminal 下這樣的指令,第一個 xxxxx 就是前述的 cloudflared tunnel create XXXXX,第二個 xxx 就是你的子網域,就是前述的 - hostname: xxx.twman.org 到這都是在欲做為 tunnel 主機的設定

cloudflared tunnel route dns xxxxx xxx.twman.org

cloudflared tunnel run xxxxx

接著是要從你要連線至這主機的windows等機器上執行

cloudflared access tcp --hostname xxx.twman.org --url localhost:22222

會出現像這樣

2025-06-04T05:54:02Z INF Start Websocket listener host=localhost:22222

這時你就能從 vscode 的 remote ssh 連線到 localhost:22222 然後其實是連到你設定的 service 了

4️⃣ 🔧 Cloudflared Tunnel 實作教學 ▶️ HTTP 服務(網站 / API)

🔸 HTTP/HTTPS:假如你有一個內部網站或 API,不想開公網 IP,可透過 Cloudflared 將它暴露給授權用戶。

For internal web apps (e.g., dashboards, APIs), expose them securely using Cloudflared with Access.

http的設定也差不多,就是 hostname 跟 service 修改一下

ingress:
    - hostname: xxx.twman.org
      service: http://localhost:80

一樣也要在 terminal 下這樣的指令,第一個 xxx 就是前述的 cloudflared tunnel create XXXXX,第二個 xxx 就是你的子網域,就是前述的 - hostname: xxx.twman.org 到這都是在欲做為 tunnel 主機的設定

cloudflared tunnel route dns xxxxx xxx.twman.org

cloudflared tunnel run xxxxx

網頁不用像 ssh 還要在要連線的本機端執行,只要 DNS 生效,基本就可以使用了 !

5️⃣🔧 Cloudflared Tunnel 實作教學 ▶️ RDP 遠端桌面

🔸 RDP:RDP 通常風險更高,但 Cloudflared 支援將 RDP 流量安全地轉送。

For Windows RDP access, tunnel port 3389 securely via Cloudflare Tunnel.

這個要稍稍注意一下,看你是要轉發到那台機器的 RDP

ingress:
    - hostname: xxx.twman.org
      service: rdp://xxx.xxx.xxx.xx:3389

一樣也要在 terminal 下這樣的指令,第一個 xxx 就是前述的 cloudflared tunnel create XXXXX,第二個 xxx 就是你的子網域,就是前述的 - hostname: xxx.twman.org 到這都是在欲做為 tunnel 主機的設定

cloudflared tunnel route dns xxxxx xxx.twman.org

cloudflared tunnel run xxxxx

接著是要從你要連線至這主機的windows等機器上執行

cloudflared access tcp --hostname xxx.twman.org --url localhost:13389

會出現像這樣

2025-06-04T05:54:02Z INF Start Websocket listener host=localhost:13389

這時你就能用遠端桌面連線連到 localhost:13389 然後其實是連到你設定的 service 了

🚧 但是就是這個BUT,如果該Windows機器沒有對外的固定IP要怎辦?,這時就得用上 SSH 反向隧道(Reverse SSH Tunnel)

如果你只是想快速「從外網 RDP 連進 Windows」,用這 SSH 反向隧道(Reverse SSH Tunnel) 方案是可行的。 如果你想要利用 Cloudflare Access、Zero Trust 等功能,再搭配 Cloudflare Tunnel 會更完整安全。

6️⃣💡 這些設定如何支撐 AI 應用的安全

7️⃣✨ 小結與實務建議