简单来说,Cloudflare Tunnel 是一个可以让你安全地将本地服务(例如网站、API、甚至整个网段等)暴露到公共互联网上的工具,而无需在服务器或路由器上开放任何入站端口。

工作原理

它的工作原理是:

  1. 在服务器上(比如一台家用电脑、小主机、或云服务器)运行一个名为 cloudflared 的轻量程序。
  2. cloudflared 会主动向 Cloudflare 在全球的数据中心建立一个持久的、仅出站的加密连接(隧道)。
  3. 当有用户访问在 Cloudflare 上设置的域名时,请求会先到达 Cloudflare 的网络。
  4. Cloudflare 会通过已经建立好的安全隧道,将这个请求转发给本地服务器上运行的 cloudflared 程序。
  5. cloudflared 再将请求转发给本地的实际服务(例如运行在 localhost:8000 的一个网站)。
  6. 服务的响应再沿着原路通过隧道返回给 Cloudflare,最终送达用户。

主要优势

  • 安全:这是最大的优点。因为不需要在防火墙上打开任何端口,可以隐藏源站IP,黑客无法直接扫描或攻击你的服务器,所有的流量都必须先经过 Cloudflare 的安全防护。
  • 无需公网IP:即使你的服务器在一个没有公网IP的内网环境中(例如家庭网络),也可以通过 Cloudflare Tunnel 让外界访问你的服务。
  • 简化部署:不需要复杂的端口转发或防火墙配置,只需运行 cloudflared 并进行简单的设置即可。

前置条件

  • 一个托管在 Cloudflare 上的域名。
  • 开通 Cloudflare 的 Zero Trust 计划。

部署步骤

二进制安装(amd64 示例)

一、下载并安装 cloudflared

# 创建配置目录
sudo mkdir -p /etc/cloudflared

# 下载 cloudflared
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64

# 移动到系统路径并设置执行权限
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared

安装完后验证是否安装成功

$ cloudflared version
cloudflared version 2025.9.1 (built 2025-09-22-13:28 UTC)

二、授权 cloudflared

首先,你需要让本地的 cloudflared 程序关联到你的 Cloudflare 账户。

cloudflared tunnel login

运行这个命令后,它会生成一个 URL。在浏览器中打开,然后选择你想要授权的域名。授权成功后,cloudflared 会在你的用户目录下创建一个证书文件 (cert.pem),后续操作都需要它。

三、创建隧道

# 将 <TUNNEL_NAME> 替换为你自己想取的名字,例如 my-first-tunnel
cloudflared tunnel create <TUNNEL_NAME>

执行成功后,它会返回一个隧道的 UUID,并为你创建一个 JSON 格式的凭证文件。

这个凭证文件默认会保存在 ~/.cloudflared/ 目录下。

四、创建配置文件

现在需要告诉隧道具体要代理哪个本地服务。这通过一个 YAML 配置文件来完成。
一般把配置文件放在 /etc/cloudflared/ 目录下

sudo nano /etc/cloudflared/config.yml

将以下内容粘贴到文件中

# 隧道的 UUID,从上一步的输出中复制
tunnel: a1b2c3d4

# 凭证文件的路径。
credentials-file: /etc/cloudflared/a1b2c3d4.json

# Ingress 规则定义了流量如何路由
ingress:
# 第一条规则:将来自 app.yourdomain.com 的流量转发到本地的 8000 端口
- hostname: app.yourdomain.com
service: http://localhost:8000


- service: http_status:404

五、创建 DNS 记录

修改Cloudflare 的 DNS,将你一步配置的域名指向这个 Tunnel。

# 将 <TUNNEL_NAME> 替换为前几步创建的隧道名称
# 将 <HOSTNAME> 替换为设置的域名
cloudflared tunnel route dns <TUNNEL_NAME> <HOSTNAME>

或者也可以手动前往 Cloudflare 仪表盘,在 DNS 设置中添加一个 CNAME 记录。

六、安装为系统服务

# 这个命令会自动读取 /etc/cloudflared/config.yml 作为配置文件
sudo cloudflared service install

然后,启动服务:

sudo systemctl start cloudflared

检查服务状态来确保它正在正常运行:

sudo systemctl status cloudflared

如果一切正常,你的隧道现在就已经在后台持久运行了!

除了上面那种连接应用程序(单个 HTTP/TCP 服务)以外,还有一种连接私有网络的方式,为授权用户提供对整个 IP 网段的访问权限,替代传统 VPN,且服务不暴露于公网。不过我目前没有这方面的需求,就不展开讲了。