
Cloudflare Tunnel 反向代理配置指南
在本地开发或自建服务时,我们经常遇到反向代理的需求,如果说有什么比较省心的方案那就是 Cloudflare Tunnel 了,本文就讲讲基于 Cloudflare Tunnel 的反向代理配置。
为什么需要 Cloudflare Tunnel
在本地开发或自建服务时,我们经常遇到这些问题:
- 没有公网 IP:家庭宽带通常是动态 IP,无法直接从外网访问
- 端口映射麻烦:需要在路由器上配置端口转发,且暴露真实 IP
- HTTPS 证书:自签名证书不被信任,申请证书又要域名验证
Cloudflare Tunnel 可以解决这些问题:通过 cloudflared 在本地建立出站连接到 Cloudflare,外部访问通过 Cloudflare 的边缘网络转发到本地服务,全程加密且无需暴露本地 IP。
准备工作
前提条件
- 一个托管在 Cloudflare 的域名(免费账号即可)
- 本地运行的服务(如 Web 服务、API、MCP 服务等)
- macOS 或 Linux 系统
安装 cloudflared
macOS(通过 Homebrew):
Ubuntu/Debian(推荐方法 - 官方 APT 仓库):
注意:如果不是 Ubuntu 22.04,将 jammy 替换为你的发行版代号:
- Ubuntu 20.04:
focal - Ubuntu 24.04:
noble - Debian 11:
bullseye - Debian 12:
bookworm
查看发行版代号:lsb_release -cs
Ubuntu/Debian(备选方法 - 直接下载 deb 包):
其他 Linux 发行版(直接下载二进制):
验证安装:
配置步骤
1. 登录 Cloudflare
执行后会打开浏览器,选择要使用的域名并授权。授权成功后,会在 ~/.cloudflared/ 目录下生成 cert.pem 证书文件。
2. 创建 Tunnel
记下输出中的 Tunnel ID(格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),执行成功后会在 ~/.cloudflared/ 目录下生成对应的凭证文件:<tunnel-id>.json。
3. 创建配置文件
在 ~/.cloudflared/ 目录下创建 config.yaml:
单个服务配置示例:
多个服务配置示例:
注意:
- 将
<your-tunnel-id>替换为实际的 Tunnel ID - 将
<tunnel-id>.json替换为实际的凭证文件名 - macOS 路径通常是
/Users/username/.cloudflared/ - Linux 路径通常是
/home/username/.cloudflared/ - 最后一条
service: http_status:404是必需的兜底规则
4. 配置 DNS 路由
为每个域名配置 DNS CNAME 记录:
或者手动在 Cloudflare Dashboard 添加:
- 类型:
CNAME - 名称:
app(子域名) - 目标:
<tunnel-id>.cfargotunnel.com - 代理状态:已代理(橙色云朵)
5. 测试运行
手动启动 tunnel 测试:
或者使用配置文件名称:
访问配置的域名,确认能正常访问本地服务。测试无误后按 Ctrl+C 停止。
6. 配置自启动服务
macOS 方案
重要提示:macOS 上的已知问题
macOS 上 cloudflared service install 命令存在长期已知 bug(Issue #327、Issue #589、Issue #1200):
- 生成的 plist 文件缺少
tunnel run参数 - 服务启动后会循环报错:
Use cloudflared tunnel run to start tunnel <tunnel-id> - 官方安装命令不可靠
因此建议手动创建 plist 文件而不使用 cloudflared service install。
手动创建 LaunchAgent 配置文件:
内容如下:
关键配置说明:
- 必须包含
tunnel和run参数:这是官方service install命令生成的 plist 文件缺失的部分 - Intel Mac 的 cloudflared 路径:
/usr/local/bin/cloudflared - Apple Silicon (M1/M2/M3/M4) 的路径:
/opt/homebrew/bin/cloudflared - 使用
which cloudflared确认实际路径 - 将
username替换为实际用户名 - 将
my-tunnel替换为创建 tunnel 时使用的名称
验证配置文件语法:
加载服务:
检查状态:
管理命令:
Ubuntu/Linux 方案
创建 systemd 服务文件:
内容如下:
注意:
- 将
your-username替换为实际用户名 - 将
my-tunnel替换为 tunnel 名称 - 确认
cloudflared路径正确(用which cloudflared确认)
启用并启动服务:
管理命令:
常见问题
1. 服务启动失败
检查步骤:
常见原因:
- 配置文件路径错误(绝对路径 vs 相对路径)
- Tunnel ID 或名称不匹配
- 凭证文件路径错误
- config.yaml 语法错误(缩进问题)
2. 无法访问服务
排查方法:
3. macOS 服务加载报错
如果遇到 Operation not permitted 或其他权限问题:
4. 配置文件 YAML 格式错误
YAML 对缩进非常敏感,必须使用空格而非 Tab:
5. 端口冲突
如果本地服务未启动或端口不对,tunnel 会报错。确保:
进阶配置
配置 HTTPS 后端
如果本地服务使用 HTTPS:
配置非 HTTP 服务(SSH、RDP 等)
添加自定义 HTTP 头
总结
Cloudflare Tunnel 提供了一个简单、安全的方式将本地服务暴露到公网:
优点:
- ✅ 无需公网 IP 和端口转发
- ✅ 自动 HTTPS 证书
- ✅ 隐藏真实 IP
- ✅ 免费且无流量限制
- ✅ 支持多种协议(HTTP/HTTPS/SSH/RDP/WebSocket)
适用场景:
- 本地开发环境外网访问
- 自建服务(博客、API、数据库管理工具)
- IoT 设备远程控制
- 临时演示和测试
注意事项:
- Tunnel 本身免费,但流量会经过 Cloudflare CDN
- 配置文件包含敏感凭证,注意权限保护
- 生产环境建议启用 Cloudflare Access 进行访问控制
完整文档参考:
- Cloudflare Tunnel 官方文档:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/
- MCP 服务配置:https://modelcontextprotocol.io/
本文基于 2026 年 2 月的实践经验整理,部分命令和配置可能随版本更新有所变化。



