Cloudflare Tunnel 完全指南:功能、设置与最佳实践
摘要
Cloudflare Tunnel (前身为 Argo Tunnel) 是一项强大的服务,它可以在您的源服务器和 Cloudflare 全球网络之间建立一个加密的、仅出站的连接。这意味着您无需在防火墙上打开任何入站端口,也无需为您的服务器配置公共 IP 地址,即可安全地将您的本地服务暴露到互联网上。本指南将详细介绍 Cloudflare Tunnel 的功能、设置步骤以及最佳实践,帮助您充分利用这项服务。
1. 什么是 Cloudflare Tunnel?
Cloudflare Tunnel 的核心是一个名为 cloudflared 的轻量级守护程序。您在源服务器(例如,您的家用 PC、数据中心的虚拟机或树莓派)上运行此程序,它会主动与最近的 Cloudflare 数据中心建立四个加密的 HTTP/2 连接。
一旦连接建立,Cloudflare 就会通过这个隧道将流量路由到您的本地服务。对于外界访问者来说,他们访问的是 Cloudflare 的 IP 地址;而对于您的服务器来说,所有流量都像是直接发送到 localhost,整个过程安全且透明。

2. 核心功能与优势
使用 Cloudflare Tunnel 可以带来诸多好处:
- 零信任安全 (Zero Trust Security): 由于无需在防火墙上开放任何入站端口,您的服务器完全与公共互联网隔离,极大地减少了攻击面。所有请求都必须首先通过 Cloudflare 的网络,您可以在此基础上叠加 Cloudflare Access 等身份验证服务。
- 隐藏源站 IP: 您的服务器 IP 地址永远不会暴露,可以有效防止直接针对服务器的 DDoS 攻击和扫描。
- DDoS 防护: 所有流向您服务的流量都会首先经过 Cloudflare 的全球网络,自动享受业界顶级的 DDoS 缓解服务。
- 简化配置: 无需复杂的端口转发、动态 DNS (DDNS) 或 VPN 设置。
cloudflared会处理所有网络连接的细节。 - 全球加速与 CDN: 访问者会连接到离他们最近的 Cloudflare 数据中心,Cloudflare 会缓存静态内容,并通过其优化的网络路由动态请求,从而降低延迟,提升网站性能。
- 支持多种协议: 除了 HTTP/S,Cloudflare Tunnel 还可以安全地暴露 TCP、SSH、RDP、SMB 等协议,使其成为远程管理内部系统的理想工具。
3. 设置步骤详解
下面,我们将一步步教您如何设置一个 Cloudflare Tunnel 来暴露一个本地 Web 服务。
前提条件
- 一个有效的 Cloudflare 账户。
- 一个已添加到您 Cloudflare 账户的域名。
- 一台您希望运行
cloudflared的服务器(可以是 Windows, macOS, 或 Linux)。 - 服务器上已经运行了一个本地服务(例如,一个监听
localhost:8080的 Web 服务器)。
第一步:安装 cloudflared
根据您的操作系统,选择相应的安装方式。
Windows:
使用 winget 或直接下载 .msi 安装包。
bash
winget install --id Cloudflare.cloudflared
macOS:
使用 Homebrew 是最简单的方式。
bash
brew install cloudflared
Linux (Debian/Ubuntu):
“`bash
添加 Cloudflare 软件包仓库
sudo mkdir -p –mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo ‘deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main’ | sudo tee /etc/apt/sources.list.d/cloudflared.list
安装
sudo apt-get update
sudo apt-get install cloudflared
``jammy` 是 Ubuntu 22.04 的代号,请根据您的系统版本进行替换。*
*注意:
第二步:授权 cloudflared
此命令会将您的 cloudflared 实例与您的 Cloudflare 账户关联。
bash
cloudflared tunnel login
执行后,它会打开一个浏览器窗口,要求您登录 Cloudflare 并选择您要授权的域名。授权成功后,会在您的用户配置目录(例如 ~/.cloudflared/cert.pem)下生成一个证书文件。
第三步:创建隧道
现在,为您的服务创建一个命名的隧道。
bash
cloudflared tunnel create <TUNNEL_NAME>
例如:
bash
cloudflared tunnel create my-cool-website
这个命令会返回一个隧道的 UUID,并生成一个与该隧道关联的凭证文件(UUID.json)。请妥善保管这个文件。
第四步:配置隧道
您需要创建一个配置文件来告诉 cloudflared 如何路由流量。默认情况下,cloudflared 会在 ~/.cloudflared/ 或当前目录下查找 config.yml 文件。
创建一个名为 config.yml 的文件,内容如下:
“`yaml
对应您刚刚创建的隧道的 UUID
tunnel:
凭证文件的路径
credentials-file: /root/.cloudflared/
Ingress 规则定义了如何将外部流量路由到本地服务
ingress:
# 第一条规则:将 my-cool-website.yourdomain.com 的流量指向本地的 8080 端口
– hostname: my-cool-website.yourdomain.com
service: http://localhost:8080
# 第二条规则 (可选): 将所有其他未匹配的子域名流量也指向同一个服务
# 这必须是最后一条规则
– service: http_status:404
“`
关键点解释:
* tunnel: 填入上一步中创建的隧道的 UUID。
* credentials-file: 凭证文件的绝对路径。
* ingress: 这是最重要的部分,定义了流量规则。
* hostname: 您希望用于访问服务的公共域名。
* service: 流量的目标地址。可以是 http://localhost:port、https://localhost:port,甚至 tcp://localhost:port (用于 TCP 隧道)。
* service: http_status:404: 这是一个“捕获所有”的规则,对于任何不匹配前面规则的请求,都会返回 404 Not Found。这是一个好习惯,可以防止意外暴露服务。
第五步:将 DNS 记录指向隧道
现在,将您在配置文件中定义的 hostname 指向您创建的隧道。
bash
cloudflared tunnel route dns <TUNNEL_NAME or UUID> <HOSTNAME>
例如:
bash
cloudflared tunnel route dns my-cool-website my-cool-website.yourdomain.com
此命令会在 Cloudflare DNS 中创建一个 CNAME 记录,指向您的隧道。
第六步:运行隧道
现在,您可以运行隧道来启动连接了。
“`bash
使用配置文件启动
cloudflared tunnel –config /path/to/your/config.yml run
``cloudflared
如果一切正常,您会看到成功连接到 Cloudflare 数据中心的日志。现在,通过浏览器访问https://my-cool-website.yourdomain.com,您应该就能看到在localhost:8080` 上运行的 Web 服务了!Cloudflare 会自动为您配置和管理 HTTPS。
第七步 (推荐): 将 cloudflared 作为服务运行
为了确保隧道在服务器重启后能自动运行,您应该将其安装为一个系统服务。
“`bash
安装服务。如果使用了非默认路径的配置文件,需要指定路径
sudo cloudflared service install
sudo cloudflared service install –config /path/to/your/config.yml
启动服务
sudo systemctl start cloudflared
(可选) 查看服务状态
sudo systemctl status cloudflared
“`
4. 最佳实践
- 使用 Cloudflare Access 进行身份验证: 对于内部或敏感服务,切勿将其直接暴露。在 Tunnel 前面加上 Cloudflare Access,可以轻松实现基于邮箱、SSO (如 Google, Okta, GitHub) 的身份验证。
- 最小权限原则: 为不同的服务创建不同的隧道,并使用专用的配置文件。避免使用一个“万能”隧道暴露所有服务。
- 监控与日志: 定期检查
cloudflared的日志以及 Cloudflare Analytics 仪表盘,了解流量模式和潜在的异常活动。 - 保持更新:
cloudflared正在快速发展,定期更新到最新版本可以获得新功能和安全修复。 - 本地服务安全: 尽管 Tunnel 提供了网络层的保护,但您仍需确保本地服务的安全,例如,使用强密码、及时更新软件补丁等。
- 使用
http_status:404: 在ingress规则的末尾添加一条service: http_status:404规则,是防止意外流量泄露的最后一道防线。
5. 常见用例
- 个人项目托管: 从您的家用 NAS 或树莓派上安全地托管个人博客、相册或 Nextcloud 实例。
- 开发环境共享: 临时将您的本地开发服务器(
localhost:3000)分享给同事或客户进行预览和测试。 - 安全远程访问:
- SSH: 创建一个
ssh://localhost:22的隧道,并通过cloudflared access ssh命令安全地连接到您的服务器,无需暴露 22 端口。 - RDP: 同样地,您可以为 Windows 远程桌面创建隧道,并通过
cloudflared access rdp连接。
- SSH: 创建一个
- 混合云部署: 将本地数据中心的服务与云服务无缝连接,构成一个统一的、安全的网络。
6. 结论
Cloudflare Tunnel 是一个革命性的工具,它彻底改变了我们暴露和保护网络服务的方式。通过将零信任安全模型付诸实践,它允许任何规模的组织或个人以一种前所未有的简单和安全的方式连接到互联网。无论您是希望托管个人项目的业余爱好者,还是需要管理复杂基础设施的系统管理员,Cloudflare Tunnel 都值得您深入了解和使用。