Cloudflare Tunnel 完整教學 2026:什麼是 Cloudflare Tunnel?不開防火牆 port 也能把自架服務搬上網(cloudflared 安裝、config.yml、Docker、Zero Trust 保護一次學會)

Cloudflare Tunnel 是 Cloudflare 的免費反向通道服務:由你伺服器上的 cloudflared 主動向外建立 4 條加密連線到 Cloudflare 邊緣,讓公網請求流進來,你完全不必開放任何 inbound 連接埠、也不必暴露真實 IP。本文從架構原理講起,完整涵蓋 Linux 安裝(apt 套件庫/二進位檔/Docker)、本機管理 tunnel 的四大指令、config.yml ingress 規則範例、systemd 常駐服務、Docker Compose 部署、TryCloudflare Quick Tunnel 的限制、Cloudflare Access(Zero Trust)免費 50 人保護,以及與 ngrok、Tailscale Funnel、frp 的完整比較表與 1016/1033/502 排錯。

  • Dennis
  • 11 分鐘閱讀
Cloudflare Tunnel 完整教學 2026:什麼是 Cloudflare Tunnel?不開防火牆 port 也能把自架服務搬上網(cloudflared 安裝、config.yml、Docker、Zero Trust 保護一次學會)

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 的比較表與常見錯誤排錯。

Cloudflare Tunnel 架構示意圖

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),達成高可用與負載平衡。之後:

  1. 訪客連到你的網域(例如 app.example.com)。
  2. Cloudflare 邊緣接手,做 TLS 終止、WAF 過濾、DDoS 防護。
  3. 邊緣把請求沿著那 4 條既有連線,送回你機器上的 cloudflared
  4. 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-amd64cloudflared-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. 綁 DNScloudflared 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 規則的三個關鍵觀念

  1. 由上往下比對,第一個命中就決定。所以越具體的規則要放越上面,http_status:404 這種 catch-all 必須放最後一行——這也是 Cloudflare 官方明定的要求。
  2. path 只做匹配,不會改寫路徑^/api/.* 命中後,後端收到的是完整原始路徑。要 strip 或 rewrite,得靠 edge 的 URL Rewrite Rules,或在本機再放一層反向代理。
  3. 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:

  1. 進入 Zero Trust Dashboard → Access → Applications,新增一個 Self-hosted Application
  2. 填入應用網域(例如 grafana.example.com)與 session 過期時間。
  3. 設定 Policies:Action 選 Allow,條件比對允許的 Email、網域,或身分提供者(IdP)群組。
  4. 支援的驗證方式包含 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 TunnelngrokTailscale Funnelfrp
免費方案限制流量無限、自訂網域無限;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/1016DNS 紀錄與 tunnel 是獨立的,tunnel 沒跑就不會通啟動 tunnel;注意 tunnel 停止時 DNS 紀錄不會被刪,訪客會看到 1016

實戰場景:三個馬上能用的情境

  1. 自架服務取代 port forwarding。 在 Proxmox、樹莓派或家用 NAS 上跑好服務(例如 Uptime Kuma 監控),用 tunnel 綁一個子網域,就不用在家用路由器上開任何埠、也不必處理 CGNAT。
  2. 接收 Webhook。 需要一個公開 HTTPS 端點讓第三方服務打進來時,tunnel 給你穩定網址(比 Quick Tunnel 的隨機網域可靠);搭配 Access 的 Service Token 還能限制來源。想搞懂簽章驗證這一段,可以先看什麼是 Webhook 的完整教學
  3. 在現有反向代理前面再加一層。 已經用 Caddy 管內部路由的人,可以讓 cloudflared 指向 Caddy,變成「Cloudflare 邊緣 → tunnel → Caddy → 各服務」的兩段式架構,TLS 與路由責任切得很乾淨。

如果你的服務跑在容器裡、又想先補齊容器化的基本功,Docker 完整教學是好起點;若你更想走「完全私有網路」這條路,Tailscale 完整教學則是完全不同的取捨(Mesh VPN 走私有網段,不是對公網開放)。

延伸閱讀

資料來源

版本與價格資訊以 2026 年 9 月 18 日查核為準;cloudflared 最新版為 2026.9.1。免費方案限制與價格請以 Cloudflare 官方公告為準。

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友