ByteNoteByteNote

字节笔记本

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.0Cloudflare 开发工具

核心功能

  • 安全连接 - 通过加密隧道连接数据库
  • 本地开发支持 - 完整的本地开发环境
  • 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

  1. 选择 "Access" > "Tunnels"
  2. 点击 "Create a Tunnel"
  3. 配置公共主机名:db-tunnel-dev.example.com
  4. 服务类型:tcp://host.docker.internal:3306

3. 配置 Cloudflared

bash
# 登录 Cloudflare
npm run cloudflared:login

# 配置 docker-compose.yml
TUNNEL_TOKEN="your-tunnel-token"

# 启动服务
npm run cloudflared

4. 创建 Service Token

在 Cloudflare Zero Trust 控制台:

  1. 访问 "Access" > "Service Auth"
  2. 创建 Service Token
  3. 保存 CF_CLIENT_IDCF_CLIENT_SECRET

5. 配置 Cloudflare Application

  1. 访问 "Access" > "Applications"
  2. 创建 "Self-Hosted" 应用
  3. 配置域名:db-tunnel-dev.example.com
  4. 策略操作:"Service Auth"
  5. 规则:包含创建的 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 需要访问私有数据库
  • 微服务架构 - 安全的跨服务通信
  • 混合云部署 - 连接本地和云端资源
  • 开发测试 - 安全的本地开发环境

项目链接

注意事项

  1. 免费额度 - Cloudflare Tunnel 现已免费
  2. 网络配置 - Docker 网络模式可能需要调整
  3. 密钥管理 - 妥善保管 Service Token
  4. 监控日志 - 定期检查访问日志
分享: