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_ADMIN 同 NET_RAW 能力建立 TUN 介面,再以 MESH_NODE_TOKEN 認證成為 Mesh 網絡內嘅一個節點。所有流量經 /dev/net/tun 進入 WARP 隧道,再以源地址轉換(SRCNAT_ENABLED=true)將容器流量轉換為 Mesh 內網位址,實現穩定嘅返程連線。
架構¶
Cloudflare Mesh 嘅核心係「節點(Node)」模式。每個 Mesh 節點代表一部主機或者一個容器,透過 Cloudflare 邊緣進行身份驗證同路由協調。架構分三層:
- 接入層:容器內嘅
cloudflared/ WARP 引擎建立 WireGuard 隧道,與最近嘅 Cloudflare POP(點對點)握手,取得/24子網內嘅動態位址,預設範圍係100.96.0.0/12。呢個位址同來源主機原本嘅 IP 無關,係由 Cloudflare 控制面分配。 - 路由層:Mesh 節點之間唔直接互連,而係透過 Cloudflare 骨幹轉發。例如節點 A 要訪問節點 B 嘅某個連接埠,封包會由 A 去最近 POP,再經 Cloudflare 內部網絡轉去 B 所屬 POP,最後落返 B 嘅 TUN 介面。咁樣即使兩個節點分別喺唔同地區、唔同 NAT 之後,都可以雙向通信。
- 策略層:喺 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 WARP 或 Connected 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.0 到 100.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 容器覆蓋率補完第二批)