想從外面連回家中 NAS,Tailscale 這類 mesh VPN 是自己人用的最佳解。 但它有個前提——每台要連進來的裝置都得裝 client、登入帳號。 想把 NAS 上的相簿分享給爸媽看?要他們裝 VPN app,大概就沒有然後了。

Cloudflare Tunnel 解決的是另一半場景: 讓服務有一個正常的網址(例如 photo.danlufang.com), 任何人打開瀏覽器就能用,而你的路由器上依然一個 port 都不用開

Synology 用戶可能會想到 QuickConnect——它確實也免開 port, 但流量繞道 Synology 的中繼伺服器,速度慢到有感, 而且只支援 Synology 自家套件。Tunnel 走 Cloudflare 全球節點, 快得多,還能掛任何你自架的服務。

運作原理:方向反過來的連線

傳統 port forwarding 是「外面的人連進你家」; Cloudflare Tunnel 是 NAS 上跑一個叫 cloudflared 的小程式, 主動向外連到 Cloudflare 的邊緣節點,建立一條常駐的加密通道。

訪客連的是 Cloudflare 的伺服器,流量再從通道送回你的 NAS:

訪客瀏覽器 ──HTTPS──> Cloudflare 邊緣 <──通道(出站連線)── cloudflared @ NAS

因為連線是由內往外建立的,所以:

前置需求

  1. 一個自己的域名,DNS 託管在 Cloudflare(免費方案就夠)
  2. 一台能跑容器的 Synology NAS——本文用 Container Manager (舊版 DSM 叫 Docker 套件,操作大同小異)

步驟一:在 Zero Trust 後台建立 Tunnel

  1. 進入 Cloudflare Zero Trust 後台 (第一次會要你選方案,選 Free 即可。 注意:即使是免費方案,開通時也會要求綁一張信用卡或 PayPal, 單純驗證用,不會扣款——別被這步嚇到關掉)
  2. 左側 Networks → Tunnels → Create a tunnel
  3. Cloudflared 作為 connector,取個名字(例如 nas)
  4. 建立後會出現一段安裝指令,裡面有一長串 eyJ... 開頭的 token,把它複製起來

步驟二:在 NAS 上跑 cloudflared 容器

Container Manager → 專案 → 新增,貼上這份 compose:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=貼上剛剛複製的token

⚠️ 這串 token 等於整條 tunnel 的控制權:拿到它的人可以把自己的機器接上你的通道。 不要截圖外流、不要 commit 進公開的 git repo。 如果懷疑外洩,到 Tunnel 設定裡 rotate token 即可作廢舊的。

啟動後回到 Zero Trust 後台,Tunnel 狀態變成 HEALTHY 就成功了。

步驟三:把服務掛上網址

以掛 Synology Photos 為例。有個前置動作: Synology 的套件預設都是透過 DSM 本體(port 5000)存取, 如果直接把 5000 掛出去,對外暴露的會是 DSM 登入頁——這是我們最不想公開的東西。

所以先幫 Photos 要一個自己的 port: DSM 控制台 → 登入入口網站 → 應用程式, 找到 Synology Photos,編輯,指定一個自訂 port(例如 8801)。

然後在 Tunnel 的 Public Hostname 分頁新增對應:

欄位填什麼
Subdomainphoto
Domain你的域名
Service TypeHTTP
URL192.168.1.10:8801(改成你 NAS 的區網 IP 和剛設定的 port)

存檔後 Cloudflare 會自動建好 DNS 紀錄,photo.你的域名 立刻就能從外面開, 而且開下去是 Photos 的頁面,不是 DSM。

最常見的坑在這裡:URL 不要填 localhost。 cloudflared 跑在容器裡,localhost 指的是容器自己,不是 NAS—— 要填 NAS 的區網 IP。如果服務本身是 HTTPS(例如 DSM 的 5001), Service Type 選 HTTPS 之後,記得在 Additional application settings → TLS 打開 No TLS Verify,否則 Synology 的自簽憑證會讓連線失敗,吐 502。

步驟四:用 Cloudflare Access 加一道門

網址能直接開很方便,但等於服務的登入頁暴露給全世界。 給自己人用的服務,建議再套一層 Cloudflare Access: 訪客要先通過 Cloudflare 的驗證(例如 email 一次性驗證碼),才碰得到你的服務。

  1. Zero Trust 後台 → Access → Applications → Add an application
  2. Self-hosted,填上剛剛的 hostname(例如 photo.你的域名)
  3. 建一條 Policy:Action 選 Allow,Include 選 Emails,填允許的信箱

之後打開網址會先看到 Cloudflare 的驗證頁, 輸入信箱收驗證碼,通過後才會進到 Synology Photos 的登入頁。 掃描機器人連你服務的第一個 byte 都拿不到。

使用上的限制,誠實說

Tailscale 還是 Cloudflare Tunnel?

TailscaleCloudflare Tunnel
適合對象自己與家人的裝置任何有瀏覽器的人
對方要裝東西要(client + 帳號)不用
需要域名不用
大檔傳輸沒限制(點對點)單一請求 100 MB
可存取範圍整台 NAS 甚至整個網段只有你掛出去的服務

我的做法是兩個都上: 自己的裝置走 Tailscale,連 DSM、SSH、傳大檔; 要分享給別人的網頁型服務(相簿、筆記、狀態頁)走 Cloudflare Tunnel + Access。 兩者都不開 port,攻擊面依然是零。

小結

Cloudflare Tunnel 把「自架服務見得了人」的門檻降到一個下午: 免費、免開 port、免煩惱憑證,還能用 Access 決定誰進得來。 搭配 Tailscale 各司其職,家用 NAS 就能在攻擊面為零的前提下, 同時服務好自己和身邊的人。