Cloudflare 上线实战:从 DNS、SSL 到 WAF、Tunnel 的生产部署全流程
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 位于用户和源站之间,主要承担以下职责:
-
DNS 解析
- 管理域名解析记录;
- 将流量引导到 Cloudflare 边缘节点。
-
HTTPS 证书
- 为用户到 Cloudflare 的链路提供 HTTPS;
- 为 Cloudflare 到源站提供 Full 或 Full Strict 加密。
-
CDN 缓存
- 缓存静态资源;
- 降低源站压力;
- 提升全球访问速度。
-
安全防护
- DDoS 防护;
- WAF 托管规则;
- Bot 防护;
- IP/国家/路径级访问控制。
-
源站隐藏
- 通过仅允许 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 切过去,而是要建立一套完整的安全、性能和运维体系。推荐的生产实践包括:
- DNS 使用 Cloudflare 托管;
- 网站记录开启代理;
- SSL 使用 Full Strict;
- 源站配置 Cloudflare Origin Certificate 或 Let’s Encrypt;
- Nginx 恢复真实访客 IP;
- 防火墙仅允许 Cloudflare IP 访问源站;
- 合理配置缓存规则;
- 启用 WAF 和关键路径防护;
- 有条件时使用 Cloudflare Tunnel 隐藏源站;
- 通过 API 或 CI/CD 自动清理缓存。
如果是传统 Web 服务,建议优先采用“Cloudflare DNS + CDN + WAF + Full Strict + 源站防火墙”的方案;如果不希望源站暴露公网 IP,则优先使用 Cloudflare Tunnel;如果是前端静态站点或边缘函数,则可以直接使用 Cloudflare Pages 和 Workers 完成部署。
按照本文步骤配置后,你将获得一个更安全、更稳定、更易维护的 Cloudflare 生产环境部署方案。