Cloudflare Tunnel 是 Cloudflare 提供的免費反向通道服務:你在伺服器上跑一個叫 cloudflared 的小程式,由它主動向 Cloudflare 邊緣建立 4 條加密連線,公網流量就順著這條既有連線流回你的服務。你完全不用開放任何 inbound 連接埠、不用公網 IP、不必面對 CGNAT,真實 IP 也不會曝光。cloudflared 是 Apache-2.0 授權的開源專案,Tunnel 本身免費、流量無限。
截至 2026 年 9 月 18 日,cloudflared 在 GitHub 上有 15,719 顆星、1,446 個 fork,最新版本是 2026.9.1(2026-09-11 發布)。這篇文章會把整套流程從零走完:安裝、建立 tunnel、寫 config.yml、常駐成 systemd 服務、用 Docker Compose 部署、加上 Zero Trust 身分驗證,最後附上與 ngrok、Tailscale Funnel、frp 的比較表與常見錯誤排錯。

30 秒認識 Cloudflare Tunnel
| 項目 | 內容 |
|---|---|
| 官方定位 | 由 Cloudflare 網路代理流量到你 origin 的通道服務(tunneling daemon) |
| 客戶端 | cloudflared(開源,Apache-2.0,GitHub cloudflare/cloudflared) |
| 最新版本 | 2026.9.1(2026-09-11) |
| 費用 | Tunnel 免費、流量無限、tunnel 數量無限;Zero Trust Access 免費方案可保護 50 位使用者 |
| 需要條件 | 網域託管在 Cloudflare(自訂網域必要;Quick Tunnel 不需要) |
| 對外連線 | UDP QUIC 優先,備援 TCP HTTP/2,連接埠 7844 |
| 適用場景 | Homelab、自架服務對外、Webhook 收發、內網工具遠端存取、取代 port forwarding |
| 不適合 | 需要固定 IP 的地方(Tunnel 是隱藏 IP 而非提供 IP) |
為什麼需要它?先看傳統做法痛在哪
要理解 Cloudflare Tunnel 的價值,最直接的方法是看其他三種常見做法各自卡在哪。
| 做法 | 需要公網 IP? | 需要開 inbound 埠? | 真實 IP 曝光? | 主要痛點 |
|---|---|---|---|---|
| Port Forwarding | 要 | 要(80/443) | 會 | 家用網路常遇 CGNAT 直接卡死;IP 一曝光就被掃描、被 DDoS |
| Nginx / Traefik 反向代理 | 要 | 要 | 會 | 只解決「埠轉發 + TLS 終止」,入口還是要開在公網 |
| DDNS + 自簽憑證 | 要 | 要 | 會 | 憑證管理麻煩、沒有 WAF/DDoS 防護 |
| Cloudflare Tunnel | 不用 | 不用 | 不會 | 網域必須在 Cloudflare 上 |
換句話說,傳統做法的前提都是「我得先被看見才能提供服務」;Cloudflare Tunnel 反過來,先由你的機器主動連出去,再把請求接回來。
架構原理:4 條出站連線 + 反向通道
cloudflared 啟動後,會自動與 Cloudflare 分佈在不同地理位置的邊緣節點建立 4 條持久的出站連線(預設優先 UDP QUIC,備援走 TCP HTTP/2,都是連接埠 7844),達成高可用與負載平衡。之後:
- 訪客連到你的網域(例如
app.example.com)。 - Cloudflare 邊緣接手,做 TLS 終止、WAF 過濾、DDoS 防護。
- 邊緣把請求沿著那 4 條既有連線,送回你機器上的
cloudflared。 cloudflared再依config.yml的 ingress 規則,把請求轉給本機的服務(例如http://localhost:8080)。
這代表你的 origin 可以維持完全關閉的狀態:不需要公網入口、不需要開 80/443,真實 IP 也藏在通道後面。順帶一提,這條路上唯一的出站要求是 UDP/TCP 7844——如果你的環境有嚴格的 egress 防火牆,記得放行這個埠,否則 tunnel 會連不上。
安裝 cloudflared(Linux)
方法 1:官方 apt 套件庫(Debian / Ubuntu,推薦)
# 建立 keyrings 目錄並匯入 Cloudflare GPG 金鑰
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
# 新增 apt 軟體源
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
# 更新套件清單並安裝
sudo apt-get update && sudo apt-get install cloudflared
# 確認版本
cloudflared --version
方法 2:二進位檔(不想動 apt 的時候)
到 github.com/cloudflare/cloudflared/releases 下載對應架構的檔案(cloudflared-linux-amd64、cloudflared-linux-arm64),chmod +x 後丟到 /usr/local/bin/ 即可。
方法 3:Docker
官方映像檔是 cloudflare/cloudflared:latest(DockerHub)。容器化部署適合已經用 Compose 管服務的人,後面〈Docker Compose 部署〉一節有完整範例。
小提醒:Cloudflare 官方支援「距離最新版本一年內」的
cloudflared。超過一年的版本可能遇到不相容的 breaking change,記得定期更新。
本機管理 Tunnel:四個指令走完
Cloudflare Tunnel 有兩種管理模式:Dashboard 遠端管理(在網頁上建立,複製安裝指令貼到伺服器跑)與本機管理(locally-managed)(用 CLI 建立,設定存在自己的 config.yml)。後者對自架族比較好用,因為設定進得了 Git、也容易備份。
| 步驟 | 指令 | 說明 |
|---|---|---|
| 1. 授權 | cloudflared tunnel login | 終端機印出授權 URL,用瀏覽器選要綁定的網域。成功後下載 cert.pem 到 ~/.cloudflared/ |
| 2. 建立 | cloudflared tunnel create homelab-tunnel | 產生唯一 <TUNNEL_ID>,並在 ~/.cloudflared/ 寫入 <TUNNEL_ID>.json 憑證 |
| 3. 綁 DNS | cloudflared tunnel route dns homelab-tunnel app.example.com | 自動在 Cloudflare DNS 建立指向 <TUNNEL_ID>.cfargotunnel.com 的 CNAME |
| 4. 啟動 | cloudflared tunnel run homelab-tunnel | 建立 4 條邊緣連線並開始傳流量 |
~/.cloudflared/ 目錄裡有什麼
cert.pem:登入時取得的 Origin CA 授權憑證,用來建立/刪除 tunnel 與設定 DNS 路由。<TUNNEL_ID>.json:單一 tunnel 的 credentials 檔,內含私鑰與 ID。搬家或換機器時一定要一起複製,否則 tunnel 起不來。config.yml:本機管理的設定檔(自己建立,見下節)。
config.yml 完整範例
本機管理的核心就是這個檔案。以下是涵蓋常見情境的完整範例:
tunnel: homelab-tunnel
credentials-file: /etc/cloudflared/7f3a1c9e-4b2d-4e11-9a6f-2d8c5e0b91aa.json
# 全局 origin 請求設定
originRequest:
connectTimeout: 30s
noTLSVerify: false
ingress:
# 1. 一般 HTTP 服務
- hostname: app.example.com
service: http://localhost:8080
# 2. 本機 HTTPS(自簽憑證時忽略驗證、覆寫 Host 標頭)
- hostname: secure.example.com
service: https://localhost:8443
originRequest:
noTLSVerify: true
httpHostHeader: "secure.example.com"
# 3. 路徑匹配(單一網域拆多個後端)
- hostname: app.example.com
path: ^/api/.*
service: http://localhost:5000
# 4. SSH
- hostname: ssh.example.com
service: ssh://localhost:22
# 5. TCP(例如資料庫)
- hostname: db.example.com
service: tcp://localhost:5432
# 6. 內建測試服務
- hostname: test.example.com
service: hello_world
# 7. catch-all 一定要放最後
- service: http_status:404
Ingress 規則的三個關鍵觀念
- 由上往下比對,第一個命中就決定。所以越具體的規則要放越上面,
http_status:404這種 catch-all 必須放最後一行——這也是 Cloudflare 官方明定的要求。 path只做匹配,不會改寫路徑。^/api/.*命中後,後端收到的是完整原始路徑。要 strip 或 rewrite,得靠 edge 的 URL Rewrite Rules,或在本機再放一層反向代理。originRequest可以寫在全局也可以寫在單條規則裡,單條的會覆蓋全局。常用選項:connectTimeout(預設 30s)、noTLSVerify(origin 用自簽憑證時設true)、httpHostHeader(覆寫送往 origin 的 Host)、disableChunkedEncoding。
讓它常駐:systemd 服務
cloudflared tunnel run 手動跑會在登出後中斷。要做成服務,建議開一個專用系統帳號:
sudo useradd --system --home /etc/cloudflared --shell /usr/sbin/nologin cloudflared
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/config.yml ~/.cloudflared/*.json /etc/cloudflared/
sudo chown -R cloudflared:cloudflared /etc/cloudflared
接著建立 /etc/systemd/system/cloudflared.service:
[Unit]
Description=Cloudflare Tunnel agent
After=network-online.target
Wants=network-online.target
[Service]
User=cloudflared
Group=cloudflared
ExecStart=/usr/bin/cloudflared tunnel --config /etc/cloudflared/config.yml run
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now cloudflared
systemctl status cloudflared
狀態正常的話,日誌裡會看到它對 4 個邊緣節點都建立了連線。
Docker Compose 部署
如果服務本來就跑在容器裡,cloudflared 也用容器跑最省事:
version: "3.9"
services:
demo-app:
image: nginx:latest
container_name: demo-app
restart: unless-stopped
networks:
- tunnel-net
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run homelab-tunnel
volumes:
- ./cloudflared:/etc/cloudflared
environment:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
networks:
- tunnel-net
depends_on:
- demo-app
networks:
tunnel-net:
driver: bridge
兩個最常見的踩雷點:
service千萬不要填localhost。當cloudflared與應用在同一個 Docker 網路時,localhost指的是cloudflared容器自己,要用 Docker 服務名稱,例如http://demo-app:80。填錯的症狀就是 502。TUNNEL_TOKEN用於 Dashboard 託管的無狀態 tunnel。從 Cloudflare Dashboard 建立 tunnel 時可取得 token,適合不想把憑證檔放進容器的人。
TryCloudflare Quick Tunnel:免帳號、30 秒上線
想先試試看、或只是要把本機東西臨時分享出去,可以直接用 Quick Tunnel:
cloudflared tunnel --url http://localhost:8080
它會立刻產生一個隨機的 *.trycloudflare.com 子網域並印在終端機上,不需要 Cloudflare 帳號、不需要網域、不用任何設定檔。
| 特性 | 說明 |
|---|---|
| 網域 | 隨機 *.trycloudflare.com,重啟就換 |
| 帳號 | 不需要 |
| 併發限制 | 同時最多約 200 個 in-flight 請求,超過回 429 |
| 功能限制 | 不支援 SSE(Server-Sent Events) |
| SLA | 無可用性保證,官方定位為測試/開發用途 |
| 適合 | Demo 給朋友看、一次性的 Webhook 回呼測試、本機除錯 |
| 不適合 | 正式站、需要穩定網址的整合 |
Quick Tunnel 的定位很明確:它是試用版,不是生產版。要拿掉這些限制,就得把網域加進 Cloudflare 並建立正式 tunnel。
加上 Cloudflare Access:讓服務只有你能進
如果你不想讓服務對全世界公開——例如自架的 Grafana、Uptime Kuma、內部管理後台——那 Cloudflare Access(Zero Trust)就是它的關鍵搭檔。做法是在 Cloudflare 邊緣先攔下請求、要求身分驗證,通過之後才放行到 tunnel:
- 進入 Zero Trust Dashboard → Access → Applications,新增一個 Self-hosted Application。
- 填入應用網域(例如
grafana.example.com)與 session 過期時間。 - 設定 Policies:Action 選
Allow,條件比對允許的 Email、網域,或身分提供者(IdP)群組。 - 支援的驗證方式包含 Email OTP、Google、GitHub、Microsoft Entra ID、mTLS,以及 Service Tokens(適合機器對機器)。
免費方案可以保護 50 位使用者(Seats)。 對個人、家庭、小型團隊來說,這個額度幾乎用不完,等於免費獲得一套企業級的存取控制。
費用:到底要不要錢?
| 項目 | 費用 |
|---|---|
| Cloudflare Tunnel 本體 | 免費,含無限流量、無限 tunnel 數、無限自訂網域綁定 |
| Cloudflare 帳號 | 免費方案即可(網域 DNS 需託管在 Cloudflare) |
| Zero Trust Access | 免費方案含 50 位使用者;超過才需訂閱 |
| Quick Tunnel | 完全免費,但不保證 SLA |
與 ngrok、Tailscale Funnel、frp 的完整比較
同樣是「把本機服務變公網可達」,這四個工具的設計哲學差很多:
| 比較項目 | Cloudflare Tunnel | ngrok | Tailscale Funnel | frp |
|---|---|---|---|---|
| 免費方案限制 | 流量無限、自訂網域無限;Quick Tunnel 網域隨機 | 1GB/月流量、20,000 requests/月、1 個固定網域、3 個 endpoints、2 小時 session 限制 | 僅限個人免費 Tailnet,只能用 *.ts.net 網域,頻寬有非公開上限 | 軟體免費,但需自備 VPS(規格與頻寬自己扛) |
| 自訂網域 | 免費支援(網域需在 Cloudflare) | 付費方案才有(約 $8/月起) | 只支援 *.ts.net | 完全支援(自備域名) |
| 價格 | Tunnel 免費;Zero Trust >50 人才收費 | Hobbyist 約 $8/月、Pro 約 $20/月;Pay-as-you-go 約 $18/月起 | 個人免費;團隊方案約 $5/使用者/月 | 開源免費 + VPS 月費約 $3–5 起 |
| 開源授權 | 客戶端 cloudflared 開源(Apache-2.0) | 商業閉源 | 客戶端開源 | 完全開源(MIT,GitHub 100k+ stars) |
| 最適合 | 長期對外服務、Homelab、企業 Zero Trust 架構 | Webhook 除錯、API 流量錄製與重放 | Tailnet 成員之間的快速分享 | 要求完全資料主權、自建轉發伺服器 |
| 最大優勢 | 免費 + 自訂網域 + WAF/DDoS 一併附上 | 開發者體驗最好、除錯工具最強 | 已用 Tailscale 就不用再學新東西 | 完全自己掌控,無第三方依賴 |
| 最大缺點 | 網域必須在 Cloudflare 上 | 免費額度很容易用完 | 不能用自己的網域 | 要自己維運一台伺服器 |
怎麼選?一句話版本:
- 有網域、要長期對外、想順便拿到 WAF 與 Zero Trust → Cloudflare Tunnel
- 只是要 10 分鐘內把 webhook 露出來測一下 → ngrok
- 已經在用 Tailscale 的私有網路,只想給同一 tailnet 的人看 → Tailscale Funnel
- 不想讓任何第三方碰到流量 → frp + 自己的 VPS
常見錯誤與排錯
| 症狀 | 原因 | 解法 |
|---|---|---|
| HTTP 1016(Origin DNS Error) | Cloudflare DNS 找不到對應的 tunnel,通常是沒跑 route dns 或 CNAME 被誤刪 | 重跑 cloudflared tunnel route dns <TUNNEL_NAME> <HOSTNAME> |
| HTTP 1033(Argo Tunnel Error) | 邊緣連不上你本機的 cloudflared:服務沒啟動、網路中斷、認證失敗 | systemctl status cloudflared,看日誌是否成功連上 4 個邊緣節點 |
| HTTP 502(Bad Gateway) | cloudflared 連得上 Cloudflare,但連不到 origin:服務沒跑、埠號錯、或 Docker 內誤用 localhost | 確認 origin 服務正常;容器環境把 localhost 改成服務名稱 |
| Credentials 檔找不到 | 換機器時沒帶走 <TUNNEL_ID>.json,或 config.yml 路徑寫錯 | 憑證檔一起複製,路徑寫絕對路徑 |
| Tunnel 完全連不上 | egress 防火牆擋掉 UDP/TCP 7844 | 放行出站 7844 |
| DNS 建好了但還是 404/1016 | DNS 紀錄與 tunnel 是獨立的,tunnel 沒跑就不會通 | 啟動 tunnel;注意 tunnel 停止時 DNS 紀錄不會被刪,訪客會看到 1016 |
實戰場景:三個馬上能用的情境
- 自架服務取代 port forwarding。 在 Proxmox、樹莓派或家用 NAS 上跑好服務(例如 Uptime Kuma 監控),用 tunnel 綁一個子網域,就不用在家用路由器上開任何埠、也不必處理 CGNAT。
- 接收 Webhook。 需要一個公開 HTTPS 端點讓第三方服務打進來時,tunnel 給你穩定網址(比 Quick Tunnel 的隨機網域可靠);搭配 Access 的 Service Token 還能限制來源。想搞懂簽章驗證這一段,可以先看什麼是 Webhook 的完整教學。
- 在現有反向代理前面再加一層。 已經用 Caddy 管內部路由的人,可以讓
cloudflared指向 Caddy,變成「Cloudflare 邊緣 → tunnel → Caddy → 各服務」的兩段式架構,TLS 與路由責任切得很乾淨。
如果你的服務跑在容器裡、又想先補齊容器化的基本功,Docker 完整教學是好起點;若你更想走「完全私有網路」這條路,Tailscale 完整教學則是完全不同的取捨(Mesh VPN 走私有網段,不是對公網開放)。
延伸閱讀
- Tailscale 完整教學 2026:36K 星 WireGuard Mesh VPN,從安裝、MagicDNS、Subnet Router 到遠端連回家中自架服務——同樣是「不開防火牆」的解法,但走的是私有網路而非公開網域。
- Caddy 完整教學 2026:75K 星自動 HTTPS 網頁伺服器,從 Caddyfile、反向代理到 Docker 部署——Tunnel 前面/後面的那層反向代理。
- 什麼是 Webhook?白話文完整教學:與 API 輪詢的差異、Python FastAPI 實作與安全驗證——把 tunnel 用在 Webhook 場景時,這篇補齊安全驗證觀念。
- Uptime Kuma 完整教學 2026:91K 星自架監控神器——自架服務最該配的一個監控。
- 網站防爬蟲實戰指南:從 robots.txt 到 Cloudflare Bot 管理,2026 最新防護策略——服務上線之後,接著要面對的自動化流量問題。
資料來源
- Cloudflare 官方文件:Cloudflare Tunnel
- Cloudflare 官方文件:Quick Tunnels(TryCloudflare)
- Cloudflare 官方文件:Downloads(安裝方式)
- Cloudflare 官方文件:DNS records
- Cloudflare 官方文件:Create a tunnel (dashboard)
- cloudflared GitHub 專案(README 與 Releases)
版本與價格資訊以 2026 年 9 月 18 日查核為準;
cloudflared最新版為 2026.9.1。免費方案限制與價格請以 Cloudflare 官方公告為準。
