利用 Cloudflare Tunnel 實現免費內網穿透

沒有公網 IPv4?不想備案?Cloudflare Tunnel 讓你把內網服務免費暴露到公網,還帶 HTTPS。

沒有公網 IP,又想在公網訪問家裡的伺服器,以前只有兩個選擇:要麼買 VPS 備案,要麼用 FRP、Ngrok 之類的穿透工具。前者要花錢還得備案,後者要麼收費要麼不穩定。

最近發現 Cloudflare 官方有個大善人功能——Cloudflare Tunnel,免費、自帶 HTTPS、不用備案,直接把內網服務穿透到公網。親測可用,速度居然還行。

為什麼公網 IP 這麼難搞

先說背景。

國內的家庭寬頻,IPv4 公網 IP 早就成了稀缺資源。運營商基本默認分配大內網地址,想申請公網 IP?有的地區直接說沒有,有的需要打客服磨嘴皮子,還有可能過一段時間被收回。

IPv6 倒是普及了,地址多到用不完。但問題是——很多網路環境對 IPv6 的支援並不完整,訪問端如果沒有 IPv6,照樣連不上。

所以如果想搭建一個公網可訪問的服務,傳統路子就兩條:

  1. 買 VPS:阿里雲、騰訊雲、華為雲……便宜的一年幾十塊到幾百塊不等。但國內伺服器必須備案,雖然流程不複雜,但確實繁瑣,要等個幾天到一兩週。
  2. 用穿透工具:FRP 自建服務端、Ngrok、花生殼……要麼需要自己有一台有公網 IP 的伺服器做中轉,要麼用第三方收費服務,免費版限制多。

Cloudflare Tunnel 的出現,直接把這條路子給免費了。

Cloudflare Tunnel 是什麼

簡單說,Cloudflare Tunnel 是 Cloudflare 官方推出的一款反向隧道工具。它會在你的內網伺服器上運行一個輕量級客戶端(叫 cloudflared),這個客戶端主動向外連接到 Cloudflare 的邊緣網路,建立一個加密隧道。

外面用戶訪問時,請求先走到 Cloudflare 的邊緣節點,再通過這條隧道轉發到你的內網伺服器。你的伺服器不需要公網 IP,不需要開放火牆埠,甚至連路由器都不用配置。

更妙的是,Cloudflare 會自動給你分配一個二級域名(比如你綁定的域名下的子域名),並且自帶 HTTPS 憑證。也就是說,你只需要在 Cloudflare 上有一個域名(哪怕是在 Cloudflare 上免費註冊的 .workers.dev 或者用你自己的域名),配置好 Tunnel,外界就能通過 https://xxx.yourdomain.com 訪問到你內網的 HTTP 服務。

實操步驟

以下是我實際操作的流程,跟著做就行。

前置條件

  • 一個 Cloudflare 帳號
  • 一個託管在 Cloudflare 上的域名(沒有的可以註冊一個便宜的,或者把現有域名的 NS 改到 Cloudflare)
  • 一台內網伺服器(我這裡就是前面搭 Hugo 部落格的那台 Ubuntu 22.04)

第一步:建立 Tunnel

登入 Cloudflare 控制面板 → 左側選單找到**「Zero Trust」(以前叫 Teams)→ 進入後點擊「網路」「連接器(Tunnels)」→ 點擊「建立隧道」**。

選擇 Cloudflared 類型,給隧道起個名字,比如 home-server

第二步:安裝 cloudflared

建立完成後,頁面會提示你在伺服器上安裝 cloudflared 並執行一條命令。系統會根據你的環境自動推薦安裝方式,Ubuntu/Debian 一般是:

1
2
3
4
5
6
# 下載並安裝 cloudflared
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# 執行頁面提供的登入命令
sudo cloudflared service install <你的令牌>

執行後,cloudflared 會作為系統服務在背景執行,自動連接 Cloudflare。

回到控制面板,你會看到隧道狀態變成**「已連接(Healthy)」**,還有線上時間顯示。

第三步:配置路由

隧道通了,但還需要告訴 Cloudflare:把哪個域名指向哪個內網服務

在隧道詳情頁,點擊**「已發布程式路由(Public Hostname)」「新增路由」**:

  • 子域名:比如 blog(最終訪問地址就是 blog.yourdomain.com
  • 域名:選擇你在 Cloudflare 上的域名
  • 類型:HTTP
  • URLhttp://localhost:80(指向本機的 Nginx,也就是我們的 Hugo 部落格)

儲存。等幾秒鐘,開啟 https://blog.yourdomain.com,應該就能看到你的內網部落格了。

親測體驗

我用家裡的寬頻(電信 300M,無公網 IPv4)測試了幾天,體驗如下:

項目體驗
訪問速度首屏 2-4 秒,靜態資源載入正常,能流暢開啟
穩定性連續執行 48 小時未掉線,cloudflared 服務自動保活
HTTPS自動憑證,無需手動配置,滿分
延遲取決於 Cloudflare 邊緣節點,國內一般走香港或新加坡節點,150-300ms
頻寬Cloudflare 免費版不限流量(公平使用政策),個人部落格完全夠用

總結:對於個人部落格、小型服務展示、遠端除錯這類場景,完全夠用。 如果是高併發或視訊流,免費版可能扛不住,但那是另一個話題了。

一些侷限和注意事項

  1. 域名必須在 Cloudflare:要麼在 Cloudflare 註冊,要麼把 DNS 託管到 Cloudflare。這是硬性要求。
  2. 免費版功能有限:例如自訂埠、更精細的訪問控制需要升級到付費版。
  3. 速度不如直連:畢竟走了 Cloudflare 中轉,比直接訪問公網 IP 要慢一些,但勝在免費和穩定。
  4. HTTP 轉發限制:目標 URL 如果是 localhost,那 cloudflared 必須執行在同一台機器上。如果是區域網其他裝置,寫內網 IP 即可,比如 http://192.168.1.100:80

總結

Cloudflare Tunnel 是一個非常實用的免費內網穿透方案,特別適合:

  • 沒有公網 IP 的家庭寬頻使用者
  • 不想備案、不想買 VPS 的輕量需求
  • 想快速把內網服務暴露到公網做測試或展示

配置簡單,自帶 HTTPS,不限流量,還不要錢。Cloudflare 真是大善人,哈哈哈。

如果你也有內網服務想掛到公網,不妨試試。有問題歡迎交流。

使用 Hugo 建立
主題 StackJimmy 設計