Appearance
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 Encrypt | 90 天(需自動更新) | 低(若更新順利) | 更新失敗時服務中斷 |
| 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 客戶端(使用分片上傳)通常不受影響
繞過方案:
- 暫時將 DNS 設為 DNS-only(灰色雲朵)— 服務直接暴露 IP,安全性降低
- 使用 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 防護
部署設定參考
以下為實際部署時使用的完整設定,供日後查詢與複製使用。
環境參數
| 項目 | 值 |
|---|---|
| NAS | Synology(Intel Celeron J4125 或類似) |
| Cloudflare 方案 | Free plan |
| Tunnel daemon | cloudflare/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/TaipeiToken 取得方式:Cloudflare Zero Trust → Networks → Tunnels → 建立或選取 Tunnel → 選 Docker 部署 → 複製
--token後面的一長串代碼。
Public Hostname 設定範例
在 Cloudflare Zero Trust → Networks → Tunnels → [你的 Tunnel] → Public Hostname → Add a public hostname:
| 用途 | Subdomain | Service Type | URL(內網) | 特殊設定 |
|---|---|---|---|---|
| DSM 管理介面 | dsm | HTTPS | localhost:5001 | HTTP Settings → No TLS Verify ✅ |
| Synology Photos | photos | HTTPS | localhost:5001 | HTTP Settings → No TLS Verify ✅ |
| Nextcloud (LSIO) | cloud | HTTPS | localhost:1113 | HTTP Settings → No TLS Verify ✅ |
| Nextcloud (FPM/Memories) | cloud | HTTP | localhost:8880 | — |
| Immich | immich | HTTP | localhost: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
equalscloud.yourdomain.com(以及其他動態服務子網域) - Then: Cache Eligibility → Bypass cache
同時確認 WebSocket 已開啟(Settings → Network → WebSockets)。
常見問題排查
| 問題 | 原因 | 解法 |
|---|---|---|
| Tunnel Status 顯示 UNHEALTHY | cloudflared 連線中斷 | 重啟容器,確認 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 預設憑證 |
相關概念
- NAS 自建 Nextcloud (LinuxServer.io) — 透過此 Tunnel 架構暴露的 Nextcloud 服務(LSIO 版)
- Nextcloud + Memories 完整部署 — 透過此 Tunnel 架構暴露的 Nextcloud + 相簿服務
- MCP OAuth Well-Known Subpath 的 nginx Ingress 架構 — 另一種服務暴露架構(K8s Ingress vs Cloudflare Tunnel)
- Quartz + Cloudflare Pages 部署 — 以 Cloudflare Pages 發布靜態知識庫網站
- OpenSSL 自簽憑證產生 — 自簽憑證作為 Cloudflare Origin Certificate 的替代方案
- React + API + DB 服務遠端部署方案 — VPS + docker-compose 場景下使用 Cloudflare Tunnel 的完整部署決策指南