上一篇 下一篇 分享链接 返回 返回顶部

Cloudflare 上线实战:从 DNS、SSL 到 WAF、Tunnel 的生产部署全流程

发布人:慈云数据-客服中心 发布时间:24小时前 阅读量:4

Cloudflare 生产环境部署指南|附完整命令

在现代 Web 架构中,Cloudflare 已经不仅仅是一个 DNS 服务商,它同时提供 CDN、DDoS 防护、WAF、安全证书、缓存加速、Zero Trust、Tunnel、Workers、Pages、R2 对象存储等一系列能力。对于生产环境而言,合理部署 Cloudflare 可以显著提升网站的可用性、安全性和访问性能。

本文将以一个真实生产环境的部署思路为主线,介绍如何将一个已有网站或应用接入 Cloudflare,并给出常用的完整命令示例,帮助你从 DNS 接入、SSL 配置、源站加固、缓存优化、安全规则、Cloudflare Tunnel 到 Workers/Pages 部署形成一套可落地的生产方案。


一、适用场景

本文适用于以下场景:

  • 已有网站需要接入 Cloudflare CDN;
  • 生产环境域名需要迁移到 Cloudflare DNS;
  • 需要使用 Cloudflare 免费或高级 SSL 证书;
  • 需要隐藏源站 IP,降低被攻击风险;
  • 需要配置 WAF、防火墙、缓存和访问控制;
  • 需要通过 Cloudflare Tunnel 暴露内网服务;
  • 需要部署 Cloudflare Workers 或 Pages 项目;
  • 希望获得一套生产环境部署检查清单。

二、整体架构说明

一个常见的 Cloudflare 生产环境架构如下:

用户浏览器
   |
   | HTTPS
   v
Cloudflare Edge Network
   |
   | HTTPS / Tunnel
   v
源站服务器 / Kubernetes / 内网服务

Cloudflare 位于用户和源站之间,主要承担以下职责:

  1. DNS 解析

    • 管理域名解析记录;
    • 将流量引导到 Cloudflare 边缘节点。
  2. HTTPS 证书

    • 为用户到 Cloudflare 的链路提供 HTTPS;
    • 为 Cloudflare 到源站提供 Full 或 Full Strict 加密。
  3. CDN 缓存

    • 缓存静态资源;
    • 降低源站压力;
    • 提升全球访问速度。
  4. 安全防护

    • DDoS 防护;
    • WAF 托管规则;
    • Bot 防护;
    • IP/国家/路径级访问控制。
  5. 源站隐藏

    • 通过仅允许 Cloudflare IP 访问源站;
    • 或使用 Cloudflare Tunnel 完全避免暴露公网端口。

三、部署前准备

在正式接入 Cloudflare 前,建议准备以下信息:

项目 说明
域名 例如 example.com
Cloudflare 账号 用于管理 DNS、SSL、WAF 等
源站 IP 例如 203.0.113.10
Web 服务 Nginx、Apache、Node.js、Go、Java 等
服务器权限 建议拥有 root 或 sudo 权限
现有 DNS 记录 A、AAAA、CNAME、MX、TXT 等
SSL 策略 推荐生产环境使用 Full Strict

四、安装基础工具

以下命令以 Ubuntu / Debian 系统为例。

sudo apt update
sudo apt install -y curl wget vim git unzip jq ca-certificates gnupg lsb-release

检查系统时间,生产环境必须保证时间准确,否则 SSL 证书校验可能异常。

timedatectl

启用 NTP 时间同步:

sudo timedatectl set-ntp true

五、接入 Cloudflare DNS

1. 添加站点

登录 Cloudflare 控制台:

https://dash.cloudflare.com

选择:

Add a site

输入你的域名,例如:

example.com

Cloudflare 会自动扫描已有 DNS 记录。


2. 确认 DNS 记录

常见生产环境 DNS 记录如下:

类型 名称 代理状态
A @ 203.0.113.10 Proxied
A www 203.0.113.10 Proxied
CNAME api example.com Proxied
MX @ 邮件服务器 DNS only
TXT @ SPF/DKIM/DMARC DNS only

注意:

  • 网站流量建议开启橙色云朵,即 Proxied
  • 邮件相关记录必须保持 DNS only
  • 如果使用第三方验证 TXT 记录,也应保持 DNS only
  • 如果源站需要真实 IP 直连调试,可以单独创建一个不公开的灰云子域名,但生产环境不建议长期保留。

3. 修改域名 NS

Cloudflare 会提供两个 Nameserver,例如:

alice.ns.cloudflare.com
bob.ns.cloudflare.com

到域名注册商处修改 NS 记录。

等待生效:

dig NS example.com

也可以使用:

nslookup -type=NS example.com

确认返回的是 Cloudflare 的 NS:

alice.ns.cloudflare.com
bob.ns.cloudflare.com

DNS 完全生效可能需要数分钟到 48 小时,实际通常较快。


六、配置 SSL/TLS

生产环境推荐使用:

SSL/TLS encryption mode: Full (strict)

不要在生产环境长期使用:

Flexible

因为 Flexible 只加密用户到 Cloudflare 的链路,而 Cloudflare 到源站是 HTTP,容易导致安全问题和重定向循环。


1. 使用 Cloudflare Origin Certificate

Cloudflare 可以签发源站证书,用于 Cloudflare 到源站之间的 HTTPS。

在 Cloudflare 控制台进入:

SSL/TLS -> Origin Server -> Create Certificate

选择:

Generate private key and CSR with Cloudflare

主机名填写:

example.com
*.example.com

生成后会得到:

  • Origin Certificate;
  • Private Key。

在服务器创建目录:

sudo mkdir -p /etc/ssl/cloudflare
sudo chmod 700 /etc/ssl/cloudflare

写入证书:

sudo vim /etc/ssl/cloudflare/origin.pem

写入私钥:

sudo vim /etc/ssl/cloudflare/origin.key

设置权限:

sudo chmod 600 /etc/ssl/cloudflare/origin.key
sudo chmod 644 /etc/ssl/cloudflare/origin.pem

2. Nginx 配置 HTTPS

安装 Nginx:

sudo apt install -y nginx

创建站点配置:

sudo vim /etc/nginx/sites-available/example.com

示例配置如下:

server {
    listen 80;
    server_name example.com www.example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/cloudflare/origin.pem;
    ssl_certificate_key /etc/ssl/cloudflare/origin.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    root /var/www/example.com;
    index index.html index.htm;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

创建站点目录:

sudo mkdir -p /var/www/example.com
echo "Hello Cloudflare Production" | sudo tee /var/www/example.com/index.html

启用站点:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

测试 Nginx 配置:

sudo nginx -t

重载 Nginx:

sudo systemctl reload nginx

设置开机自启:

sudo systemctl enable nginx

七、恢复真实访客 IP

接入 Cloudflare 后,源站看到的访问 IP 默认是 Cloudflare 节点 IP,而不是用户真实 IP。生产环境通常需要恢复真实 IP,便于日志分析、风控和限流。

Cloudflare 会通过请求头传递真实 IP:

CF-Connecting-IP

1. 安装 realip 模块

大多数 Ubuntu 的 Nginx 默认已包含 http_realip_module

检查:

nginx -V 2>&1 | grep realip

2. 配置 Cloudflare IP 段

创建配置文件:

sudo vim /etc/nginx/conf.d/cloudflare-real-ip.conf

写入以下内容:

real_ip_header CF-Connecting-IP;

set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

测试并重载:

sudo nginx -t
sudo systemctl reload nginx

查看日志:

sudo tail -f /var/log/nginx/example.com.access.log

八、只允许 Cloudflare 访问源站

为了隐藏源站并防止攻击者绕过 Cloudflare 直接访问服务器,建议在防火墙层面仅允许 Cloudflare IP 访问 80 和 443 端口。

1. 使用 UFW 配置防火墙

安装 UFW:

sudo apt install -y ufw

默认拒绝入站:

sudo ufw default deny incoming
sudo ufw default allow outgoing

允许 SSH,注意替换为你的管理 IP,避免锁死服务器:

sudo ufw allow from YOUR_ADMIN_IP to any port 22 proto tcp

例如:

sudo ufw allow from 198.51.100.20 to any port 22 proto tcp

允许 Cloudflare IPv4:

sudo ufw allow from 173.245.48.0/20 to any port 80 proto tcp
sudo ufw allow from 103.21.244.0/22 to any port 80 proto tcp
sudo ufw allow from 103.22.200.0/22 to any port 80 proto tcp
sudo ufw allow from 103.31.4.0/22 to any port 80 proto tcp
sudo ufw allow from 141.101.64.0/18 to any port 80 proto tcp
sudo ufw allow from 108.162.192.0/18 to any port 80 proto tcp
sudo ufw allow from 190.93.240.0/20 to any port 80 proto tcp
sudo ufw allow from 188.114.96.0/20 to any port 80 proto tcp
sudo ufw allow from 197.234.240.0/22 to any port 80 proto tcp
sudo ufw allow from 198.41.128.0/17 to any port 80 proto tcp
sudo ufw allow from 162.158.0.0/15 to any port 80 proto tcp
sudo ufw allow from 104.16.0.0/13 to any port 80 proto tcp
sudo ufw allow from 104.24.0.0/14 to any port 80 proto tcp
sudo ufw allow from 172.64.0.0/13 to any port 80 proto tcp
sudo ufw allow from 131.0.72.0/22 to any port 80 proto tcp

允许 Cloudflare IPv4 访问 443:

sudo ufw allow from 173.245.48.0/20 to any port 443 proto tcp
sudo ufw allow from 103.21.244.0/22 to any port 443 proto tcp
sudo ufw allow from 103.22.200.0/22 to any port 443 proto tcp
sudo ufw allow from 103.31.4.0/22 to any port 443 proto tcp
sudo ufw allow from 141.101.64.0/18 to any port 443 proto tcp
sudo ufw allow from 108.162.192.0/18 to any port 443 proto tcp
sudo ufw allow from 190.93.240.0/20 to any port 443 proto tcp
sudo ufw allow from 188.114.96.0/20 to any port 443 proto tcp
sudo ufw allow from 197.234.240.0/22 to any port 443 proto tcp
sudo ufw allow from 198.41.128.0/17 to any port 443 proto tcp
sudo ufw allow from 162.158.0.0/15 to any port 443 proto tcp
sudo ufw allow from 104.16.0.0/13 to any port 443 proto tcp
sudo ufw allow from 104.24.0.0/14 to any port 443 proto tcp
sudo ufw allow from 172.64.0.0/13 to any port 443 proto tcp
sudo ufw allow from 131.0.72.0/22 to any port 443 proto tcp

启用防火墙:

sudo ufw enable
sudo ufw status verbose

生产提醒:Cloudflare IP 段可能更新,建议定期从官方地址同步。

官方 IP 列表:

https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6

查看:

curl -s https://www.cloudflare.com/ips-v4
curl -s https://www.cloudflare.com/ips-v6

九、Cloudflare 缓存配置

1. 推荐缓存策略

对于生产环境,建议区分静态资源和动态接口:

类型 示例 建议
静态资源 JS、CSS、图片、字体 长缓存
HTML 页面 首页、文章页 根据业务决定
API 接口 /api/* 通常不缓存
后台路径 /admin/* 不缓存
登录路径 /login 不缓存

2. Nginx 设置静态资源缓存头

在 Nginx 中添加:

location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
    try_files $uri =404;
}

完整示例:

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/cloudflare/origin.pem;
    ssl_certificate_key /etc/ssl/cloudflare/origin.key;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable";
        try_files $uri =404;
    }
}

重载:

sudo nginx -t
sudo systemctl reload nginx

3. 清理 Cloudflare 缓存

如果你使用 Cloudflare API,可以通过命令清理缓存。

准备变量:

export CF_API_TOKEN="你的 Cloudflare API Token"
export CF_ZONE_ID="你的 Zone ID"

清理全部缓存:

curl -X POST "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{"purge_everything":true}'

清理指定 URL:

curl -X POST "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "files": [
      "https://example.com/app.js",
      "https://example.com/style.css"
    ]
  }'

十、Cloudflare 安全配置

1. 开启基础安全功能

建议开启:

SSL/TLS -> Always Use HTTPS
SSL/TLS -> Automatic HTTPS Rewrites
Security -> WAF
Security -> Bots
Security -> DDoS

生产环境中,WAF 托管规则建议至少启用:

  • Cloudflare Managed Ruleset;
  • OWASP Core Ruleset;
  • Known Bots;
  • WordPress 规则,如果是 WordPress 网站。

2. 创建防护规则

例如:限制后台路径只允许公司 IP 访问。

规则示例:

URI Path starts with /admin
AND
IP Source Address not in 198.51.100.20
Action: Block

如果使用表达式:

(http.request.uri.path startswith "/admin" and ip.src ne 198.51.100.20)

也可以对登录接口启用 JS Challenge:

http.request.uri.path in ["/login" "/wp-login.php"]

动作选择:

Managed Challenge

十一、部署 Cloudflare Tunnel

Cloudflare Tunnel 可以让源站不暴露公网 IP 和端口,通过 cloudflared 与 Cloudflare 建立出站连接。对于生产环境,这是非常推荐的方式。

1. 安装 cloudflared

Ubuntu / Debian:

curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb

检查版本:

cloudflared --version

2. 登录 Cloudflare

cloudflared tunnel login

执行后会输出一个浏览器地址,打开并选择对应域名授权。


3. 创建 Tunnel

cloudflared tunnel create prod-tunnel

查看 Tunnel:

cloudflared tunnel list

记录生成的 Tunnel ID。


4. 配置 Tunnel

创建配置目录:

sudo mkdir -p /etc/cloudflared

复制凭证文件,通常位于:

~/.cloudflared/.json

执行:

sudo cp ~/.cloudflared/.json /etc/cloudflared/

创建配置文件:

sudo vim /etc/cloudflared/config.yml

示例:

tunnel: 
credentials-file: /etc/cloudflared/.json

ingress:
  - hostname: example.com
    service: http://127.0.0.1:80
  - hostname: www.example.com
    service: http://127.0.0.1:80
  - service: http_status:404

5. 绑定 DNS

cloudflared tunnel route dns prod-tunnel example.com
cloudflared tunnel route dns prod-tunnel www.example.com

6. 安装为系统服务

sudo cloudflared service install

启动:

sudo systemctl start cloudflared

设置开机自启:

sudo systemctl enable cloudflared

查看状态:

sudo systemctl status cloudflared

查看日志:

journalctl -u cloudflared -f

十二、部署 Cloudflare Workers

如果你的项目是边缘函数、接口代理、轻量 API 或中间层,可以使用 Cloudflare Workers。

1. 安装 Node.js

推荐使用 Node.js LTS。

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

检查:

node -v
npm -v

2. 安装 Wrangler

npm install -g wrangler

登录:

wrangler login

检查身份:

wrangler whoami

3. 创建 Workers 项目

npm create cloudflare@latest my-worker

进入目录:

cd my-worker

本地开发:

npm run dev

或:

wrangler dev

4. 配置 wrangler.toml

示例:

name = "my-worker"
main = "src/index.js"
compatibility_date = "2024-09-01"

routes = [
  { pattern = "api.example.com/*", zone_name = "example.com" }
]

示例 Worker:

export default {
  async fetch(request, env, ctx) {
    return new Response(JSON.stringify({
      message: "Hello from Cloudflare Workers",
      time: new Date().toISOString()
    }), {
      headers: {
        "Content-Type": "application/json"
      }
    });
  }
};

部署:

wrangler deploy

查看部署列表:

wrangler deployments list

查看实时日志:

wrangler tail

十三、部署 Cloudflare Pages

Cloudflare Pages 适合部署前端项目,例如 Vue、React、Next.js 静态导出、Astro、Vite、Hugo 等。

1. 创建 Vite 项目示例

npm create vite@latest my-pages-app
cd my-pages-app
npm install
npm run build

构建产物通常位于:

dist

2. 使用 Wrangler 部署 Pages

登录:

wrangler login

创建 Pages 项目:

wrangler pages project create my-pages-app

部署:

wrangler pages deploy dist --project-name=my-pages-app

如果需要指定分支:

wrangler pages deploy dist --project-name=my-pages-app --branch=production

3. 绑定自定义域名

可以在 Cloudflare 控制台中进入:

Workers & Pages -> Pages -> Custom domains

添加:

www.example.com

也可以继续让根域名指向 Pages,具体取决于项目类型和 DNS 设置。


十四、生产环境发布流程建议

推荐建立如下发布流程:

代码提交
  -> CI 构建
  -> 自动化测试
  -> 部署到预发布环境
  -> 验证
  -> 生产发布
  -> 清理 Cloudflare 缓存
  -> 监控告警

例如使用 GitHub Actions 清理 Cloudflare 缓存:

name: Purge Cloudflare Cache

on:
  workflow_dispatch:

jobs:
  purge:
    runs-on: ubuntu-latest
    steps:
      - name: Purge everything
        run: |
          curl -X POST "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/purge_cache" \
            -H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
            -H "Content-Type: application/json" \
            --data '{"purge_everything":true}'

如果只清理指定文件:

name: Purge Cloudflare Files

on:
  workflow_dispatch:

jobs:
  purge:
    runs-on: ubuntu-latest
    steps:
      - name: Purge files
        run: |
          curl -X POST "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/purge_cache" \
            -H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
            -H "Content-Type: application/json" \
            --data '{"files":["https://example.com/app.js","https://example.com/style.css"]}'

十五、常见问题排查

1. 出现 521 错误

521 表示 Cloudflare 无法连接源站。

检查源站服务:

sudo systemctl status nginx

检查端口:

sudo ss -tlnp | grep -E ':80|:443'

检查防火墙:

sudo ufw status verbose

2. 出现 522 错误

522 表示连接超时。常见原因:

  • 源站网络不通;
  • 防火墙拦截;
  • 服务器负载过高;
  • 安全组未开放 Cloudflare IP。

检查负载:

uptime
top

检查日志:

sudo tail -f /var/log/nginx/error.log

3. 出现 525 错误

525 表示 SSL 握手失败。

检查 Nginx 证书配置:

sudo nginx -t

测试源站 HTTPS:

curl -vk https://127.0.0.1

4. 出现 526 错误

526 表示证书无效,通常发生在 Full Strict 模式下。

解决方案:

  • 使用 Cloudflare Origin Certificate;
  • 或使用 Let’s Encrypt 证书;
  • 确保证书域名匹配;
  • 确保证书未过期。

查看证书:

openssl x509 -in /etc/ssl/cloudflare/origin.pem -noout -dates

十六、生产环境检查清单

上线前建议逐项检查:

  • [ ] DNS 已迁移到 Cloudflare;
  • [ ] 网站 A/CNAME 记录已开启代理;
  • [ ] 邮件 MX/TXT 记录保持 DNS only;
  • [ ] SSL 模式为 Full Strict;
  • [ ] 源站已配置有效证书;
  • [ ] HTTP 自动跳转 HTTPS;
  • [ ] Nginx 已恢复真实访客 IP;
  • [ ] 防火墙仅允许 Cloudflare IP 访问 Web 端口;
  • [ ] WAF 托管规则已启用;
  • [ ] 后台路径已配置访问限制;
  • [ ] 静态资源缓存策略已配置;
  • [ ] 发布后缓存清理流程已建立;
  • [ ] 已配置日志与监控;
  • [ ] 已准备回滚方案;
  • [ ] 已测试 521、522、525、526 等错误排查流程。

十七、总结

Cloudflare 生产环境部署的核心不是简单地把 DNS 切过去,而是要建立一套完整的安全、性能和运维体系。推荐的生产实践包括:

  1. DNS 使用 Cloudflare 托管;
  2. 网站记录开启代理;
  3. SSL 使用 Full Strict;
  4. 源站配置 Cloudflare Origin Certificate 或 Let’s Encrypt;
  5. Nginx 恢复真实访客 IP;
  6. 防火墙仅允许 Cloudflare IP 访问源站;
  7. 合理配置缓存规则;
  8. 启用 WAF 和关键路径防护;
  9. 有条件时使用 Cloudflare Tunnel 隐藏源站;
  10. 通过 API 或 CI/CD 自动清理缓存。

如果是传统 Web 服务,建议优先采用“Cloudflare DNS + CDN + WAF + Full Strict + 源站防火墙”的方案;如果不希望源站暴露公网 IP,则优先使用 Cloudflare Tunnel;如果是前端静态站点或边缘函数,则可以直接使用 Cloudflare Pages 和 Workers 完成部署。

按照本文步骤配置后,你将获得一个更安全、更稳定、更易维护的 Cloudflare 生产环境部署方案。

目录结构
全文