banner
herman

herman

哈哈哈哈哈哈哈哈哈哈哈哈哈哈

解決Cloudflare Tunnels無法建立隧道的問題(Tunnels DOWN問題)

原文來自左右大佬,傳送門

關注過筆者的讀者應該知道,筆者的網站是搭建在自家的 NAS 上的,然後使用 Cloudflare Tunnels 實現公網訪問,配合 Cloudflare 的 CDN 使用,總體來說效果還是不錯的。但是近來卻越來越鬧鬼,跑著好好的 Cloudflared 容器卻總是無法與 Cloudflare 建立隧道,直接的結果就是網站掉線、無法訪問!

就是下面的情況,網站此時也是打不開的。

1701661645350.jpg

排查問題#

查看 CloudFlared 容器日誌#

俗話說:遇事不決,量子力學!你別說,這句話還真是說對了!

筆者登錄 NAS,打開 Cloudflared 容器的日誌,赫然看到下面的報錯:

2023-10-13T09:52:58Z ERR Failed to create new quic connection error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=1 ip=198.41.192.227
2023-10-13T09:52:58Z INF Retrying connection in up to 2s seconds connIndex=1 ip=198.41.192.227
2023-10-13T09:52:58Z ERR Connection terminated error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=1

注意其中的關鍵一行:

ERR Failed to create new quic connection error="failed to dial to edge with quic: timeout: no recent network activity"

意思就是:創建新的quic連接失敗,使用quic協議無法連接到邊緣服務器。簡單說就是使用quic協議無法成功建立隧道!

好巧不巧,Cloudflare 將 quic 協議建立的隧道稱為 “後量子隧道”,你就說是不是 “遇事不決,量子力學” 吧!

quic 失敗原因#

回到正題,為什麼無法使用quic協議創建隧道呢?這就要從quic協議本身的特性說起了,我直接引用某度百科的原話:

QUIC 是快速 UDP 網絡連接(英語:Quick UDP Internet Connections)的縮寫,這是一種實驗性的傳輸層網絡傳輸協議,由 Google 公司開發,在 2013 年實現。

也就是說,quic不同於目前主流的http協議,它是建立在 UDP 之上的,而因為眾所周知的國情,UDP 協議在國內運營商眼裡是不好的,是被歧視的,最後的結果就是會阻斷基於 UDP 的連接!是不是豁然開朗?

CloudFlare 官方解答#

原因和背後的原因都搞清楚,但在筆者腦海裡還有一個問題無法釋懷,那就是 Cloudflared 在多次使用quic協議無法創建隧道後,為何不切換到http協議呢?本著一踹到底的莽勁,筆者還真找到了原由,下面是 Cloudflare 官方在 Github 答issues的原話(翻譯成中文):

讓我重申一下這背後的原因:我們正在 “強制” quic 協議,因為我們(Cloudflare)認為它是互聯網未來的重要組成部分。但是許多網絡仍然阻止 UDP。我們必須迫使這些網絡背後的管理員以某種方式感受到這種 “痛苦”,以便人們意識到並開始允許 UDP 出口。

例如,我們的私有 DNS 解析使用 UDP,僅適用於 QUIC 協議。因此,用戶啟動默認為 http2(不支持 UDP 代理)的隧道並且沒有私有 DNS 解析工作是令人沮喪的。

好了,謎底出來了,Cloudflare 故意在默認參數中設置了 quic 協議,且不支持自動降級 / 切換到http2,如果你想用http2可以手工指定,就是這麼簡單粗暴,為廣大用戶操碎了心!

解決方法#

筆者抽絲剝茧,終於理清了問題的原因和解決方法,那麼下面就簡單了,只需動動手,在 Cloudflared 容器的啟動參數中將協議改為http2就可以了:

version: '3.8'

services:
    cloudflared:
        container_name: cloudflared
        restart: unless-stopped
        network_mode: bridge
        environment:
            - TZ=Asia/Shanghai
        command: tunnel --no-autoupdate --protocol http2 run --token <youtoken>
        image: 'cloudflare/cloudflared:latest'

在 compose 中增加--protocol http2 即可,此時強制指定協議為http2,使用的是 TCP,這樣就不會被運營商阻斷了。

當然,也可以設置為--protocol auto,開啟自動切換,默認依然是quic,但是失敗後可自動切換到http2

然後重新創建和啟動容器,查看日誌可以看到,使用 http2 成功創建了隧道:

2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=1 connection=b497b5fb-3f4e-45dd-85fb-e18c2439b5d3 event=0 ip=198.41.200.73 location=sjc05 protocol=http2
2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=2 connection=3d668d56-73d9-4c2d-bd4b-2b2becbdecbf event=0 ip=198.41.192.47 location=lax01 protocol=http2
2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=0 connection=b7c5ebd7-84f6-4070-b5af-abf653d0d345 event=0 ip=198.41.192.67 location=lax07 protocol=http2
2023-10-13T12:01:29Z INF Registered tunnel connection connIndex=3 connection=b5af99db-761c-462c-b793-32ef19d0258a event=0 ip=198.41.200.63 location=sjc05 protocol=http2

Cloudflare 控制台的 Tunnels 狀態也回復了正常!

1701661645350.jpg

現在,可以正常打開我的網站啦!

以上就是關於 Cloudflare Tunnels 無法建立隧道的問題前因及解決方法。當然由於每個人的機器環境、網絡情況等等都不盡相同,可能在操作過程中會遇到一些意外情況,搞不定的話可以在本文後面留言,筆者也會盡量幫大家解答。原創不易,如果覺得此文對你有幫助,不妨點贊 + 收藏 + 關注,你的鼓勵是我持續創作的動力!

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。