[實戰筆記] Cloudflare Tunnel 穿透 4G LTE 嚴苛防火牆:從 i/o timeout 到 WARP 救命術
前言:當 ISP 成為最大的敵人
最近在協助一個 Home Lab 專案時,遇到了一個極具挑戰性的網路環境:伺服器位於 台灣之星 (VIBO) 4G LTE 網路環境下,使用 TP-Link 路由器,且目標是透過 Cloudflare Tunnel (cloudflared) 將內網服務暴露到公網。
原本以為只是簡單的 tunnel run,沒想到卻演變成一場對抗 Windows 系統權限、路由器 SPI 防火牆 與 ISP 深度封包檢測 (DPI) 的混合戰。這篇文章記錄了如何從滿江紅的 i/o timeout 錯誤中,殺出一條血路。
第一關:Windows 的「鬼遮眼」 (System32 權限陷阱)
起初,我們在設定 Windows 防火牆規則時,遇到了一個荒謬的錯誤:明明檔案就在 System32 裡,但防火牆視窗卻回報 「找不到檔案」。
Root Cause 分析
Windows 的 System32 是受保護的系統目錄,在 64 位元系統下,32 位元的應用程式(或某些舊版 UI)會被重新導向,導致無法正確選取該路徑下的 cloudflared.exe。
💡 解決方案
不要用滑鼠點選!直接使用 PowerShell 找出真實路徑並暴力貼上,或者乾脆將執行檔移出系統目錄。
PowerShell# 1. 找出真實路徑 (Get-Command cloudflared).Source # 2. 或是直接移動到 C 槽根目錄或桌面,避開權限問題 Move-Item "C:\Windows\System32\cloudflared.exe" "C:\cloudflared.exe"
第二關:絕望的 i/o timeout (SPI 防火牆攔截)
解決了本機權限,真正的惡夢才開始。執行 tunnel run 後,終端機噴出無止盡的紅字錯誤:
PlaintextERR Unable to establish connection with Cloudflare edge error="DialContext error: dial tcp 198.41.200.43:7844: i/o timeout"
交叉測試找兇手
我們做了一個關鍵的對照實驗:
- 手機熱點 (Mobile Hotspot):Test-NetConnection 成功,Tunnel 秒連 ✅。家裡網路 (Home Wi-Fi):Test-NetConnection 失敗,Tunnel 逾時 ❌。
這證明了問題不在軟體設定,而是 TP-Link 路由器的 SPI Firewall 或 ISP (台灣之星) 強制封鎖了 Cloudflare Tunnel 預設使用的 Port 7844。即便嘗試關閉路由器的 IPv4/IPv6 防火牆,甚至嘗試設定 DMZ,連線依然不穩定。
第三關:YAML 設定檔的語法地獄
為了繞過 Port 7844,我們試圖透過 config.yml 強制指定 edge 走標準 HTTPS (443) 埠口。結果遭遇了 YAML 解析器的嚴格檢查:
Plaintextexpected string, found int for map[address:198.41.200.13:443]
這是因為 YAML 將 IP:Port 格式誤判為數字。雖然加上引號可以解決語法問題,但在 4G 不穩定的環境下,讀取設定檔的方式依然無法建立穩定的連線。
終極解法:WARP + Service 雙重掛載
既然 ISP 對 cloudflared 的流量特徵進行攔截,我們決定祭出大招:「流量偽裝」。
我們引入 Cloudflare WARP 客戶端,利用 WireGuard 協定將所有流量打包,讓 ISP 誤以為我們只是在進行普通的加密連線,藉此騙過防火牆。
步驟 1:安裝 WARP 並連接
安裝 WARP 客戶端並登入 Zero Trust 帳號,確認狀態為 Connected。此時,電腦的出口 IP 已經變成 Cloudflare 的虛擬 IP。
步驟 2:調整 MTU (針對 4G 網路的關鍵優化)
4G 網路非常容易因為封包過大而掉包,導致 Tunnel 狀態變成 DEGRADED (降級)。我們必須手動縮小 MTU:
PowerShell# 管理員權限執行 netsh interface ipv4 set subinterface "Wi-Fi" mtu=1280 store=persistent
步驟 3:安裝為系統服務 (Service)
為了避免手動執行的參數錯誤,我們將其註冊為 Windows Service,並強制使用 http2 協定:
PowerShell# 移除舊服務 .\cloudflared.exe service uninstall # 安裝新服務 (帶入 Token) .\cloudflared.exe service install --protocol http2 --token [YOUR_TOKEN] # 啟動服務 Start-Service cloudflared
結語:活下來的才是贏家
經過這番折騰,Cloudflare Dashboard 上的狀態終於亮起了綠燈 (或是勉強接受的 DEGRADED,但在 4G 網路下已是奇蹟)。
本次架構師心得 (Key Takeaways):
- 排除法至上:用手機熱點 (Hotspot) 驗證環境是除錯的最快路徑。ISP 是不可控變因:在 4G/LTE 環境下,不要試圖跟 CGNAT 對抗,直接用 VPN/WARP 繞過它。MTU 很重要:在行動網路部署 Tunnel,將 MTU 設為 1280 是保命關鍵。
雖然過程驚險,但看著服務終於上線,這就是工程師的浪漫吧。
















