Cloudflare Tunnel 完整教學:不開路由器端口,也能讓服務對外公開
自架服務是件有趣的事——把 Gitea、Nextcloud、或自己寫的 Web App 跑在 NAS 上,然後想讓外面的人也能用。這時候大多數人會遇到三個障礙:
- IP 不固定:家用寬頻的 IP 每次重撥可能都不同,對方根本不知道要連哪裡
- 端口轉發麻煩且危險:路由器要開洞,把外部的連線直接導進家裡的 NAS,任何掃描器都找得到
- ISP 封鎖 80/443:很多家用方案直接把 HTTP/HTTPS 端口封死,想架網站只能繞路
DDNS 解決第一個問題,但第二、第三個還是擺在那裡。
Cloudflare Tunnel 把這三個問題一次解決,而且免費。
🎯 這篇適合誰
| 你的情況 | 建議先看哪段 |
|---|---|
| 想了解 Tunnel 的原理 | Cloudflare Tunnel 是什麼 |
| 直接想開始設定 | 需要準備什麼 |
| 想把多個服務對外公開 | 設定多個服務 |
| 想加強存取安全性 | 安全設定 |
| 想和其他方案比較 | Cloudflare Tunnel vs 其他方案比較 |
| 遇到問題 | 常見問題 |
Cloudflare Tunnel 是什麼
Cloudflare Tunnel(舊稱 Argo Tunnel)的核心概念是反向隧道:不是讓外部連線進來,而是你的 NAS 主動連出去,在 Cloudflare 的伺服器上建立一條加密隧道。
流程如下:
- NAS 上執行一個叫
cloudflared的小程式 cloudflared主動向 Cloudflare 建立長連線(outbound-only)- 外部用戶訪問
gitea.yourdomain.com,Cloudflare 接到請求後,透過這條隧道轉發到你的 NAS - NAS 回應,再由 Cloudflare 回傳給用戶
因為連線是從 NAS 主動發出去,路由器不需要開任何端口。Cloudflare 只看到你的 NAS 連出去的加密流量,外部掃描器完全看不到你家的 IP 或開放端口。
與傳統端口轉發相比,安全性的差異很明顯:
| 方式 | 外部可見 | 需要固定 IP | 攻擊面 |
|---|---|---|---|
| 端口轉發 | 家用 IP + 端口 | 建議要有 | 直接暴露 NAS |
| Cloudflare Tunnel | 僅 Cloudflare IP | 不需要 | Cloudflare 擋在前面 |
需要準備什麼
在開始之前,確認以下三樣東西都備齊:
- Cloudflare 帳號(免費):到 cloudflare.com 註冊,不需要付費方案
- 一個域名,並轉移到 Cloudflare DNS 管理:域名可以在任何地方買,但 DNS 需要指向 Cloudflare 的 Name Server。轉移後,Tunnel 才能自動建立 DNS 記錄
- NAS 上有要對外公開的服務:例如 Gitea(:3000)、Nextcloud(:8080)、或任何監聽在某個 port 的 Web 服務
域名轉移方式:登入 Cloudflare → Add a Site → 輸入域名 → 選 Free 方案 → Cloudflare 會給你兩個 Name Server → 到你的域名購買商那裡把 NS 改掉 → 等幾分鐘到幾小時生效。
安裝 cloudflared 在 NAS 上
cloudflared 是 Cloudflare 官方的隧道程式,負責維持那條從 NAS 連到 Cloudflare 的長連線。
方法一:Docker Compose(推薦,適合 NAS)
對 Synology 或其他跑 Docker 的 NAS 來說,Docker 方式最乾淨——版本更新、重啟管理都交給 Container Manager。
在 NAS 上建立一個目錄(例如 /volume1/docker/cloudflared/),新增 docker-compose.yml:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=eyJh...(從 Cloudflare 取得)
TUNNEL_TOKEN 的值在下一步建立 Tunnel 時會取得,先把這個檔案存好,等取得 token 再填入並執行 docker compose up -d。
方法二:直接下載 binary(適合一般 Linux)
如果是 Debian/Ubuntu 系的 Linux 主機:
# 下載並安裝
curl -L --output cloudflared.deb \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
# 驗證安裝
cloudflared --version
安裝後需要用 token 認證(指令在建立 Tunnel 後取得):
sudo cloudflared service install eyJh...(你的 token)
sudo systemctl enable --now cloudflared
在 Cloudflare 建立 Tunnel
這裡走的是 Zero Trust Dashboard,步驟如下:
Step 1:進入 Tunnels 頁面
登入 Cloudflare → 左側選單點 Zero Trust → Networks → 連接器(Tunnels) → 點「新增通道」。

Step 2:選擇通道類型
選擇 Cloudflared(另一個選項 Mesh 是測試版,用途不同)→ 點「選取 Cloudflared」。

Step 3:為通道命名並取得 Token
輸入一個好記的名稱,例如 synology-nas,儲存後下一頁選作業系統為 Docker,頁面會顯示含有 Token 的指令。把 Token(eyJh... 開頭的長字串)複製起來,貼到 docker-compose.yml 的 TUNNEL_TOKEN 欄位。

Step 4:在 Container Manager 建立專案
回到 NAS,開啟 Container Manager → 專案 → 建立,路徑選 /docker/cloudflared,來源選「建立 docker-compose.yml」,貼入設定並填入 Token。

Container 啟動後幾秒,Cloudflare Dashboard 上的 Tunnel 狀態會從 Inactive 變成 Healthy(綠色)。
Step 5:設定 Public Hostname
Tunnel 頁面 → 你的 Tunnel → 路由通道 → 填入以下資訊:
- 子網域:例如
vaultwarden - 網域:選取你的域名
- 類型:
HTTP - URL:
localhost:8888(對應你的服務 port)

儲存後,Cloudflare 會自動在 DNS 新增一筆 CNAME 記錄。幾秒後就可以從外部用 https://vaultwarden.yourdomain.com 訪問。
設定多個服務
一個 Tunnel 可以掛多個 Public Hostname,不需要跑多個 cloudflared。
在 Public Hostname 頁面繼續 Add a public hostname 即可:
| Subdomain | Domain | Service | URL |
|---|---|---|---|
gitea |
example.com |
HTTP | localhost:3000 |
files |
example.com |
HTTP | localhost:8080 |
app |
example.com |
HTTP | localhost:5000 |
每條 hostname 獨立設定,流量會由同一條 Tunnel 分發到不同的本地端口。
如果服務跑在另一台機器(例如同網路的另一台電腦),URL 改成那台機器的區域 IP:
http://192.168.1.50:8080
安全設定
Tunnel 建好後,subdomain.yourdomain.com 是公開可訪問的。如果服務本身沒有登入保護,任何人都能打開。Cloudflare 提供幾種額外的安全層。
Cloudflare Access:加一道登入牆
Zero Trust → Access → Applications → Add an application → 選 Self-hosted:
- Application name:自訂名稱
- Application domain:填你的 subdomain(例如
gitea.example.com)
建立後設定 Policy(誰可以進來):
- Email:只允許特定 email 地址
- Email domain:允許整個 email 網域(例如
@yourcompany.com) - IP ranges:只允許特定 IP 段
Email OTP 驗證
Access 預設支援 Email OTP——用戶訪問你的服務時,Cloudflare 會要求輸入 email,然後發送一次性驗證碼。不需要額外安裝任何東西,對個人使用的服務來說夠用。
更高安全性的場景可以接 GitHub OAuth、Google OAuth、或硬體 TOTP。
Cloudflare Tunnel vs 其他方案比較
| 方案 | 需要固定 IP | 需要開端口 | 費用 | 安全性 |
|---|---|---|---|---|
| Cloudflare Tunnel | 不需要 | 不需要 | 免費 | 高(Cloudflare 擋在前面) |
| DDNS + 端口轉發 | 不需要(DDNS 解決) | 需要 | 免費~低 | 低(NAS 直接暴露) |
| Tailscale | 不需要 | 不需要 | 免費(個人) | 高(僅授權裝置可存取) |
| VPS 反向代理 | VPS 有固定 IP | VPS 開端口 | 依 VPS 收費 | 中(取決於設定) |
幾個選擇的時機:
- 想讓完全不認識的人訪問你的服務(客戶、公開 API)→ Cloudflare Tunnel
- 只有自己或信任的人需要存取(個人用、家人)→ Tailscale 更合適
- 需要完整控制流量、自訂 nginx 設定→ VPS 反向代理
常見問題
Q1:重開機後 Tunnel 斷線,外部連不進來?
Docker 方式已設定 restart: unless-stopped,NAS 重開機後 Container 會自動重啟,Tunnel 會自動重新建立。如果用 binary 方式安裝,確認 systemd service 是否啟用:
sudo systemctl is-enabled cloudflared
# 應顯示 enabled
Q2:我的域名不在 Cloudflare,可以用 Tunnel 嗎?
不行,域名必須由 Cloudflare 管理 DNS,Tunnel 才能自動建立 CNAME 記錄。如果你的域名在 GoDaddy、Namecheap 等,可以只把 NS 改成 Cloudflare 的,域名所有權不需要轉移。
Q3:免費方案有流量限制嗎?
Cloudflare Tunnel 本身在免費方案下沒有明文的流量上限,但 Cloudflare 的服務條款禁止用免費方案大量串流影音(例如直接串流電影給很多人看)。一般的 Web 服務、檔案同步、個人部落格完全沒問題。
Q4:Cloudflare Tunnel 和 Tailscale 可以同時用嗎?
可以,而且這是很理想的架構:
- Tailscale:私人訪問,例如 SSH 進 NAS、存取家裡的 Samba 分享
- Cloudflare Tunnel:公開訪問,例如讓朋友用你架的服務、公開 API
兩者不衝突,裝在同一台 NAS 上完全沒問題。
總結
Cloudflare Tunnel 解決的是公開訪問的問題——讓外部任何人都能透過域名訪問你的服務,同時不暴露家用 IP、不開路由器端口。
Tailscale 解決的是私人訪問的問題——只有安裝了 Tailscale 並加入你的 network 的裝置才能連進來,適合個人或小團隊。
🔗 延伸閱讀
- Nginx Proxy Manager 反向代理完整教學
- Tailscale 在 Synology 的完整設定教學
- QuickConnect vs DDNS vs Tailscale:遠端存取方式比較
- Synology NAS 資安清單:帳號、網路與存取控制
如果你的服務需要公開,Cloudflare Tunnel 是目前最低門檻、最安全的方案。Docker Compose 幾行設定,Cloudflare Dashboard 點幾下,十五分鐘內就能跑起來。