家用 IP 不固定、不想開端口?Cloudflare Tunnel 幫你解決。

用 Cloudflare Tunnel 把家用 NAS 服務對外開放,不需要固定 IP,不需要設定路由器端口轉發,安全性比直接開 port 更高。這篇從原理到設定實作一次說清楚,包含子網域與 HTTPS 設定。

Cloudflare Tunnel 完整教學:不開路由器端口,也能讓服務對外公開

自架服務是件有趣的事——把 Gitea、Nextcloud、或自己寫的 Web App 跑在 NAS 上,然後想讓外面的人也能用。這時候大多數人會遇到三個障礙:

  1. IP 不固定:家用寬頻的 IP 每次重撥可能都不同,對方根本不知道要連哪裡
  2. 端口轉發麻煩且危險:路由器要開洞,把外部的連線直接導進家裡的 NAS,任何掃描器都找得到
  3. ISP 封鎖 80/443:很多家用方案直接把 HTTP/HTTPS 端口封死,想架網站只能繞路

DDNS 解決第一個問題,但第二、第三個還是擺在那裡。

Cloudflare Tunnel 把這三個問題一次解決,而且免費。

🎯 這篇適合誰

你的情況 建議先看哪段
想了解 Tunnel 的原理 Cloudflare Tunnel 是什麼
直接想開始設定 需要準備什麼
想把多個服務對外公開 設定多個服務
想加強存取安全性 安全設定
想和其他方案比較 Cloudflare Tunnel vs 其他方案比較
遇到問題 常見問題

Cloudflare Tunnel 是什麼

Cloudflare Tunnel(舊稱 Argo Tunnel)的核心概念是反向隧道:不是讓外部連線進來,而是你的 NAS 主動連出去,在 Cloudflare 的伺服器上建立一條加密隧道。

流程如下:

  1. NAS 上執行一個叫 cloudflared 的小程式
  2. cloudflared 主動向 Cloudflare 建立長連線(outbound-only)
  3. 外部用戶訪問 gitea.yourdomain.com,Cloudflare 接到請求後,透過這條隧道轉發到你的 NAS
  4. NAS 回應,再由 Cloudflare 回傳給用戶

因為連線是從 NAS 主動發出去,路由器不需要開任何端口。Cloudflare 只看到你的 NAS 連出去的加密流量,外部掃描器完全看不到你家的 IP 或開放端口。

Cloudflare Tunnel 架構

與傳統端口轉發相比,安全性的差異很明顯:

方式 外部可見 需要固定 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 TrustNetworks連接器(Tunnels) → 點「新增通道」。

Networks → 連接器頁面

Step 2:選擇通道類型

選擇 Cloudflared(另一個選項 Mesh 是測試版,用途不同)→ 點「選取 Cloudflared」。

選取 Cloudflared

Step 3:為通道命名並取得 Token

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

選 Docker,複製 Token

Step 4:在 Container Manager 建立專案

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

Container Manager 建立 cloudflared 專案

Container 啟動後幾秒,Cloudflare Dashboard 上的 Tunnel 狀態會從 Inactive 變成 Healthy(綠色)。

Step 5:設定 Public Hostname

Tunnel 頁面 → 你的 Tunnel → 路由通道 → 填入以下資訊:

  • 子網域:例如 vaultwarden
  • 網域:選取你的域名
  • 類型HTTP
  • URLlocalhost:8888(對應你的服務 port)

設定 Public Hostname

儲存後,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 → AccessApplicationsAdd 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 的裝置才能連進來,適合個人或小團隊。

🔗 延伸閱讀

如果你的服務需要公開,Cloudflare Tunnel 是目前最低門檻、最安全的方案。Docker Compose 幾行設定,Cloudflare Dashboard 點幾下,十五分鐘內就能跑起來。

這篇有幫助嗎? 家用 IP 不固定、不想開端口?Cloudflare Tunnel 幫你解決。