跳轉至

Cloudflare Mesh

概述

Cloudflare Mesh(又稱 WARP for Docker / cloudflare/mesh 容器)係 Cloudflare 提供嘅零信任網絡接入方案,基於 WireGuard 技術同 Cloudflare 全球邊緣節點建立加密隧道。同一般 VPN 唔同,Cloudflare Mesh 唔單止係用戶端接入,更係一種「內網返程」手段——透過 WARP 用戶端取得 100.96.0.0/12 呢個 CGNAT 範圍內嘅虛擬 IPv4 位址,令容器或主機可以接入 Cloudflare 嘅私有骨幹,再經由 Tunnel 或 Access 規則連返去自建服務,而毋須暴露公網連接埠。

本機實況中,cloudflare-mesh 容器使用官方鏡像 cloudflare/mesh:latest,並固定喺外部 Docker 網絡 cf_network 嘅靜態 IP 172.21.0.77。容器透過 NET_ADMINNET_RAW 能力建立 TUN 介面,再以 MESH_NODE_TOKEN 認證成為 Mesh 網絡內嘅一個節點。所有流量經 /dev/net/tun 進入 WARP 隧道,再以源地址轉換(SRCNAT_ENABLED=true)將容器流量轉換為 Mesh 內網位址,實現穩定嘅返程連線。

架構

Cloudflare Mesh 嘅核心係「節點(Node)」模式。每個 Mesh 節點代表一部主機或者一個容器,透過 Cloudflare 邊緣進行身份驗證同路由協調。架構分三層:

  1. 接入層:容器內嘅 cloudflared / WARP 引擎建立 WireGuard 隧道,與最近嘅 Cloudflare POP(點對點)握手,取得 /24 子網內嘅動態位址,預設範圍係 100.96.0.0/12。呢個位址同來源主機原本嘅 IP 無關,係由 Cloudflare 控制面分配。
  2. 路由層:Mesh 節點之間唔直接互連,而係透過 Cloudflare 骨幹轉發。例如節點 A 要訪問節點 B 嘅某個連接埠,封包會由 A 去最近 POP,再經 Cloudflare 內部網絡轉去 B 所屬 POP,最後落返 B 嘅 TUN 介面。咁樣即使兩個節點分別喺唔同地區、唔同 NAT 之後,都可以雙向通信。
  3. 策略層:喺 Cloudflare Zero Trust Dashboard 入面,可以為 Mesh 節點定義 Access 規則,例如「只有香港節點先可以連去 10.0.0.5:8443」。Docker Compose 中 SRCNAT_ENABLED=true 令所有由容器發起嘅連接都強制使用 Mesh 位址作為來源,確保回應封包曉得正確返程。

使用外置 cf_network 並指定靜態 IP,係為咗令其他容器(例如 LiteLLM 或反向代理)可以經 172.21.0.77 穩定咁將流量交畀 Mesh 節點,再由 WARP 隧道轉出去。

部署

部署前需要準備:

  • 已安裝 Docker 同 Docker Compose 嘅 Linux 主機(建議 Ubuntu 22.04 或 Debian 12)。
  • Cloudflare Zero Trust 帳號,並預先建立好 Mesh 節點憑證,取得 MESH_NODE_TOKEN。此 Token 係節點身分證明,等同私鑰,必須以環境變數注入,千祈唔好寫死喺 compose 檔案。
  • 一個外部 Docker 網絡,命名為 cf_network。若未建立,可先執行:
docker network create --subnet=172.21.0.0/16 cf_network

然後將上文嘅 Compose 內容儲存為 docker-compose.yml,並喺同目錄建立 .env 檔:

MESH_NODE_TOKEN=eyJhbGciOi...

啟動:

docker compose up -d

容器會自動連入 Mesh。由於有 device: /dev/net/tun,請確保宿主機已載入 TUN 模組:

ls -l /dev/net/tun

如果唔存在,執行 sudo mkdir -p /dev/net && sudo mknod /dev/net/tun c 10 200 && sudo chmod 600 /dev/net/tun

配置

網絡位址

Compose 中將容器固定為 172.21.0.77,好處係其他服務可以用固定 IP 訪問 Mesh 閘道。例如某個內部 API 需要透過 Mesh 連去遠端辦公室,你只需要將流量指向 172.21.0.77:8080

環境變數

  • MESH_NODE_TOKEN:必填,Cloudflare 生成嘅節點 Token。
  • SRCNAT_ENABLED=true:啟用來源地址轉換。如果容器需要同時處理入站同出站連接,建議開啟;如果僅作純客戶端,可以關閉。
  • TZ=Asia/Hong_Kong:設定時區,影響日誌時間戳同 WARP 嘅調度演算法。

資料卷

mesh_mesh_data 係外部 volume,保存 WARP 嘅註冊狀態同 key。用 external: true 嘅意思係要預先用 docker volume create mesh_mesh_data 建立,或者由另一個 Compose 專案管理。注意若刪除這個 volume,節點會失去身份,下次啟動要重新認證。

權限

cap_add 必須包含 NET_ADMIN(建立 TUN、改路由同 iptables)同 NET_RAW(發送 raw packet)。如果容器喺 Kubernetes 或受限環境執行,要用 privileged container 或者相應嘅 securityContext。

維運與監控

日誌

查睇 Mesh 連線狀態:

docker logs -f cloudflare-mesh

正常運作時會見到 Registered with WARPConnected to Cloudflare Edge 之類訊息。若見到 Failed to register,先檢查 Token 有冇過期。

手動測試

進入容器執行:

docker exec -it cloudflare-mesh sh
ping 100.96.0.1   # Cloudflare 網關
curl ifconfig.me  # 出站 IP 應該係 Cloudflare 嗰個

要測試返程,從另一容器 ping 100.96.x.x(Mesh 內網位址),確認路由通。

健康檢查

可以加入:

healthcheck:
  test: ["CMD", "ping", "-c", "1", "100.96.0.1"]
  interval: 30s
  timeout: 5s
  retries: 3

更新

cloudflare/mesh:latest 會經常更新,建議用 docker compose pull && docker compose up -d 定期升級。升級前最好備份 mesh_mesh_data volume:docker run --rm -v mesh_mesh_data:/data -v $(pwd):/backup alpine tar czf /backup/mesh_data.tgz -C /data .

常見問題

問題:容器啟動後反覆重啟,日誌顯示 Cannot open TUN device
原因:宿主機未有 /dev/net/tun 或者容器冇 NET_ADMIN 能力。先確認設備節點存在,再檢查 compose 有冇漏咗 cap_add

問題:MESH_NODE_TOKEN 設定咗但認證失敗,回應 Invalid token
Token 可能已經撤銷,或者包含 $ 等特殊字元被 shell 展開。喺 .env 入面用單引號包住 Token。

問題:其他容器無法連去 172.21.0.77
檢查 cf_network 係咪同其他容器共用。若其他容器喺唔同網絡,要將佢哋加入同一網絡,或者用 network_mode: service:cloudflare-mesh

問題:Mesh 節點攞到嘅內網 IP 唔喺 100.96.0.0/12 範圍內。
舊版 WARP 或企業版可能有其他配置。正常個人版係用呢個 CGNAT 段,但實際分配可以係 100.96.0.0100.127.255.255。想睇實際位址,用 ip addr show tun0

問題:WARP 連線成功,但訪問公司內部服務超時。
確認目標服務係咪允許 Mesh 網段(100.96.0.0/12)通過防火牆。另外,檢查 SRCNAT_ENABLED 有冇令來源位址變成容器原本嘅 NAT IP,可以用 tcpdump 驗證。

相關鏈接


本頁內容以實際部署環境為基礎撰寫,涵蓋 Cloudflare Mesh 喺 Docker 內嘅架構、配置同排錯要點。如有更改,請參考 Cloudflare 官方文件。

來源

自動生成(2026-08-19 容器覆蓋率補完第二批)