使用 Cloudflare Tunnel 安全暴露本地服务到公网
Cloudflare Tunnel 是一种强大的反向隧道服务,允许用户将本地服务器或内部网络资源安全暴露到公网,而无需开放防火墙端口或拥有公网 IP 地址。本文将详细介绍 Cloudflare Tunnel 的工作原理、功能特点、使用场景,并结合实际操作步骤,展示如何通过 Cloudflare Tunnel 将本地服务映射到公网域名。
什么是 Cloudflare Tunnel?
Cloudflare Tunnel 是 Cloudflare 提供的一项服务,通过运行轻量级客户端 cloudflared,在本地设备与 Cloudflare 全球网络之间建立安全的出站连接(outbound-only)。外部用户可以通过 Cloudflare 的网络访问你的本地服务,而无需直接暴露服务器的 IP 或端口。
工作原理
- 安装客户端:在本地服务器或设备上安装
cloudflared,这是 Cloudflare 提供的隧道守护进程。 - 创建隧道:使用
cloudflared创建一个隧道,与 Cloudflare 边缘网络建立连接,无需公网 IP。 - 路由流量:在 Cloudflare 仪表盘中配置域名或子域名,外部请求通过 Cloudflare 转发到本地服务。
- 安全性保障:所有流量经过 Cloudflare 的加密,支持 HTTPS,并可结合 Cloudflare Access 添加身份验证。
主要特点
- 无需端口转发:无需配置路由器或开放防火墙端口,适合家庭网络或受限环境。
- 免费基础服务:基本功能(如创建隧道、绑定域名)免费,适合个人用户或小型项目。
- 安全性增强:提供 DDoS 防护、SSL/TLS 加密,流量通过 Cloudflare 全球网络。
- 灵活性:支持多种协议(如 HTTP、SSH、RDP),可暴露网页服务、远程桌面或游戏服务器。
使用场景
- 远程访问本地服务:如在家运行 NAS,想通过公网访问文件管理界面。
- 开发测试:快速将本地开发环境暴露到公网,测试 webhook 或第三方回调。
- 替代 VPN:相比传统 VPN,Cloudflare Tunnel 配置简单,适合快速部署。
对比 ngrok
与类似的反向隧道工具 ngrok 相比,Cloudflare Tunnel 有以下优势:
- 成本:ngrok 免费版有严格的时长(2小时断开)和连接限制,而 Cloudflare Tunnel 免费版更宽松。
- 域名:ngrok 免费版提供随机域名,Cloudflare 支持自定义域名。
- 安全性:Cloudflare 提供额外的 DDoS 防护和全球 CDN 加速。
实践:使用 Cloudflare Tunnel 暴露本地服务
下面,我们将通过实际操作,展示如何使用 Cloudflare Tunnel 将本地运行的网页服务(http://localhost:19000)映射到公网域名 share.freemankevin.uk。
准备工作
- 注册 Cloudflare 账号:登录 Cloudflare 仪表盘,添加你的域名并确保 DNS 托管在 Cloudflare。
- 安装
cloudflared:- 在 Windows 上,下载 cloudflared.exe(官方下载地址)。
- 将
cloudflared.exe放置在合适目录(如C:\cloudflared\)。
安装 Cloudflare Tunnel 服务
运行以下命令以安装 cloudflared 服务并绑定 Cloudflare 账户:
cloudflared.exe service install eyJhIjoiMjc0YzhmYzViSa2kih1k3MzVhNjBjNWQ1MTkzOWQyMDEiLCJ0IjoiMDEwNDI5MmEtNzEwYS00NTBkLWI3OGYtOTNjZTExYjhmYTZlIiwicyI6Ik56Um1ZVGcyT0dRdE9XUm1OaTAwWkRJM0xUbGxZemN0TWpKbFlUWmhabiJzTlRRMiJ9 |
注意:
eyJh...是 Cloudflare 提供的认证令牌,请替换为你自己的令牌(从 Cloudflare 仪表盘获取)。
成功后,cloudflared 将作为系统服务运行。
创建隧道
创建名为 share 的隧道:
cloudflared tunnel create share |
输出类似以下内容:
Tunnel credentials written to C:\Users\Devops\.cloudflared\ab9d567c-00c0-46f3-83b7-680ei8b2f3f6.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel. |
这会生成一个隧道 ID(ab9d567c-00c0-46f3-83b7-680ei8b2f3f6)和凭证文件(ab9d567c-00c0-46f3-83b7-680ei8b2f3f6.json)。请妥善保存凭证文件,避免泄露。
配置隧道
创建配置文件 config.yml,内容如下:
tunnel: share |
tunnel:指定隧道名称(share)。credentials-file:指定凭证文件路径。ingress:定义路由规则,将share.freemankevin.uk的请求转发到本地http://localhost:19000,其他请求返回 404。
将 config.yml 保存到 C:\Users\Devops\.cloudflared\ 目录。
配置 DNS 记录
在 Cloudflare 仪表盘中,添加 CNAME 记录:
| 类型 | 名称 | 目标 |
|---|---|---|
| CNAME | share | ab9d567c-00c0-46f3-83b7-680ei8b2f3f6.cfargotunnel.com |
或者,使用以下命令自动配置 DNS:
cloudflared tunnel route dns share share.freemankevin.uk |
运行隧道
运行以下命令启动隧道:
cloudflared tunnel --config C:\Users\Devops\.cloudflared\config.yml --origin-ca-pool C:\Users\Devops\.cloudflared\ca-certificates.pem --logfile C:\Users\Devops\.cloudflared\cloudflared.log run share |
参数说明:
--config:指定配置文件路径。--origin-ca-pool:指定 CA 证书路径(可选,通常用于企业环境)。--logfile:指定日志文件路径,便于调试。
启动后,share.freemankevin.uk 将可通过公网访问,并指向本地 http://localhost:19000 的服务。
测试访问
在浏览器中访问 https://share.freemankevin.uk,确认是否能正常访问本地服务。如果无法访问,检查以下内容:
- 确保本地服务(
http://localhost:19000)正在运行。 - 检查 Cloudflare 仪表盘中的 DNS 记录是否正确。
- 查看
cloudflared日志(C:\Users\Devops\.cloudflared\cloudflared.log)以排查错误。
添加系统服务
为了方便启动和管理隧道,我们可以将上面的隧道共享服务添加到系统服务中:
添加服务
# 以管理员身份打开 PowerShell |
添加后,cloudflared 将作为系统服务运行,无需手动启动。
卸载服务
如果不再需要该服务,可以卸载:
sc delete CloudflaredTunnel |
免费版限制
- 带宽:Cloudflare Tunnel 免费版没有明确的带宽限制,但可能对滥用行为进行限制。
- 功能:高级功能(如负载均衡、Zero Trust 策略)需要付费计划。
- 域名:需使用 Cloudflare 托管的域名(可免费注册或迁移现有域名)。
常见问题
隧道无法连接?
- 检查
cloudflared是否正常运行,查看日志文件。 - 确保网络允许
cloudflared的出站连接(端口 443)。
DNS 配置失败?
- 确认域名已正确托管在 Cloudflare。
- 检查 CNAME 记录是否指向正确的隧道地址。
如何停止隧道?
- 按
Ctrl+C停止cloudflared进程。 - 或删除隧道:
cloudflared tunnel delete share。
总结
Cloudflare Tunnel 是一个简单、安全且免费的工具,适合将本地服务暴露到公网。通过以上步骤,你可以轻松将本地网页服务映射到自定义域名,并享受 Cloudflare 提供的加密和 DDoS 防护。相比 ngrok,Cloudflare Tunnel 在成本、灵活性和安全性上更具优势,非常适合个人开发者、家庭用户或小型项目。