字
字节笔记本
2026年2月21日
Cloudflare Worker 安全连接 MySQL 数据库实战
API中转
¥120
本文介绍 cloudflare-worker-tunnel-mysql-example,一个展示如何安全地将 Cloudflare Worker 连接到自建 MySQL 数据库的完整示例项目。
项目简介
cloudflare-worker-tunnel-mysql-example 是由 brettscott 开发的开源项目,基于 JavaScript/TypeScript 编写。该项目解决了 Cloudflare Worker 安全访问私有数据库的难题,通过 Cloudflare Tunnel 建立加密隧道,避免将数据库暴露在公网。
为什么需要这个项目?
安全风险
将数据库直接暴露在公网存在严重安全隐患:
- 恶意攻击者扫描开放的数据库端口
- 暴力破解用户密码
- 敏感数据泄露风险
解决方案
通过 Cloudflare Tunnel 建立安全隧道:
- 数据库不直接暴露公网
- 加密通信通道
- 身份验证保护
- 零信任网络架构
技术栈
| 技术 | 用途 |
|---|---|
| Cloudflare Worker | 边缘计算服务 |
| Cloudflare Tunnel | 安全隧道连接 |
| Cloudflare Access | 身份验证和访问控制 |
| MySQL | 关系型数据库 |
| Docker | 容器化部署 |
| TypeScript | 编程语言 |
| Wrangler 2.0 | Cloudflare 开发工具 |
核心功能
- ✅ 安全连接 - 通过加密隧道连接数据库
- ✅ 本地开发支持 - 完整的本地开发环境
- ✅ TypeScript - 类型安全的代码
- ✅ ES Module - 使用现代模块系统
- ✅ 环境变量管理 - 安全的密钥管理
- ✅ 免费使用 - Cloudflare Tunnel 现已免费
架构图
text
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Cloudflare │────▶│ Cloudflare │────▶│ Self-hosted │
│ Worker │ │ Tunnel │ │ MySQL │
│ (Edge) │◄────│ (cloudflared) │◄────│ (Private) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
└────────────── CF Access ──────────────────────┘
(Service Token Auth)快速开始
1. 前置要求
- Docker 和 Docker Compose
- Node.js (使用 nvm 管理)
- Cloudflare 账号和网站
2. 创建 Cloudflare Tunnel
访问 Cloudflare Zero Trust Dashboard:
- 选择 "Access" > "Tunnels"
- 点击 "Create a Tunnel"
- 配置公共主机名:
db-tunnel-dev.example.com - 服务类型:
tcp://host.docker.internal:3306
3. 配置 Cloudflared
bash
# 登录 Cloudflare
npm run cloudflared:login
# 配置 docker-compose.yml
TUNNEL_TOKEN="your-tunnel-token"
# 启动服务
npm run cloudflared4. 创建 Service Token
在 Cloudflare Zero Trust 控制台:
- 访问 "Access" > "Service Auth"
- 创建 Service Token
- 保存
CF_CLIENT_ID和CF_CLIENT_SECRET
5. 配置 Cloudflare Application
- 访问 "Access" > "Applications"
- 创建 "Self-Hosted" 应用
- 配置域名:
db-tunnel-dev.example.com - 策略操作:"Service Auth"
- 规则:包含创建的 Service Token
6. 部署 Worker
bash
# 设置密钥
wrangler secret put CF_CLIENT_ID
wrangler secret put CF_CLIENT_SECRET
# 部署
wrangler deploy代码示例
Worker 连接数据库
typescript
import { Client } from '@planetscale/database';
export default {
async fetch(request: Request, env: Env) {
const client = new Client({
host: env.DB_HOST,
username: env.DB_USER,
password: env.DB_PASS,
fetch: (url: string, init: any) => {
// 添加 Cloudflare Access 认证头
init.headers = {
...init.headers,
'CF-Access-Client-Id': env.CF_CLIENT_ID,
'CF-Access-Client-Secret': env.CF_CLIENT_SECRET,
};
return fetch(url, init);
},
});
const result = await client.execute('SELECT * FROM users');
return Response.json(result.rows);
},
};安全特性
| 特性 | 说明 |
|---|---|
| 零信任架构 | 默认不信任任何连接 |
| 双向认证 | Service Token 验证 |
| 加密传输 | TLS 全程加密 |
| 访问审计 | 详细的访问日志 |
| 即时撤销 | 可随时禁用 Token |
适用场景
- 边缘计算 - Worker 需要访问私有数据库
- 微服务架构 - 安全的跨服务通信
- 混合云部署 - 连接本地和云端资源
- 开发测试 - 安全的本地开发环境
项目链接
- GitHub 仓库: https://github.com/brettscott/cloudflare-worker-tunnel-mysql-example
- Stars: 66
- 语言: JavaScript/TypeScript
- 参考项目: Cloudflare worker-mysql
注意事项
- 免费额度 - Cloudflare Tunnel 现已免费
- 网络配置 - Docker 网络模式可能需要调整
- 密钥管理 - 妥善保管 Service Token
- 监控日志 - 定期检查访问日志
分享: