Skip to content

Cloudflare Tunnel x Synology NAS 架構指南

透過 Cloudflare Tunnel 建立「不開放任何 inbound port」的 NAS 安全外部存取,搭配 Origin Certificate(15 年效期)實現低維護成本的端對端 HTTPS。

概述

傳統 NAS 外部存取需要在路由器開放 port,暴露公網 IP,存在被掃描攻擊的風險。Cloudflare Tunnel 方案從 NAS 主動建立出站連線到 Cloudflare 邊緣節點,Cloudflare 負責接受外部 HTTPS 請求並透過隧道轉發到 NAS,整個過程 NAS 不需要開任何 inbound port。

架構核心優點:

  • 零 port 開放:路由器不需任何 port forwarding 設定
  • Cloudflare 全球加速:靜態資源透過 Cloudflare CDN 快取,降低全球延遲
  • 15 年 Origin Certificate:避免 Let's Encrypt 90 天更新失敗問題,免維護
  • 無限子網域:一個 Tunnel 可映射 NAS 上任意數量的 Docker 服務,在後台秒速新增

核心內容

Cloudflare Tunnel 運作原理

外部使用者
    ↓ HTTPS(Cloudflare 邊緣節點的公開憑證)
Cloudflare 邊緣節點
    ↓ 加密隧道(由 NAS 主動建立的 outbound 連線)
NAS cloudflared daemon(Docker 容器)
    ↓ 內網 HTTP/HTTPS 轉發
Docker 服務(DSM :5001, Nextcloud :1113, Immich :2283...)

Tunnel daemon(cloudflared)啟動後主動連到 Cloudflare,並長期維持加密隧道。外部請求進來時,Cloudflare 透過這條隧道轉發到 NAS,不需要 NAS 有固定 IP 或開放 port。即使家用 IP 變動,Tunnel 自動重新連線。

憑證策略比較

方案效期維護成本限制
Let's Encrypt90 天(需自動更新)低(若更新順利)更新失敗時服務中斷
Cloudflare Origin Certificate最長 15 年極低(一次設定)只對 Cloudflare Proxy 有效(不可直連)
自簽憑證(LSIO 預設)自訂需在 Cloudflare 設「Full」模式 + No TLS Verify

Origin Certificate 的前提是所有流量必須通過 Cloudflare Proxy(橘色雲朵),Origin Certificate 在直接連線時不被瀏覽器信任。在 Cloudflare Tunnel 架構中,這是天然成立的條件——流量本來就只能透過 Cloudflare 進入。

SSL/TLS 模式選擇

模式描述何時使用
Flexible只加密瀏覽器↔Cloudflare,NAS 端不加密不建議,有安全疑慮
Full加密全程,但不驗證 NAS 憑證NAS 使用自簽憑證(LSIO Nextcloud 等)
Full (Strict)加密全程,驗證 NAS 憑證有效性NAS 使用 Origin Certificate

建議路徑(Path B,最佳安全性):使用 Cloudflare Origin Certificate 匯入 DSM 並設為預設憑證 → Cloudflare 設定 Full (Strict)。DSM 使用 HTTPS Port 5001,DSM + Photos App 自動套用該憑證。

多服務映射架構

一個 Tunnel 在 Cloudflare 後台設定多個 Public Hostname,每個 Hostname 對應 NAS 上一個內網服務(不同 port)。新增服務(例如部署 Immich)只需在後台加一行 Hostname,秒速生效,不需修改 NAS、Docker 或防火牆設定。

大檔案上傳限制(Cloudflare Free Plan)

Cloudflare Free plan 的 Proxy 模式對單一 HTTP request body 有 100MB 上限。影響:

  • Nextcloud Web 上傳大型檔案 → 需設定 chunked upload ≤ 95 MiB
  • Synology Drive / Photos 客戶端(使用分片上傳)通常不受影響

繞過方案:

  1. 暫時將 DNS 設為 DNS-only(灰色雲朵)— 服務直接暴露 IP,安全性降低
  2. 使用 Tailscale 作為大檔案傳輸的 VPN 隧道,完全不受此限制

關鍵要點

  • cloudflared daemon 只需一個 Docker 容器即可服務 NAS 上所有 Docker 服務
  • Synology DSM HTTPS port 是 5001(Photos App 也在同一 port)
  • Origin Certificate 必須設為 DSM 的預設憑證,Photos App 才會自動套用
  • 連 HTTPS 服務時需勾選 No TLS Verify(Origin Certificate 非公開 CA 簽發)
  • --no-autoupdate 防止 cloudflared 容器自我更新破壞穩定性
  • Cloudflare Cache Rules 建議設 Bypass cache,避免動態內容(Nextcloud、DSM)被快取

實際應用

此架構適用於:

  • Synology NAS 上部署多個 Docker 服務(Nextcloud、Immich、DSM 管理介面等)
  • 家用網路,路由器不支援或不想設定 port forwarding
  • 需要 HTTPS 但不想處理 Let's Encrypt 更新問題
  • 想透過 Cloudflare 獲得 CDN 加速和 DDoS 防護

部署設定參考

以下為實際部署時使用的完整設定,供日後查詢與複製使用。

環境參數

項目
NASSynology(Intel Celeron J4125 或類似)
Cloudflare 方案Free plan
Tunnel daemoncloudflare/cloudflared:latest
憑證方案(推薦)Cloudflare Origin Certificate(15 年)
SSL 模式(推薦)Full (Strict)(搭配 Origin Certificate)
SSL 模式(LSIO 自簽)Full(搭配 No TLS Verify)

docker-compose.yaml(cloudflared 服務)

yaml
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: always
    command: tunnel --no-autoupdate run --token <YOUR_TUNNEL_TOKEN>
    environment:
      - TZ=Asia/Taipei

Token 取得方式:Cloudflare Zero Trust → Networks → Tunnels → 建立或選取 Tunnel → 選 Docker 部署 → 複製 --token 後面的一長串代碼。

Public Hostname 設定範例

在 Cloudflare Zero Trust → Networks → Tunnels → [你的 Tunnel] → Public Hostname → Add a public hostname:

用途SubdomainService TypeURL(內網)特殊設定
DSM 管理介面dsmHTTPSlocalhost:5001HTTP Settings → No TLS Verify ✅
Synology PhotosphotosHTTPSlocalhost:5001HTTP Settings → No TLS Verify ✅
Nextcloud (LSIO)cloudHTTPSlocalhost:1113HTTP Settings → No TLS Verify ✅
Nextcloud (FPM/Memories)cloudHTTPlocalhost:8880
ImmichimmichHTTPlocalhost:2283

連到 HTTPS 服務(DSM、LSIO Nextcloud)需勾選 No TLS Verify,因為使用的是 Origin Certificate 或自簽憑證,不是公開 CA 簽發的憑證,Cloudflare 無法驗證。

注意: Nextcloud (LSIO) 與 Nextcloud (FPM/Memories) 為互斥部署方案,擇一即可,不可同時使用相同子網域 cloud

Origin Certificate 設定流程(Path B,推薦)

1. Cloudflare Dashboard → SSL/TLS → Origin Server → Create Certificate
   - 效期選 15 years
   - 儲存生成的 Certificate (PEM) 與 Private Key

2. Synology DSM → 控制台 → 安全性 → 憑證 → 新增 → 匯入憑證
   - 私鑰:貼上 Private Key
   - 憑證:貼上 Certificate (PEM)
   - 中繼憑證:貼上 Cloudflare Origin CA root(從 Cloudflare 文件取得)

3. 將該憑證設為「預設憑證」
   (Photos App 與 DSM 自動套用)

4. Cloudflare Dashboard → SSL/TLS → Overview → 選 Full (Strict)

Cloudflare Cache Rules 設定(Bypass)

在 Cloudflare Dashboard → Caching → Cache Rules → Create rule:

  • Match: Hostname equals cloud.yourdomain.com(以及其他動態服務子網域)
  • Then: Cache Eligibility → Bypass cache

同時確認 WebSocket 已開啟(Settings → Network → WebSockets)。

常見問題排查

問題原因解法
Tunnel Status 顯示 UNHEALTHYcloudflared 連線中斷重啟容器,確認 outbound 443/7844 未被封鎖
大檔案上傳失敗(413)Cloudflare 100MB request limit設 Nextcloud chunk ≤ 95 MiB 或改用客戶端 App
HTTPS 瀏覽器警告Origin Certificate 非公開 CA正常(對 Cloudflare 有效),確認 SSL 模式設 Full 或 Full Strict
Photos App 憑證錯誤預設憑證未設定確認 Origin Certificate 已設為 DSM 預設憑證

相關概念

來源