Cloudflare Tunnel 入門指南:不用公網 IP 暴露內網服務

整理 Cloudflare Tunnel 的核心概念、適用場景、建立流程、公共主機名稱路由、Quick Tunnel 限制,以及使用 cloudflared 發布內網 Web 服務時需要注意的設定與安全邊界。

Cloudflare Tunnel 是 Cloudflare 提供的一種反向連線方案。它的核心思路很簡單:伺服器不再主動開放公網連入連接埠,而是在內網機器上執行一個輕量級守護行程 cloudflared,由它主動向 Cloudflare 建立出站加密連線。

這樣一來,你的 Web 服務、API、測試環境、家庭伺服器、NAS 面板,甚至某些內網應用,都可以透過 Cloudflare 分配的公共主機名稱存取,而源站本身不需要公網 IP,也不需要在路由器上做連接埠轉發。

官方文件入口:

Cloudflare Tunnel 解決了什麼問題

傳統暴露服務的方式通常繞不開幾個麻煩點:

  • 伺服器需要公網 IP;
  • 路由器或雲端防火牆要開放連入連接埠;
  • 源站 IP 容易被掃描和攻擊;
  • 家用寬頻、內網、臨時測試環境不方便直接對外提供 HTTPS 存取;
  • 反向代理、憑證、連接埠轉發、動態 DNS 都要自己維護。

Cloudflare Tunnel 換了一個方向:不是讓外部流量直接打到你的伺服器,而是讓你的伺服器主動連到 Cloudflare。外部使用者存取網域時,流量先進入 Cloudflare,再透過已經建立好的 Tunnel 轉發到你的本機服務。

對一般使用者來說,最直觀的好處就是:

  • 不需要公網 IP;
  • 不需要開放連入連接埠;
  • 可以隱藏源站位址;
  • 可以複用 Cloudflare 的 HTTPS、WAF、DDoS 防護、Bot 管理等能力;
  • 適合把內網 Web 服務安全地掛到正式網域下面。

它的工作方式

一個典型的 Cloudflare Tunnel 流程大致是這樣:

  1. 在伺服器、虛擬機、家用主機或容器裡安裝 cloudflared
  2. cloudflared 主動連接到 Cloudflare 全球網路。
  3. 在 Cloudflare 控制台裡建立 Tunnel,並把某個公共主機名稱映射到本機服務。
  4. 使用者存取這個公共主機名稱。
  5. Cloudflare 接收請求,並透過 Tunnel 把請求轉發到你的內網服務。

比如你本機有一個服務跑在:

1
http://localhost:8080

你可以把它映射成:

1
app.example.com

使用者存取 https://app.example.com 時,請求會先經過 Cloudflare,然後再轉發到本機的 http://localhost:8080

Cloudflare 文件裡還提到,每個 Tunnel 預設會維護多條長連線,並連接到不同的 Cloudflare 資料中心。生產環境裡也可以執行多個 cloudflared 副本,用來提高可用性。

適合哪些場景

Cloudflare Tunnel 最適合下面幾類場景:

  • 內網 Web 面板:比如 NAS、Homelab、開發機上的管理後台。
  • 臨時展示環境:把本機開發中的 Web 應用臨時分享給別人。
  • 自建服務公開存取:把 API、部落格後台、監控面板等服務掛到網域下。
  • 沒有公網 IP 的環境:家用寬頻、校園網、公司內網、NAT 後面的機器。
  • 想隱藏源站 IP 的業務:減少源站被直接掃描、撞庫、攻擊的機會。
  • 多服務統一入口:一個 Tunnel 可以發布多個公共主機名稱,對應不同本機服務。

不過要注意,Cloudflare Tunnel 不是簡單意義上的「萬能內網穿透」。如果你要發布 SSH、RDP、TCP 這類非 HTTP 服務,通常還需要在客戶端側也執行 cloudflared,或者結合 Cloudflare Zero Trust / Access 做更完整的存取控制。

如果只是發布一個普通 Web 服務,它上手會非常快;如果想把它當成公司級內網存取方案,就需要額外設計身份驗證、權限分組和稽核策略。

準備條件

正式建立 Tunnel 之前,建議先確認幾件事:

  • 你有 Cloudflare 帳號;
  • 你的網域已經託管在 Cloudflare;
  • 有一台能存取網際網路的伺服器、虛擬機、容器或本機機器;
  • 這台機器可以連接 Cloudflare 網路;
  • 如果環境有嚴格防火牆,需要確認能存取 Cloudflare Tunnel 使用的出站連線連接埠。

官方文件中特別提到,如果伺服器在限制比較嚴格的網路環境裡,可以檢查是否允許存取 Cloudflare 的 7844 連接埠。

在控制台建立 Tunnel

最簡單的方式是直接走 Cloudflare Dashboard。

進入 Cloudflare 控制台後,大致路徑是:

1
Zero Trust / Networking -> Tunnels -> Create Tunnel

然後按頁面提示操作:

  1. 選擇 Cloudflare Tunnel。
  2. 給 Tunnel 起一個名字。
  3. 選擇伺服器的作業系統和 CPU 架構。
  4. 複製 Cloudflare 產生的安裝命令。
  5. 在伺服器上執行命令,安裝並啟動 cloudflared
  6. 回到控制台確認 Tunnel 狀態變成 Healthy。

當 Tunnel 狀態變成 Healthy,說明你的伺服器已經成功和 Cloudflare 建立連線。

發布一個公共主機名稱

Tunnel 建好之後,還需要設定路由,也就是告訴 Cloudflare:

1
哪個網域 -> 轉發到哪個本機服務

比如:

1
app.example.com -> http://localhost:8080

常見的本機服務位址可以是:

1
2
3
http://localhost:80
https://localhost:443
http://192.168.1.10:8080

設定完成後,Cloudflare 會自動建立一條 DNS 記錄,把你的公共主機名稱指向類似下面這樣的 Tunnel 位址:

1
<TUNNEL_ID>.cfargotunnel.com

這個位址不需要使用者直接存取,它只是 Cloudflare 內部用來把網域流量路由到 Tunnel 的目標。

一個 Tunnel 可以發布多個應用。比如:

1
2
3
nas.example.com      -> http://192.168.1.20:5000
git.example.com      -> http://192.168.1.30:3000
monitor.example.com  -> http://localhost:9090

這樣就可以用一個 cloudflared 實例管理多組內網 Web 服務。

常見執行方式

在 Linux 或 macOS 上,Cloudflare 控制台通常會給出類似這樣的服務安裝命令:

1
sudo cloudflared service install <TUNNEL_TOKEN>

Windows 上則類似:

1
cloudflared.exe service install <TUNNEL_TOKEN>

如果你更喜歡 Docker,也可以用官方映像執行:

1
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TUNNEL_TOKEN>

這裡的 <TUNNEL_TOKEN> 是非常敏感的憑證。不要把它提交到公開倉庫,也不要截圖發到公共論壇。拿到這個 token 的人,理論上就有機會把自己的 cloudflared 接到你的 Tunnel 上。

Quick Tunnel 適合臨時測試

Cloudflare 還提供了一種更快的臨時方式,叫 Quick Tunnel。

在本機執行:

1
cloudflared tunnel --url http://localhost:8080

它會產生一個隨機的 trycloudflare.com 子網域,讓外部臨時存取你的本機服務。

這個方式非常適合:

  • 臨時展示;
  • 本機偵錯 webhook;
  • 給同事看一個開發中的頁面;
  • 不想馬上綁定正式網域的測試。

但它不適合生產環境。官方文件說明,Quick Tunnel 有一些限制,比如隨機網域不可控、並發請求有限制,也不支援某些長連線能力。正式服務還是應該建立標準 Tunnel,並綁定自己的網域。

幾個容易踩坑的地方

1. 本機服務監聽位址不對

如果你的服務只監聽在某個容器內部位址,或者只允許特定網卡存取,cloudflared 可能連不上。

排查時可以先在執行 cloudflared 的機器上執行:

1
curl http://localhost:8080

如果本機都存取不了,Cloudflare Tunnel 也轉發不了。

2. 防火牆擋了出站連線

Cloudflare Tunnel 不需要開放連入連接埠,但它需要主動連出去。如果公司網路、雲端安全群組或本機防火牆攔截了出站連線,Tunnel 可能一直無法 Healthy。

這種情況要重點檢查出站存取策略,尤其是 Cloudflare 文件提到的 Tunnel 連線連接埠。

3. 網域沒有託管在 Cloudflare

如果你要發布正式公共主機名稱,網域需要在 Cloudflare 上管理。否則 Cloudflare 無法自動幫你建立對應 DNS 路由。

4. 管理後台不要裸奔

Cloudflare Tunnel 解決的是「怎麼安全連到源站」,但它不等於自動給你的應用加了登入系統。

如果你暴露的是 NAS、Git、監控、資料庫管理後台這類敏感服務,建議至少再加一層 Cloudflare Access,按信箱、組織帳號或身份提供者限制存取。

5. 設定檔模式要有兜底規則

如果你使用 API 或本機設定檔管理 ingress rules,官方文件要求最後放一個兜底規則。常見寫法是返回 404:

1
2
3
4
ingress:
  - hostname: app.example.com
    service: http://localhost:8080
  - service: http_status:404

這樣可以避免沒有匹配到的請求被錯誤轉發到不該存取的服務。

一句話總結

Cloudflare Tunnel 最適合用來把內網 Web 服務安全、穩定地發布到公網網域上。它不要求公網 IP,不要求開放連入連接埠,部署成本也不高。

如果你只是想把家裡或伺服器上的一個 Web 面板掛出來,Cloudflare Tunnel 是非常實用的選擇;如果你要做更複雜的企業內網存取,還應該配合 Cloudflare Access、Zero Trust 策略和更細的權限控制一起使用。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計