<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zero-Trust on recca0120 技術筆記</title><link>https://recca0120.github.io/tags/zero-trust/</link><description>Recent content in Zero-Trust on recca0120 技術筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-hant-tw</language><lastBuildDate>Tue, 14 Apr 2026 20:00:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/tags/zero-trust/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 年用 Cloudflare Tunnel：不開 port、不買 IP，把本機服務推上公網</title><link>https://recca0120.github.io/2026/04/14/cloudflare-tunnel-2026/</link><pubDate>Tue, 14 Apr 2026 20:00:00 +0800</pubDate><guid>https://recca0120.github.io/2026/04/14/cloudflare-tunnel-2026/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post 2026 年用 Cloudflare Tunnel：不開 port、不買 IP，把本機服務推上公網" /&gt;&lt;p&gt;家裡跑了一個 side project，想讓客戶能看到 demo；公司 NUC 跑了內部工具，想在外面也能連進去。傳統做法是去買一個靜態 IP、在 router 上開 port forwarding、再自己搞 Let&amp;rsquo;s Encrypt 憑證——這些步驟 2026 年都可以跳過。&lt;/p&gt;
&lt;p&gt;Cloudflare Tunnel（cloudflared）幫你做完所有髒活：從本機&lt;strong&gt;主動連出去&lt;/strong&gt;到 Cloudflare 邊緣節點，所有進來的流量走這條連線回你家。不用開 port、不用公網 IP、免費拿到 Cloudflare 的 DDoS 防護跟 WAF。&lt;/p&gt;
&lt;h2 id="為什麼是-cloudflare-tunnel"&gt;&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc%e6%98%af-cloudflare-tunnel" class="header-anchor"&gt;&lt;/a&gt;為什麼是 Cloudflare Tunnel
&lt;/h2&gt;&lt;p&gt;市面上類似工具不少，三個主流取向不太一樣：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;自訂網域&lt;/th&gt;
 &lt;th&gt;身份驗證&lt;/th&gt;
 &lt;th&gt;自架 relay&lt;/th&gt;
 &lt;th&gt;TCP 支援&lt;/th&gt;
 &lt;th&gt;免費上限&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Cloudflare Tunnel&lt;/td&gt;
 &lt;td&gt;✅ 免費&lt;/td&gt;
 &lt;td&gt;✅ 內建 Access&lt;/td&gt;
 &lt;td&gt;❌ CF 代管&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;很寬鬆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ngrok&lt;/td&gt;
 &lt;td&gt;付費才有&lt;/td&gt;
 &lt;td&gt;付費加購&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;付費&lt;/td&gt;
 &lt;td&gt;有連線數限制&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tailscale Funnel&lt;/td&gt;
 &lt;td&gt;有限&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;P2P&lt;/td&gt;
 &lt;td&gt;❌ 僅 HTTPS&lt;/td&gt;
 &lt;td&gt;只開 3 個 port&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;frp&lt;/td&gt;
 &lt;td&gt;看你自己&lt;/td&gt;
 &lt;td&gt;自己接&lt;/td&gt;
 &lt;td&gt;✅ 要自架&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;td&gt;看你機器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Tunnel 最大的差異&lt;/strong&gt;：它不只是「把流量導進來」，而是把你家服務接上 Cloudflare 整個 Zero Trust 平台——可以直接套 Access 做 SSO、email OTP、走 WAF 擋攻擊、要 SSH 的話用瀏覽器就能連。這些對 ngrok 是付費功能，對 Tailscale Funnel 是沒這東西。&lt;/p&gt;
&lt;h2 id="2026-年推薦流程zero-trust-dashboard"&gt;&lt;a href="#2026-%e5%b9%b4%e6%8e%a8%e8%96%a6%e6%b5%81%e7%a8%8bzero-trust-dashboard" class="header-anchor"&gt;&lt;/a&gt;2026 年推薦流程：Zero Trust Dashboard
&lt;/h2&gt;&lt;p&gt;過去用 &lt;code&gt;cloudflared&lt;/code&gt; 多半靠 &lt;code&gt;config.yml&lt;/code&gt; 本機設定。2026 年 Cloudflare 把主力推到 &lt;strong&gt;remotely-managed tunnels&lt;/strong&gt;——設定在雲端 dashboard，本機 cloudflared 只拿一個 token 跑起來。好處是多台機器共用、改 ingress 不用重啟、多個 replica 自動 HA。&lt;/p&gt;
&lt;p&gt;進入 &lt;a class="link" href="https://one.dash.cloudflare.com" target="_blank" rel="noopener"
 &gt;one.dash.cloudflare.com&lt;/a&gt; → &lt;strong&gt;Networks → Tunnels → Create a tunnel → Cloudflared&lt;/strong&gt;，取個名字之後複製安裝指令。&lt;/p&gt;
&lt;h2 id="安裝-cloudflared"&gt;&lt;a href="#%e5%ae%89%e8%a3%9d-cloudflared" class="header-anchor"&gt;&lt;/a&gt;安裝 cloudflared
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Linux（Debian/Ubuntu）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -L https://pkg.cloudflare.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --name cf-tunnel --restart unless-stopped &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cloudflare/cloudflared:latest &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; tunnel --no-autoupdate run --token eyJhbGci...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;裝好之後，把 dashboard 給你的 token 塞進去：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cloudflared service install eyJhbGci...TOKEN...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這條指令會建 systemd service（Linux）或 launchd plist（macOS），開機自動跑，當機自動重啟。回 dashboard 看 tunnel 狀態，綠燈 &lt;strong&gt;Healthy&lt;/strong&gt; 就成了。&lt;/p&gt;
&lt;h2 id="把-localhost3000-推到-fooexamplecom"&gt;&lt;a href="#%e6%8a%8a-localhost3000-%e6%8e%a8%e5%88%b0-fooexamplecom" class="header-anchor"&gt;&lt;/a&gt;把 localhost:3000 推到 foo.example.com
&lt;/h2&gt;&lt;p&gt;前提：&lt;code&gt;example.com&lt;/code&gt; 已經把 DNS 指到 Cloudflare（Name servers 換成 Cloudflare 那對）。&lt;/p&gt;
&lt;p&gt;回到 tunnel 設定頁，切到 &lt;strong&gt;Public Hostname&lt;/strong&gt; 頁籤 → &lt;strong&gt;Add a public hostname&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;欄位&lt;/th&gt;
 &lt;th&gt;值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Subdomain&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;foo&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Domain&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Service Type&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;HTTP&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;URL&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;localhost:3000&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;存檔完，Cloudflare 自動幫你在 DNS 建一筆 CNAME：&lt;code&gt;foo.example.com → &amp;lt;tunnel-uuid&amp;gt;.cfargotunnel.com&lt;/code&gt;。打開 &lt;code&gt;https://foo.example.com&lt;/code&gt;，憑證是 Cloudflare 的 edge cert，你本機完全不用裝 TLS。&lt;/p&gt;
&lt;h2 id="加身份驗證zero-trust-access"&gt;&lt;a href="#%e5%8a%a0%e8%ba%ab%e4%bb%bd%e9%a9%97%e8%ad%89zero-trust-access" class="header-anchor"&gt;&lt;/a&gt;加身份驗證：Zero Trust Access
&lt;/h2&gt;&lt;p&gt;不想讓 demo 網址被陌生人掃到？加個登入閘：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero Trust → Access → Applications → Add an application → Self-hosted&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application domain 填 &lt;code&gt;foo.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新增 policy：Action = &lt;strong&gt;Allow&lt;/strong&gt;，Include = &lt;strong&gt;Emails ending in &lt;code&gt;@yourco.com&lt;/code&gt;&lt;/strong&gt;（或指定 email 清單）&lt;/li&gt;
&lt;li&gt;Identity provider 用預設的 &lt;strong&gt;One-time PIN&lt;/strong&gt;（送 email OTP），或到 &lt;strong&gt;Settings → Authentication&lt;/strong&gt; 接 Google SSO / GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下次打開 &lt;code&gt;foo.example.com&lt;/code&gt; 會先跳 Cloudflare 登入頁，認證通過才進得去。免費方案吃到 &lt;strong&gt;50 個使用者&lt;/strong&gt;都免錢。&lt;/p&gt;
&lt;h2 id="trycloudflare一次性的-demo-tunnel"&gt;&lt;a href="#trycloudflare%e4%b8%80%e6%ac%a1%e6%80%a7%e7%9a%84-demo-tunnel" class="header-anchor"&gt;&lt;/a&gt;TryCloudflare：一次性的 demo tunnel
&lt;/h2&gt;&lt;p&gt;要快速給人看個 webhook 或 demo，連帳號都懶得開：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudflared tunnel --url http://localhost:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;跑起來會印一個 &lt;code&gt;https://&amp;lt;random-words&amp;gt;.trycloudflare.com&lt;/code&gt;，隨機子網域、流量打回本機。關掉程序網址就失效。適合臨時，不適合長期，有 rate limit。&lt;/p&gt;
&lt;h2 id="本機-configyml-派gitops-派推薦"&gt;&lt;a href="#%e6%9c%ac%e6%a9%9f-configyml-%e6%b4%begitops-%e6%b4%be%e6%8e%a8%e8%96%a6" class="header-anchor"&gt;&lt;/a&gt;本機 config.yml 派（GitOps 派推薦）
&lt;/h2&gt;&lt;p&gt;要把 tunnel 設定放進 Git 版控、或跑 IaC（Terraform），還是可以用傳統方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudflared tunnel login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudflared tunnel create dev-laptop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudflared tunnel route dns dev-laptop foo.example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;~/.cloudflared/config.yml&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tunnel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dev-laptop&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;credentials-file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/Users/me/.cloudflared/&amp;lt;UUID&amp;gt;.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;foo.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://localhost:4000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;originRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;connectTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;30s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;noTLSVerify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http_status:404&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;跑：&lt;code&gt;cloudflared tunnel run dev-laptop&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="幾個踩過的坑"&gt;&lt;a href="#%e5%b9%be%e5%80%8b%e8%b8%a9%e9%81%8e%e7%9a%84%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;幾個踩過的坑
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Ingress 最後一定要放 catch-all&lt;/strong&gt;。沒寫 &lt;code&gt;- service: http_status:404&lt;/code&gt; 的話 cloudflared 會拒絕啟動：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;ingress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;foo.example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;http_status:404 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 少了這行會開不起來&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;WebSocket 直接可用&lt;/strong&gt;。2022 之後預設支援，不用額外旗標。Next.js HMR、Socket.IO 都沒問題。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSH / RDP 也能走&lt;/strong&gt;。ingress 寫 &lt;code&gt;service: ssh://localhost:22&lt;/code&gt;，對方不用裝 client，在 Access application 裡啟用 &lt;strong&gt;Browser rendering&lt;/strong&gt;，瀏覽器就能開 SSH terminal。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同一個 tunnel 開多個 replica&lt;/strong&gt;。同樣 token 在第二台機器再跑一次，Cloudflare 自動做 HA 跟 load balancing。主機重開機期間服務不中斷。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;originRequest per hostname&lt;/strong&gt;。每個 ingress 可以獨立設 &lt;code&gt;httpHostHeader&lt;/code&gt;（改 Host header）、&lt;code&gt;connectTimeout&lt;/code&gt;、&lt;code&gt;noTLSVerify&lt;/code&gt;，不用為了一個服務改全域設定。&lt;/p&gt;
&lt;h2 id="費用"&gt;&lt;a href="#%e8%b2%bb%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;費用
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tunnel 本身：完全免費&lt;/strong&gt;，不限流量、不限條數、不限 bandwidth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Trust Access：50 個使用者以下免費&lt;/strong&gt;，超過走 Cloudflare One pay-as-you-go 約 $7/user/月&lt;/li&gt;
&lt;li&gt;沒有 egress fee、沒有連線數限制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;對個人跟小團隊來說幾乎是白送。&lt;/p&gt;
&lt;h2 id="20252026-的重要更新"&gt;&lt;a href="#20252026-%e7%9a%84%e9%87%8d%e8%a6%81%e6%9b%b4%e6%96%b0" class="header-anchor"&gt;&lt;/a&gt;2025–2026 的重要更新
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Dashboard 整併&lt;/strong&gt;：舊的 &lt;code&gt;dash.teams.cloudflare.com&lt;/code&gt; 完全退役，統一走 &lt;code&gt;one.dash.cloudflare.com&lt;/code&gt;。如果搜到舊教學點到老介面，換新網址就好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARP Connector GA&lt;/strong&gt;：原本 tunnel 是「單一服務對外」，WARP Connector 把&lt;strong&gt;整個內網網段&lt;/strong&gt;接上 Cloudflare。想讓員工 VPN 進辦公室網段、或站對站互連，這是新選擇。Tunnel + WARP Connector 搭起來就是 site-to-site VPN 的替代品。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare One 品牌整合&lt;/strong&gt;：Access、Gateway、Tunnel、WARP、CASB、DLP、Email Security 全合併成一個 SSE 平台。Zero Trust 選單下面現在一次能設完企業所有網路安全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terraform provider v5&lt;/strong&gt; 穩定：tunnel 資源完整 IaC 化，多環境部署用 Terraform 一鍵建完。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QUIC 成預設&lt;/strong&gt;：cloudflared 協定預設走 QUIC（HTTP/3），比舊的 HTTP/2 連線建立更快，壞網路環境也更穩。&lt;/p&gt;
&lt;h2 id="什麼時候別用-tunnel"&gt;&lt;a href="#%e4%bb%80%e9%ba%bc%e6%99%82%e5%80%99%e5%88%a5%e7%94%a8-tunnel" class="header-anchor"&gt;&lt;/a&gt;什麼時候別用 Tunnel
&lt;/h2&gt;&lt;p&gt;雖然好用但不是萬用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;純 P2P 不經過第三方&lt;/strong&gt;：用 Tailscale / WireGuard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;法規要求流量不能經美國/CF 網路&lt;/strong&gt;：走 self-hosted frp 或企業 VPN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超大流量靜態檔&lt;/strong&gt;：直接用 Cloudflare Pages / R2 比走 tunnel 合理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只想 5 分鐘 demo&lt;/strong&gt;：TryCloudflare 或 ngrok 更快，不用設網域&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="結語"&gt;&lt;a href="#%e7%b5%90%e8%aa%9e" class="header-anchor"&gt;&lt;/a&gt;結語
&lt;/h2&gt;&lt;p&gt;2026 年架 demo 環境、接 webhook、開發過程中給同事看進度——這些 Cloudflare Tunnel 基本都是最省力的答案。免費額度大方，安全性有 Cloudflare 托底，從開發到上 production 都能用同一條路徑。&lt;/p&gt;
&lt;p&gt;最短的上手只要三步：&lt;code&gt;brew install cloudflared&lt;/code&gt; → dashboard 建 tunnel → 貼上 token。之後所有複雜度都在雲端 UI 點一點就好。&lt;/p&gt;
&lt;h2 id="參考資源"&gt;&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;參考資源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/" target="_blank" rel="noopener"
 &gt;Cloudflare Tunnel 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cloudflare/cloudflared" target="_blank" rel="noopener"
 &gt;cloudflared GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://one.dash.cloudflare.com" target="_blank" rel="noopener"
 &gt;Zero Trust Dashboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/" target="_blank" rel="noopener"
 &gt;TryCloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cloudflare.com/plans/zero-trust-services/" target="_blank" rel="noopener"
 &gt;Cloudflare Access 定價&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>