Cloudflare Tunnel教程:详细设置与使用指南
Cloudflare Tunnel 提供了一种安全地将本地服务暴露到互联网的方法,无需开放防火墙端口或需要公共 IP 地址。它通过建立与 Cloudflare 网络的出站连接,保护您的源服务器免受直接攻击,并隐藏您的广域网 IP。
本指南将详细介绍 Cloudflare Tunnel 的设置和使用。
1. 前提条件
在开始之前,请确保您具备以下条件:
- Cloudflare 账户: 免费的 Cloudflare 账户即可满足要求。
- 已注册域名: 您拥有并已添加到 Cloudflare 账户的域名。该域名的名称服务器必须指向 Cloudflare。
- 主机: 一台您将安装并运行
cloudflared客户端的服务器或机器(例如,本地计算机、虚拟机或 Docker 容器)。 - 本地服务: 在您的主机上运行(或可从主机访问)的 Web 服务或应用程序,您希望将其暴露到互联网。
2. 安装 cloudflared
cloudflared 客户端是连接您的主机与 Cloudflare 网络的守护程序。
对于 Linux (Debian/Ubuntu):
bash
sudo apt update
sudo apt install cloudflared
对于 macOS (使用 Homebrew):
bash
brew install cloudflare/cloudflare/cloudflared
对于 Windows:
- 访问 Cloudflare
cloudflared下载页面。 - 下载并运行 Windows 安装程序 (.exe 文件)。
验证安装:
打开终端或命令提示符并运行:
bash
cloudflared --version
此命令应显示已安装的 cloudflared 版本。
3. 验证 cloudflared
安装后,您需要使用您的 Cloudflare 账户验证 cloudflared。
bash
cloudflared tunnel login
此命令将打开一个浏览器窗口,提示您登录 Cloudflare 账户。选择您要用于隧道的域名。成功验证后,关闭浏览器窗口并返回到终端。证书文件 (cert.pem) 将下载到您的 ~/.cloudflared/ 目录(Windows 上为 %USERPROFILE%\.cloudflared\)。
4. 创建隧道
现在,创建一个命名隧道。为您的隧道选择一个描述性名称。
bash
cloudflared tunnel create <TUNNEL_NAME>
将 <TUNNEL_NAME> 替换为您想要的名称(例如,my-web-tunnel)。此命令将输出一个隧道 ID (UUID) 并在您的 ~/.cloudflared/ 目录中创建一个凭据文件(例如,<TUNNEL_UUID>.json)。请务必记下隧道 ID,稍后会用到。
5. 配置隧道
在您的 ~/.cloudflared/ 目录中创建一个配置文件,通常命名为 config.yml。此文件定义了流量如何通过您的隧道进行路由。
以下是一个 config.yml 示例:
“`yaml
tunnel:
credentials-file: /home/
ingress:
# 规则 1: 暴露在 localhost:8000 上运行的 Web 服务器
– hostname: your-app.your-domain.com
service: http://localhost:8000
# 如果您的本地服务使用自签名或无效的 TLS 证书,
# 您可能需要为 HTTPS 服务添加 noTLSVerify: true。
# 对于 HTTP 服务,则不需要。
# noTLSVerify: true
# 规则 2: 在不同的子域名和端口上暴露另一个服务
– hostname: another-app.your-domain.com
service: http://192.168.1.100:3000
# 规则 3: 捕获所有其他请求,返回 404
– service: http_status:404
“`
替换占位符:
<YOUR_TUNNEL_UUID>:您在上一步中获得的隧道 ID。<YOUR_USER>:您主机上的用户名。your-app.your-domain.com和another-app.your-domain.com:您希望使用的公共主机名。http://localhost:8000和http://192.168.1.100:3000:您服务的本地地址和端口。
关于 ingress 规则的重要说明:
- 规则按顺序处理。应用第一个匹配的规则。
http_status:404规则作为任何不匹配先前主机名的请求的备用方案。- 如果您的内部服务使用 HTTPS 且带有自签名证书,您可能需要向 ingress 规则添加
noTLSVerify: true以绕过cloudflared的 TLS 验证。
6. 设置 DNS 记录
为了使您的隧道可从互联网访问,您需要在 Cloudflare DNS 设置中创建一条 CNAME 记录。
- 登录您的 Cloudflare 控制台。
- 选择您的域名。
- 转到 DNS 选项卡。
- 单击 添加记录。
- 配置 CNAME 记录:
- 类型:
CNAME - 名称: 输入您在
config.yml中定义的子域名(例如,your-app)。 - 目标: 输入
<YOUR_TUNNEL_UUID>.cfargotunnel.com。 - 代理状态: 确保设置为 已代理(橙色云朵)。
- 类型:
- 对您
config.yml中定义的所有主机名重复此操作。
或者,您可以使用 cloudflared CLI 来路由 DNS:
bash
cloudflared tunnel route dns <TUNNEL_UUID> <hostname>
例如:
bash
cloudflared tunnel route dns <YOUR_TUNNEL_UUID> your-app.your-domain.com
此命令会自动创建必要的 CNAME 记录。
7. 运行隧道
最后,启动您的 Cloudflare Tunnel。
手动运行:
bash
cloudflared tunnel run <TUNNEL_NAME_OR_UUID>
或者,如果您指定了配置文件路径:
bash
cloudflared tunnel --config ~/.cloudflared/config.yml run <YOUR_TUNNEL_UUID>
这将启动 cloudflared 守护程序,将您的本地服务连接到 Cloudflare。
作为服务运行(推荐用于持久性):
对于使用 systemd 的 Linux 系统,您可以将 cloudflared 作为服务安装。确切的命令可能因您的 Linux 发行版而略有不同,但通常情况下,在创建隧道和 config.yml 后,您可以使用:
bash
sudo cloudflared service install
然后,启动并启用服务:
bash
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
这确保了隧道在启动时自动启动。
8. 使用和高级功能
一旦隧道运行,您就可以通过配置的公共主机名(例如,https://your-app.your-domain.com)访问您的本地服务。Cloudflare 会自动为您的隧道提供 HTTPS。
监控隧道:
要列出所有活动隧道:
bash
cloudflared tunnel list
这对于管理多个隧道很有用。
暴露各种协议:
Cloudflare Tunnel 支持暴露 HTTP/HTTPS 之外的各种协议,包括 TCP、SSH 和 RDP。您可以通过在 config.yml 中指定服务类型来配置这些协议。
Cloudflare Access 增强安全性:
为了更精细地控制谁可以访问您的服务,请集成 Cloudflare Access。这允许您设置身份验证方法(例如,一次性密码、身份提供商)和策略,以限制对授权用户的访问。您可以通过 Cloudflare Zero Trust 控制台进行配置。
调试:
如果遇到问题,cloudflared tunnel debug 命令可以提供详细的诊断信息。