2026 年 Cloudflare Tunnel 免公網 IP 穿透:安全發布本地服務

modern%20workspace%20with%20laptop%2C%20smartphone...
發表時間:2026 年 09 月 20 日 | 更新日期:2026 年 09 月 20 日 | 編輯:雅寶社區編輯團隊
2026 年 Cloudflare Tunnel 免公網 IP 穿透:安全發布本地服務|environment: - 雅寶社區 · 頂客論壇
  • TZ=Asia/Taipei

安裝好工具之後,接下來要建立 Tunnel 並把網域接上去。2026 年的 Cloudflare Dashboard 已經把整個流程做得很直覺,新手建議先走 Dashboard 路線;熟悉之後再改用 CLI 或設定檔模式,會更有掌控感。

4-1 路線 A:Dashboard 圖形化建立(推薦新手)

進入 Zero Trust → Networks → Tunnels,點選「Create a tunnel」。介面會問你幾個問題:

選擇連線器類型:選 cloudflared。

  • 命名 Tunnel:取一個你認得出來的名字,例如 home-nas 或 office-web。這個名字只是給你辨識用,不影響功能。
  • 選擇環境:Dashboard 會根據你選的作業系統,產生對應的安裝指令。這裡的關鍵是那串 --token,它包含了 Tunnel 的 ID 與授權資訊。請把 token 當成密碼看待,不要貼到公開場合。
  • 複製安裝指令:照著跑一次,稍等幾秒,Dashboard 就會顯示 Connector 已連線(通常會出現兩個以上的連線,代表高可用性生效)。
  • 連線成功後,切到「Public Hostname」頁籤,新增一筆路由。你需要填:

    Subdomain:例如 nas。

    Domain:選擇你的網域。

    Path:通常留空。

  • Service Type:多數情況選 HTTP,若本地服務有跑 TLS 就選 HTTPS。
  • URL:例如 localhost:5000 或 192.168.1.10:8080。
  • 儲存之後,Cloudflare 會自動幫你建立對應的 CNAME 記錄。這個自動化流程是 Dashboard 路線最大的價值——不用手動去 DNS 頁面設定,也不用記那些 UUID。

    4-2 路線 B:CLI 本機建立與 token 管理

    如果你偏好完全用命令列掌控,流程如下:

    # 1. 登入並授權(會開啟瀏覽器,選擇你的網域)

    cloudflared tunnel login

    2. 建立 Tunnel(名稱自取)

    cloudflared tunnel create home-lab

    3. 列出 Tunnel,記下 ID 與憑證路徑

    cloudflared tunnel list

    4. 建立 DNS 路由

    cloudflared tunnel route dns home-lab nas.example.com

    5. 執行 Tunnel

    cloudflared tunnel run home-lab

    cloudflared tunnel login 會在 ~/.cloudflared/ 下產生憑證檔(cert.pem),而 tunnel create 會產生該 Tunnel 專屬的 JSON 憑證檔。這兩個檔案都是敏感資訊,權限建議設為 600。

    如果你想把本機模式轉為遠端託管(也就是可以透過 Dashboard 管理),可以執行:

    cloudflared tunnel token home-lab

    這會輸出一串 token,你可以把它交給 systemd 或 Docker 使用,之後就能在 Dashboard 上調整路由與政策,不必登入主機改設定檔。

    4-3 DNS CNAME 與 Public Hostname 設定

    不管你走哪條路線,最終在 DNS 上看到的都是一筆 CNAME 記錄,指向 <tunnel-id>.cfargotunnel.com。這筆記錄的「代理狀態」(橘色雲朵)必須是開啟的,否則流量不會經過 Cloudflare 邊緣,Tunnel 也就不會生效。

    有幾個實務上的小技巧:

  • 子網域命名要有邏輯。例如 nas、ha、media、dev,一眼就能看出用途。
  • 不要用萬用字元 DNS 然後全部指向同一條 Tunnel,除非你確定後端有相對應的路由。萬用字元很容易造成意料之外的暴露面。
  • 如果同一個網域要同時服務公開網站與私人服務,建議把私人服務放在另一個子網域,並套用 Access 政策,避免政策設定錯誤導致私人服務外洩。
  • 4-4 憑證與 config.yml 進階設定(ingress 規則)

    當你的服務超過三、四個,用 Dashboard 一個個點就會開始煩躁。這時候本機設定檔模式會更有效率。典型結構如下:

    tunnel: home-lab

    originRequest:

    connectTimeout: 30s

    noTLSVerify: false

    httpHostHeader: nas.example.com

    ingress:

    規則由上往下比對,第一條符合的就生效

    • hostname: nas.example.com

    service: http://localhost:5000

    • hostname: ha.example.com

    service: http://localhost:8123

    • hostname: media.example.com

    service: http://localhost:8096

    originRequest:

    影音串流建議拉長逾時

    connectTimeout: 60s

    disableChunkedEncoding: true

    • hostname: ssh.example.com

    service: ssh://localhost:22

    最後一定要有這條,否則未匹配的請求會回傳錯誤

    • service: http_status:404

    幾個容易忽略的重點:

  • ingress 規則是順序敏感的。Cloudflare 會從上往下比對,第一條符合 hostname 的就直接採用,後面的不會再檢查。所以要把最特殊的規則放前面,最通用的放後面。
  • 最後一條 catch-all 是強制建議。沒有它,未匹配的流量可能會有意外的行為,而且 cloudflared 啟動時也可能抱怨設定不完整。
  • originRequest 可以針對單一 hostname 覆寫。例如影音服務需要更長的逾時、某些應用需要停用 chunked encoding,都可以個別設定。
  • httpHostHeader 對於某些後端應用很重要。有些應用會根據 Host 標頭判斷存取來源,如果沒有正確帶入,可能會出現 400 或重新導向錯誤。
  • 五、安全發布:把「有對外開放」變成「只有你能進」

    這是整篇文章最核心的章節。很多人以為用了 Tunnel 就等於安全,其實不然。Tunnel 解決的是「網路層暴露」的問題,但你的應用程式本身仍然可能被任何人存取。真正讓安全性提升一個檔次的,是 Cloudflare Access。

    5-1 Cloudflare Access 應用程式與政策設計

    Access 的運作邏輯是:當使用者請求某個受保護的網域時,Cloudflare 邊緣會先攔截,要求通過身分驗證,通過之後才把請求轉進 Tunnel。也就是說,未經授權的人連你的服務登入頁面都看不到,更別說嘗試暴力破解。

    建立流程:Zero Trust → Access → Applications → Add an application → Self-hosted。填寫你要保護的網域(例如 nas.example.com),然後在 Policies 區段新增規則。

    政策的組成是「動作(Action)+ 條件(Include / Require / Exclude)」:

    Action: Allow — 符合條件者放行。

    Action: Block — 符合條件者直接封鎖。

  • Action: Bypass — 完全跳過驗證,等於不保護。務必謹慎使用。
  • Action: Service Auth — 給機器對機器(M2M)存取使用,例如 API 呼叫。
  • 常見的 Include 條件有:Emails(特定 Email)、Emails ending in(整個網域)、IP ranges(特定 IP 段)、Country(國家)、Azure AD group、GitHub organization 等等。

    一個務實的政策組合範例:

    Allow:Email 等於 [email protected](自己)

    Allow:Email 結尾等於 @mycompany.com(同事)

    Block:所有其他(或直接用預設拒絕)

    最外層還有一個「Default Deny」的開關,建議保持開啟。這樣即使政策寫錯,預設行為仍然是拒絕,而不是意外放行。

    5-2 三種身分驗證:Email OTP、SSO、Service Token

    Access 支援的登入方式很多,以下是最常用的三種:

    Email OTP(一次性密碼):最簡單、零設定。使用者輸入 Email,Cloudflare 寄一組六位數驗證碼,輸入即可。缺點是體驗較差,而且如果 Email 被盜用就等於被攻破。建議搭配 TOTP 或將其視為最低限度的防護。

    SSO(單一登入):支援 Google、GitHub、Microsoft Entra ID、Okta 等。這是體驗最好的方式,而且安全性取決於你原本的帳號安全(通常已有 MFA)。個人使用推薦 Google 或 GitHub,企業環境則用 Entra ID 或 Okta。設定時需要建立 OAuth 應用程式並填入 Client ID / Secret。

    Service Token:給程式呼叫用。你會拿到一組 Client ID 與 Client Secret,之後在請求標頭帶上 CF-Access-Client-Id 與 CF-Access-Client-Secret 即可通過驗證。這在串接 API、自動化腳本、監控系統時非常實用。記得 token 要以安全方式儲存,並且設定到期時間。

    5-3 進階防護:WARP、mTLS、IP 白名單

    如果你的安全需求再高一點,可以考慮這些做法:

  • WARP 用戶端:Cloudflare 的 WARP 是一種輕量 VPN。你可以設定政策,要求只有透過 WARP 連線的裝置才能存取特定服務。這等於把「誰能連」從帳號層級提升到裝置層級,對於管理員後台這種高敏感服務特別有用。
  • mTLS(雙向 TLS):要求用戶端出示憑證,適合企業內部系統或自動化流程。設定上需要在 Cloudflare 上傳 CA 憑證,並在用戶端安裝對應的用戶憑證。
  • IP 白名單:在 Access 政策中加入 IP ranges 條件,只允許特定來源 IP。這在「我固定從公司或特定機房連線」的情境下很有用,但對行動使用者就不太實際。
  • 地理限制:如果你的服務完全不需要讓某些國家的人存取,可以直接在 WAF 層加入封鎖規則,減少掃描與攻擊嘗試。
  • 5-4 常見錯誤:把 Tunnel 當成無風險的萬能鑰匙

    最後要澆一盆冷水。以下這些錯誤我見過太多次:

  • 以為有了 Tunnel 就不用管應用程式安全。錯。Tunnel 只保護網路層,你的服務如果有 SQL Injection 或預設密碼,一樣會出事。
  • 把管理介面設成 Bypass 或公開。有些人圖方便,把 NAS 管理頁面設成不驗證,這等於把保險箱鑰匙掛在門口。
  • Service Token 沒有設到期日。長期有效的 token 一旦洩漏,就是永久後門。
  • 只在主網域設政策,忘記子網域。Access 政策是逐一綁定網域的,新增子網域時務必記得同步加上保護。
  • 忽略日誌。Access 的日誌會記錄誰在什麼時間嘗試存取,定期檢查可以及早發現異常。
  • 六、十大實戰場景設定範例

    6-1 自架網站與 Web 服務

    這是最單純的場景。假設你的網站跑在 localhost:3000:

    - hostname: blog.example.com

    service: http://localhost:3000

    如果網站需要處理上傳檔案或長時間請求,建議調整 originRequest 的逾時設定,避免大檔案上傳到一半被切斷。另外,如果你的應用會檢查 X-Forwarded-For 來取得真實 IP,Cloudflare 會自動帶入,這點通常不需要額外設定。

    6-2 NAS 檔案存取(Synology DSM)

    Synology DSM 預設走 HTTP 5000 或 HTTPS 5001。由於 DSM 是管理介面,強烈建議套用 Access 政策,並且只允許自己的 Email:

    - hostname: nas.example.com

    service: https://localhost:5001

    originRequest:

    noTLSVerify: true

    httpHostHeader: nas.example.com

    noTLSVerify: true 是因為 DSM 多半使用自簽憑證,Cloudflare 到本地這段驗證不過。這在內網環境是可接受的,因為外層到 Cloudflare 之間仍然是加密的。

    6-3 Home Assistant 智慧家庭

    Home Assistant 預設埠是 8123。這裡有幾個要注意的地方:

    - hostname: ha.example.com

    service: http://localhost:8123

    首先,Home Assistant 有自己的身分驗證機制,所以在 Access 政策上可以選擇「不全部擋」,而是允許家庭成員登入。或者更嚴謹一點,用 Access 做第一層把關,再讓 HA 做第二層角色控管。

    其次,如果要使用 HA 的手機 App 或語音助理整合(例如 Google Assistant 或 Alexa),要特別注意這些服務需要能直接連線,不能被 Access 攔截。常見做法是另外開一個子網域專門給這些整合使用,並用 Service Token 或較寬鬆的政策處理。這部分的設定眉角較多,建議先在社群查詢對應版本的官方文件。

    6-4 Jellyfin / Plex 媒體串流

    影音串流對頻寬與逾時比較敏感:

    - hostname: media.example.com

    service: http://localhost:8096

    originRequest:

    connectTimeout: 60s

    disableChunkedEncoding: true

    disableChunkedEncoding: true 在某些播放器與 CDN 組合下可以避免串流中斷。另外,串流服務通常不適合套用 Access,因為播放器客戶端不一定支援互動式登入。實務上常見的做法是:對網頁介面套用 Access,但對媒體串流路徑使用較寬鬆的政策,或搭配 Jellyfin 自身的使用者驗證。

    也要提醒,透過 Cloudflare 免費方案傳輸大量影片,雖然技術上可行,但如果流量已經接近商業等級,建議評估付費方案,避免服務條款爭議。

    6-5 SSH、RDP、資料庫等非 HTTP 服務

    Tunnel 不只支援 HTTP,也支援 SSH、RDP、SMB、TCP 等協定。以 SSH 為例:

    - hostname: ssh.example.com

    service: ssh://localhost:22

    設定好之後,用戶端需要安裝 cloudflared 並設定 ~/.ssh/config:

    Host ssh.example.com

    ProxyCommand cloudflared access ssh --hostname %h

    User your-username

    之後直接 ssh ssh.example.com 即可。整個過程會經過 Cloudflare 的 Access 驗證(如果有設定的話),安全性遠高於直接把 SSH 埠開到公網——後者幾乎每天都會被嘗試登入上千次。

    RDP 的設定類似,service type 選 rdp://localhost:3389,用戶端則使用 cloudflared access rdp。資料庫則建議只在內網使用,或透過 Access + Service Token 嚴格控管。

    6-6 多服務共用一條 Tunnel 的 ingress 寫法

    當服務很多時,與其建立多條 Tunnel,不如一條 Tunnel 搭配完整的 ingress 規則。這樣管理起來更集中,也能共用同一組連線。範例:

    tunnel: home-lab

    ingress:

    • hostname: www.example.com

    service: http://localhost:3000

    • hostname: nas.example.com

    service: https://localhost:5001

    originRequest:

    noTLSVerify: true

    httpHostHeader: nas.example.com

    • hostname: ha.example.com

    service: http://localhost:8123

    • hostname: media.example.com

    service: http://localhost:8096

    • hostname: ssh.example.com

    service: ssh://localhost:22

    • hostname: db.example.com

    service: tcp://localhost:5432

    • service: http_status:404

    搭配 systemd 執行:

    sudo cloudflared --config /etc/cloudflared/config.yml tunnel run

    如果要用 systemd unit 管理,記得在 ExecStart 中帶上 --config 參數,並設定 Restart=always。

    七、效能、可靠性與維運

    7-1 延遲與頻寬實測觀念

    很多人會問:「透過 Cloudflare 繞一圈,會不會變慢?」答案取決於你的位置與 Cloudflare 節點的距離。Cloudflare 在全球有數百個節點,通常使用者會連到最近的節點,而你的 cloudflared 也會連到最近的節點。整體延遲大約增加 10 到 50 毫秒,對於一般網頁與檔案存取幾乎無感。

    但對於即時性要求高的應用(例如遊戲伺服器、VoIP),這個額外延遲就可能造成影響。這種情況下,建議改用 Tailscale 或直連 VPN。

    頻寬方面,Cloudflare 免費方案沒有硬性上限,實測上要跑滿家用上傳頻寬(例如 100Mbps 或 1Gbps)通常沒有問題。真正會成為瓶頸的,往往是你的本地機器效能或應用程式本身。

    7-2 多條 Tunnel 複本與 Load Balancer

    當你只有一台主機時,cloudflared 會自動建立多條連線到不同資料中心,這已經提供了基本的高可用性。但如果你的服務不能中斷(例如公司對外網站),可以考慮在兩台以上的機器上各跑一條 Tunnel,並透過 Cloudflare 的 Load Balancer 做流量分配與健康檢查。

    不過 Load Balancer 是付費功能,個人使用未必需要。較經濟的做法是:在主機上用 systemd 設定自動重啟,並監控 Tunnel 狀態;若主機掛掉,至少 Cloudflare 會回傳錯誤頁面而不是讓使用者連到錯誤的地方。

    7-3 日誌、監控與告警

    維運的關鍵是「出事時你能多快知道」。建議至少做到:

  • Cloudflare Dashboard 的 Analytics:可以看到請求量、錯誤率、延遲分布。異常的流量尖峰或大量 4xx/5xx 都是警訊。
  • Access 的稽核日誌:記錄誰通過驗證、誰被拒絕。免費用戶的日誌保留時間較短,重要服務建議定期匯出。
  • 本機日誌:cloudflared 的日誌可以看到與 Cloudflare 的連線狀態。建議設定日誌輪替,避免塞爆硬碟。
  • Uptime 監控:用外部服務(例如 UptimeRobot)定期檢查你的網域,一有異常就發通知。
  • 7-4 自動更新與開機自啟

    如果你用 APT 安裝,可以用 unattended-upgrades 自動更新;Docker 則建議搭配 Watchtower 或類似的工具,但要注意自動更新有時會帶來非預期的行為變化,重要環境建議改為手動更新並先測試。

    開機自啟的部分,systemd 與 Docker 的 restart: unless-stopped 都能處理。Windows 服務則在安裝時就已設定為自動啟動。務必實際重開機測試一次,確認服務真的會自己回來。

    八、疑難排解:最常見的 8 個錯誤訊息

    1. 502 Bad Gateway

    最常見的原因是你的本地服務沒在跑,或 ingress 規則裡的埠號/主機位址寫錯。先在主機上 curl localhost:埠號 確認服務正常,再檢查設定檔。若使用 Docker 且不是 host 網路模式,localhost 指的是容器自己,要改成服務名稱或 host.docker.internal。

    2. 1033 Argo Tunnel error

    代表 cloudflared 沒有跟 Cloudflare 建立連線。檢查網路是否允許對外 7844 埠(QUIC)或 443 埠(HTTP2)的連線。有些企業防火牆會阻擋 UDP,這時可以加上 --protocol http2 強制走 TCP。

    3. 530 / 1016 Origin DNS error

    通常是 DNS 記錄沒有正確建立,或 CNAME 指向錯誤。到 DNS 頁面確認 CNAME 是否指向 <tunnel-id>.cfargotunnel.com,且代理狀態為開啟。

    4. Tunnel 顯示 Connected 但網頁連不上

    檢查 Public Hostname 的設定是否與你實際訪問的網域一致。常見錯誤是設定了 nas.example.com,但使用者卻輸入 www.example.com。另外也要確認 ingress 規則的順序正確。

    5. Access 登入後不斷重新導向

    通常是應用的 cookie 設定與 Cloudflare 衝突,或是應用的 Session 網域設定不正確。檢查應用程式的 base_url 或 trusted_proxies 設定。

    6. 上傳大檔案中斷

    調整 originRequest.connectTimeout 與 proxyTimeout。另外某些語言的框架有自己的上傳大小限制,也要一併調整。

    7. WebSocket 連不上

    Cloudflare 預設支援 WebSocket,通常不需要特別設定。若連不上,檢查應用程式的 WebSocket 路徑是否被 Access 政策或 WAF 規則阻擋。

    8. cloudflared 啟動時報 credentials 錯誤

    檢查 JSON 憑證檔的路徑與權限。常見問題是使用 Docker 時沒有把憑證檔掛載進容器,或檔案權限不正確導致讀取失敗。

    九、常見問題 FAQ

    Q1:Cloudflare Tunnel 真的完全免費嗎?

    Tunnel 本身在免費方案中沒有流量限制,Zero Trust 的免費方案也涵蓋基本的 Access 功能。但如果你的使用規模已達商業等級,或需要進階的日誌保留、SAML、Load Balancer 等功能,就會需要付費方案。

    Q2:我的網域一定要放在 Cloudflare 嗎?

    是的,這是硬性要求。因為 Tunnel 的路由依賴 Cloudflare 的權威 DNS 與邊緣網路。如果你不想轉移整個網域,技術上可以只把子網域的 NS 委派給 Cloudflare,但設定上會複雜不少。

    Q3:透過 Tunnel 的流量會被 Cloudflare 看到嗎?

    Cloudflare 在邊緣負責 TLS 終止,所以技術上 Cloudflare 可以看到明文內容(除非你使用 End-to-End 加密的進階設定)。對多數個人與一般企業來說,這是可接受的取捨;如果是高度敏感的資料,建議在應用層再加一道端到端加密。

    Q4:可以用來做遊戲伺服器嗎?

    技術上可以轉發 TCP/UDP,但 Cloudflare 的免費方案主要設計給 HTTP/HTTPS 流量,遊戲的即時性與協定特性可能造成體驗不佳。這種場景建議考慮 Tailscale 或直接租用有公網 IP 的 VPS。

    Q5:手機上要怎麼存取受 Access 保護的服務?

    手機瀏覽器可以直接使用,登入流程與桌面相同。若是原生 App,則需要該 App 支援 Cookie 或 Token 機制。部分 App 可以透過 WARP 用戶端繞過登入頁面,但設定較複雜。

    Q6:Tunnel 斷線多久會自動恢復?

    cloudflared 會自動嘗試重新連線,通常在幾秒到幾十秒內恢復。Cloudflare 邊緣也會在連線恢復後立即恢復導流。若長時間無法恢復,通常是本地網路或雲端服務本身有問題。

    Q7:我需要為每個服務建立獨立的 Tunnel 嗎?

    不需要。一條 Tunnel 可以透過 ingress 規則服務多個網域與服務。只有在需要隔離(例如不同環境、不同團隊)或需要獨立擴展時,才建議建立多條 Tunnel。

    Q8:舊版的 Argo Tunnel 還能用嗎?

    Argo Tunnel 這個名稱已經被淘汰,相關指令與服務也早已整合進 Cloudflare Tunnel。如果你還在用非常舊的版本,建議盡快升級,否則可能遇到相容性問題或安全性風險。

    結語:把複雜留給 Cloudflare,把安全留給自己

    回顧這整篇文章,Cloudflare Tunnel 真正解決的,是自架玩家長年以來的結構性困境:我們想要擁有自己的服務、自己的資料、自己的掌控權,但不想為此變成半個網路安全專家,也不想每天擔心被掃埠、被入侵。

    透過 Tunnel,你把「網路暴露」這個最難處理的問題外包給了 Cloudflare 的全球邊緣網路;透過 Access,你把「誰能進來」這個最關鍵的決策權牢牢握在自己手上。而你唯一需要維護的,就是那台跑著 cloudflared 的機器,以及你對自己服務的了解。

    2026 年的現在,這套方案已經成熟到幾乎沒有理由不用。無論你只是想把家裡的 NAS 安全地開放給自己,還是要為小型團隊建立一套對外的服務入口,Cloudflare Tunnel 都是那個「設定一次、長期受益」的選擇。花一個下午把它架好,接下來的好幾年,你都能省下無數次跟防火牆規則搏鬥的時間。

    如果你在實作過程中遇到本文沒涵蓋的狀況,歡迎到「雅寶社區 · 頂客論壇」的 3C 科技教學板塊發文討論,把你踩到的坑與解法分享出來,讓更多人少走一點冤枉路。

    ```

    🏠 返回首頁