⚛️ 遇事不决,量子力学!搞定Cloudflare Tunnels无法建立隧道的问题

Cloudflare Tunnel
关注过笔者的读者应该知道,笔者的网站是搭建在自家的NAS上的,然后使用Cloudflare Tunnels实现公网访问,配合Cloudflare的CDN使用,总体来说效果还是不错的。但是近来却越来越闹鬼,跑着好好的Cloudflared容器却总是无法与Cloudflare建立隧道,直接的结果就是网站掉线、无法访问!

就是下面的情况,网站此时也是打不开的。
Cloudflare Tunnels

排查问题

1、初刻拍案惊奇

俗话说:遇事不决,量子力学!你别说,这句话还真是说对了!

笔者登录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协议建立的隧道称为“后量子隧道”,你就说是不是“遇事不决,量子力学”吧!

2、二刻拍案惊奇

回到正题,为什么无法使用quic协议创建隧道呢?这就要从quic协议本身的特性说起了,我直接引用某度百科的原话:

QUIC是快速UDP网络连接(英语:Quick UDP Internet Connections)的缩写,这是一种实验性的传输层网络传输协议,由Google公司开发,在2013年实现。

也就是说,quic不同于目前主流的http协议,它是建立在UDP之上的,而因为众所周知的国情,UDP协议在国内运营商眼里是不好的,是被歧视的,最后的结果就是会阻断基于UDP的连接!是不是豁然开朗?

3、再刻拍案惊奇

原因和背后的原因都搞清楚,但在笔者脑海里还有一个问题无法释怀,那就是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'

command中增加--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状态也回复了正常!
Cloudflare Tunnels

现在,可以正常打开我的网站啦!
⚛️ 遇事不决,量子力学!搞定Cloudflare Tunnels无法建立隧道的问题

以上就是关于Cloudflare Tunnels无法建立隧道的问题前因及解决方法。当然由于每个人的机器环境、网络情况等等都不尽相同,可能在操作过程中会遇到一些意外情况,搞不定的话可以在本文后面留言,笔者也会尽量帮大家解答。原创不易,如果觉得此文对你有帮助,不妨点赞+收藏+关注,你的鼓励是我持续创作的动力!

高等精灵实验室

原创文章,作者:诺多,如若转载,请注明出处:https://www.huluohu.com/posts/514/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
🐼 calibre-web:你的私人电子书管理神器
上一篇 2023年10月12日 20:59
这个影音播放器你一定不要错过,趁还免费赶紧收藏,支持Emby哦!
下一篇 2023年10月16日 18:37

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(9条)

  • Ramos
    Ramos 2023年10月27日 13:07

    就说这几天总是掉

    • 诺多
      诺多 2023年10月30日 08:15

      @Ramos没错,最近总是被阻断,无奈。。。

  • 和平peaceful
    和平peaceful 2024年5月12日 17:49

    cloudflared.exe怎么配置,我的Windows主机无法安装docker

  • po
    po 2024年8月19日 21:24

    关键是http2也不怎么好用啊 :cry:

    • 诺多
      诺多 2024年8月19日 21:35

      @po我这个最近几个月挺稳定的,不过不一定是http2的原因,说不定只是各地运营商差异,将就着吧

  • anonymouswhac
    anonymouswhac 2024年10月28日 08:01

    更改了http2以后,仍然报错。
    INF You requested 4 HA connections but I can give you at most 2.
    ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.11
    ERR Serve tunnel error error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.18.0.11
    INF Retrying connection in up to 2s connIndex=0 event=0 ip=198.18.0.11

    这是docker容器的日志

  • shide
    shide 2025年2月11日 06:47

    博主,有没群晖cloudeflare tunnel 的设置步骤。

    • 诺多
      诺多 2025年2月11日 10:15

      @shide搜一下cloudeflare,有一篇单独介绍过tunnel配置的,不过跟群晖没关系,就是docker。