真诚友善团结专业,共建你我引以为荣之社区。《常见问题解答》
1 / 144
1月 27 日

Cloudflare 是什么应该不用过多介绍了,本帖聊一下 Cloudflare Tunnel 的用法。

cf tunnel 是什么?

Cloudflare Tunnel 为您提供了一种安全的方式,将您的资源连接到 Cloudflare,而无需公共可路由的 IP 地址。使用 Tunnel,您不会将流量发送到外部 IP 地址,而是在您的基础设施中创建一个轻量级的守护程序,仅向 Cloudflare 的全球网络创建出站连接。Cloudflare Tunnel 可以安全地将 HTTP Web 服务器、SSH 服务器、远程桌面和其他协议连接到 Cloudflare。这样,您的源站可以通过 Cloudflare 提供流量,而不会容易受到绕过 Cloudflare 的攻击。

(摘自官方文档)

有什么用?

tunnel 字面意思一根加密隧道直接从 Cloudflare 网络插到你的服务器,提供 webui 页面方便管理域名与服务器上部署的项目之间的绑定。

  • 项目部署上线更简单,只需建立好隧道,然后设置域名指向项目暴露的本地地址和端口即可。
  • 无需编写任何 Nginx 配置,非常适合像我这样的懒人或小白用户。
  • 无需配置证书,使用加密隧道,项目不会直接暴露到公网上,从而增强了安全性。(ps: 需开启防火墙)

如何工作的?

大致流程为:

用户 —> cf 服务器 —> cf 侧 tunnel 设置入口 --(加密)–> 服务器侧的 tunnel 出口 → 本机项目

开始搭建

1. 在 Cloudflare 的侧边栏中,找到并点击 Zero Trust 菜单。如果是首次使用,需要进行订阅,选择免费套餐进行开通。

2. 在进入 Zero Trust 面板后,从侧边栏中找到并点击 Tunnel 菜单。

2

3. 创建一条隧道(cf 侧)

3.1 隧道类型选 Cloudflared

3.2 设置隧道名,名字随便取,我个人习惯于取能够辨识服务器的名称。

3.3 安装环境选 Docker,记得复制 docker 的安装命令以备后用。

3.4 不用点下一步,直接在左上角点击返回,即可确认隧道已成功创建。

4. 服务器侧隧道设置

在第 3.3 节中,我们获得了一个类似于以下的 docker 命令:

docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9

先别着急用,需要添加几个 docker 参数,注意 network 需要设置为 host。讲一下我之前遇到的坑,docker 启动容器默认会使用桥接模式(bridge),在后面域名绑定时,127.0.0.1:port 是 cloudflared 这个容器内部的地址,如果你的项目也是使用 docker 的桥接模式启动的,那么就无法找到对应的服务。当然也可以用 172.17.0.1:port 这个地址进行绑定,但还是建议让 cloudflared 容器以 host 模式启动。

docker 启动命令

docker run -d --restart always --network host --name cloudflared cloudflare/cloudflared tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9

or

docker-compose 配置

version: '3' services: cloudflared: image: cloudflare/cloudflared container_name: cloudflared restart: always network_mode: host command: tunnel --no-autoupdate run --token eyJhIjoiMjQ4MmIzM2Y3Njc3YWE5OWE5NThiZjcxNTdkMzU1ZmYiLCJ0IjoiOTFmYzdhOWQtYThiZC00MmY2LThlOTEtMDMwYWZjNDA3MjRmIiwicyI6IlkyRm1OamM0TXpZdE1qVTBaaTAwTTJZNUxUZ3hOV1V0TXpOaE9XVmpNV1F4Wm1ZeCJ9

5. 配置域名和部署项目的绑定

5.1 点击前面创建的隧道 Configure

5.2 添加 Public Hostname

5.3 配置域名与服务器上的项目端口,类型有很多可选的,选 http 即可。

5.4 配置完成后,尝试访问你的域名以确认是否设置成功。

阅读时间 10 分钟

这样是不是相当于内网的端口直接用域名就可以访问了?
ddns 和内网穿透这些都不用管,路由器上做个端口映射就行了?
赶紧试试

version: '3' services: cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared restart: always network_mode: host command: tunnel --no-autoupdate run --token **************

出现这样的提示:

Incorrect Usage: flag provided but not defined: -token
上次访问

检查一下 cloudflare/cloudflared 这个镜像有没有拉下来

Incorrect Usage: flag provided but not defined: -token NAME: cloudflared tunnel run - Proxy a local web server by running the given tunnel USAGE: cloudflared tunnel run [command options] TUNNEL-ID OPTIONS: --force, -f By default, if a tunnel is currently being run from a cloudflared, you can't simultaneously rerun it again from a second cloudflared. The --force flag lets you overwrite the previous tunnel. If you want to use a single hostname with multiple tunnels, you can do so with Cloudflare's Load Balancer product. (default: false) --help, -h show help (default: false)

docker 容器 输出的日志是这样的。
镜像拉下来了
image

用命令和 docker-compose 部署了几次,都是这个提示:

Incorrect Usage: flag provided but not defined: -token

域名绑定后,可以在 cf 域名解析看到多了一条 cname 记录,指向 991dc231-3165-xxxx-xxxxx-xxxxxxxxxxxx.cfargotunnel.com 这个地址,前面一长串 id 是创建的隧道的 id,简单理解为域名到隧道入口这个过程。

应该是镜像不是最新的,试试 docker pull cloudflare/cloudflared:2024.1.5

好了。
重新拉取了镜像以后就 ok 了
image

谢谢大佬
奇怪的是用 latest 标签为啥拉取不到最新的镜像。
拉到 2020 年的
image

这个 tunnel 和使用 cloudflare 的源服务器证书 (SSL), 有什么区别?我还是有点不懂,都是通过 cf 加密访问。

非常有帮助的教程,刚才通过这种方式连接到家里的 Portainer.
刚开始 502 报错,实测把 TLS 验证关闭即可.
谢谢!

中午成功了, 但是现在日志报错如下, 这个咋解决呢

2024-02-05T07:24:11Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.41.200.23 2024-02-05T07:24:11Z ERR Serve tunnel error error="TLS handshake with edge error: EOF" connIndex=0 event=0 ip=198.41.200.23 2024-02-05T07:24:11Z INF Retrying connection in up to 1m4s connIndex=0 event=0 ip=198.41.200.23

  • Docker 命令那段是不是暴露 Token 了