Synology NAS 免開 Port 外網存取:Cloudflare Tunnel 完整設定教學
想從外面連回家中 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
因為連線是由內往外建立的,所以:
- 不用開 port:防火牆對入站流量依然全關
- 不用公網 IP:CGNAT、浮動 IP 都沒差
- 對外 IP 是 Cloudflare 的:掃描機器人找不到你家的真實位址
- HTTPS 憑證 Cloudflare 直接給:不用自己搞 Let’s Encrypt 續期
前置需求
- 一個自己的域名,DNS 託管在 Cloudflare(免費方案就夠)
- 一台能跑容器的 Synology NAS——本文用 Container Manager (舊版 DSM 叫 Docker 套件,操作大同小異)
步驟一:在 Zero Trust 後台建立 Tunnel
- 進入 Cloudflare Zero Trust 後台 (第一次會要你選方案,選 Free 即可。 注意:即使是免費方案,開通時也會要求綁一張信用卡或 PayPal, 單純驗證用,不會扣款——別被這步嚇到關掉)
- 左側 Networks → Tunnels → Create a tunnel
- 選 Cloudflared 作為 connector,取個名字(例如
nas) - 建立後會出現一段安裝指令,裡面有一長串
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 分頁新增對應:
| 欄位 | 填什麼 |
|---|---|
| Subdomain | photo |
| Domain | 你的域名 |
| Service Type | HTTP |
| URL | 192.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 一次性驗證碼),才碰得到你的服務。
- Zero Trust 後台 → Access → Applications → Add an application
- 選 Self-hosted,填上剛剛的 hostname(例如
photo.你的域名) - 建一條 Policy:Action 選 Allow,Include 選 Emails,填允許的信箱
之後打開網址會先看到 Cloudflare 的驗證頁, 輸入信箱收驗證碼,通過後才會進到 Synology Photos 的登入頁。 掃描機器人連你服務的第一個 byte 都拿不到。
使用上的限制,誠實說
- 單一請求上限 100 MB(免費方案):透過瀏覽器上傳大檔會失敗。 相簿瀏覽、文件預覽這類「看」的場景沒問題; 要大量上傳還是走 Tailscale 或在家裡區網做。
- 影音串流不是它的本業:Cloudflare 2023 年修訂條款後已不再一刀切禁止非網頁流量, 但大流量串流(Plex/Jellyfin)官方的立場是希望你用付費的媒體產品, 長期掛在免費 proxy 上仍有被關切的風險,自己衡量。
- DSM 管理介面(5000/5001)不建議直接掛公網 hostname, 真要掛,務必套 Access;管理入口能不暴露就不暴露。
Tailscale 還是 Cloudflare Tunnel?
| Tailscale | Cloudflare Tunnel | |
|---|---|---|
| 適合對象 | 自己與家人的裝置 | 任何有瀏覽器的人 |
| 對方要裝東西 | 要(client + 帳號) | 不用 |
| 需要域名 | 不用 | 要 |
| 大檔傳輸 | 沒限制(點對點) | 單一請求 100 MB |
| 可存取範圍 | 整台 NAS 甚至整個網段 | 只有你掛出去的服務 |
我的做法是兩個都上: 自己的裝置走 Tailscale,連 DSM、SSH、傳大檔; 要分享給別人的網頁型服務(相簿、筆記、狀態頁)走 Cloudflare Tunnel + Access。 兩者都不開 port,攻擊面依然是零。
小結
Cloudflare Tunnel 把「自架服務見得了人」的門檻降到一個下午: 免費、免開 port、免煩惱憑證,還能用 Access 決定誰進得來。 搭配 Tailscale 各司其職,家用 NAS 就能在攻擊面為零的前提下, 同時服務好自己和身邊的人。