准备清单
操作入口:Cloudflare 控制台 | Namecheap Domain List | Cloudflare Full Setup 文档
- 准备一个可登录的 Cloudflare 账号,并确认可以登录域名注册商后台。
- 记录当前根域名和
www的解析目标;导出或截图保存现有 A、AAAA、CNAME、MX、TXT、SRV、CAA 记录。 - 记录现有邮件服务的 MX、SPF、DKIM、autodiscover、autoconfig 记录;切换 NS 后逐条复核,不启用 Cloudflare Email Routing。
- 确认源站 443 已安装有效证书,证书域名覆盖根域名和
www,并且证书未过期。 - 保留一个已登录的 SSH 会话;源站防火墙操作完成前不要关闭该会话。
- 全文中的
example.com、<YOUR_DOMAIN>、<ORIGIN_IP>均替换为自己的值;截图、日志和文章中不公开真实值。
一、域名接入与 NS
操作入口:Cloudflare 控制台 | Namecheap 修改 Nameservers | Cloudflare 接入步骤
- 登录 Cloudflare,点击 Add a domain 或 Onboard a domain。
- 在域名输入框填写根域名,例如
example.com;不要填写www.example.com,点击 Continue。 - 套餐选择 Free / $0,点击 Continue。
- 等待自动扫描 DNS。逐条对照准备清单中的记录;缺失的邮件记录先补齐,再继续。
- 确认根域名和
www网站记录使用橙色云朵;MX、SPF、DKIM、mail、autodiscover、autoconfig 等邮件记录使用灰色云朵或不可代理状态。 - 进入 Cloudflare 的 NS 确认页,复制页面分配的两个权威 Nameserver;两个值都要保存。
- 打开 Namecheap Domain List,找到域名后点击 Manage。
- 在 Nameservers 下拉框选择 Custom DNS,删除旧 NS,分别粘贴 Cloudflare 分配的两个 NS。
- 点击绿色对勾保存;不要在此处填写 IP 地址。
- 返回 Cloudflare,点击 Done, check nameservers;状态变为 Active 后再执行后续步骤。
验证 NS
dig NS <YOUR_DOMAIN> +short
dig SOA <YOUR_DOMAIN> +short
- NS 输出应为 Cloudflare 分配的两个 Nameserver。
- Cloudflare 域名概览页应显示 Active,不能停留在 Pending。
二、DNS 记录
操作入口:Cloudflare 控制台 → 选择域名 → DNS → Records | 创建 DNS 记录文档 | 代理状态文档
- 点击 Add record,类型选择 A,Name 填
@,IPv4 address 填源站地址,Proxy status 选择 Proxied,TTL 选择 Auto,点击 Save。 - 再次点击 Add record,类型选择 A,Name 填
www,IPv4 address 填与根域名相同的源站地址,Proxy status 选择 Proxied,TTL 选择 Auto,点击 Save。 - 逐条添加原邮件服务提供的 MX 记录;优先级和目标必须与原记录一致,Proxy status 保持 DNS only。
- 逐条添加 SPF TXT、DKIM TXT/CNAME、mail、autodiscover、autoconfig 记录;与邮件有关的 CNAME 一律选择 DNS only。
- 检查同名冲突:同一个主机名不能同时保留互相冲突的 A、AAAA、CNAME。确认无误后再删除停放页或旧源站记录。
- 不要把数据库、Redis、SSH 或内部管理端口创建为公开 DNS 记录。

验证 DNS
dig A <YOUR_DOMAIN> +short
dig A www.<YOUR_DOMAIN> +short
dig MX <YOUR_DOMAIN> +short
dig TXT <YOUR_DOMAIN> +short
- 根域名 A 查询应返回 Cloudflare 边缘地址,不应直接返回源站地址。
- MX、SPF、DKIM 查询结果应与原邮件服务提供的值一致。
三、DNSSEC
操作入口:Cloudflare 控制台 → 选择域名 → DNS → Settings → DNSSEC | Cloudflare DNSSEC 文档 | Namecheap Custom DNS 的 DNSSEC 文档
- 在 Cloudflare 的 DNSSEC 页面点击 Enable DNSSEC。
- 页面生成 DS 后,完整保存 Key Tag、Algorithm、Digest Type、Digest 四项;不要手动修改任何一项。
- 打开 Namecheap Domain List,点击域名右侧 Manage,进入 Advanced DNS。
- 找到 DNSSEC,打开开关,点击 Add New Record。
- Key Tag 填 Cloudflare 的 Key Tag;Algorithm 按 Cloudflare 页面显示值选择;Digest Type 按 Cloudflare 页面显示值选择;Digest 粘贴完整长字符串。
- 点击绿色对勾保存。不要把示例值、其他域名的 DS 或截图中的值填入。
- 等待注册商提交完成,返回 Cloudflare DNSSEC 页面刷新,状态应变为 Active。
- 保持 Multi-signer DNSSEC 和 Multi-provider DNS 为 Off。

验证 DNSSEC
dig DS <YOUR_DOMAIN> +short
dig +dnssec <YOUR_DOMAIN> A
- DS 查询应返回记录。
- Cloudflare DNSSEC 页面应显示 Active;如果显示 Pending,先复核四个 DS 字段,不要重复添加第二条。
四、HTTPS 与 HSTS
操作入口:Cloudflare 控制台 → 选择域名 → SSL/TLS | Full (strict) 文档 | HSTS 文档 | 边缘证书选项文档
- 先用浏览器直接检查源站证书覆盖根域名和
www,且 443 能正常返回页面。 - 进入 SSL/TLS → Overview,关闭 Automatic SSL/TLS,加密模式选择 Full (strict)。
- 不要选择 Flexible;保存后刷新首页,确认没有 525、526 或重定向循环。
- 进入 SSL/TLS → Edge Certificates,将 Always Use HTTPS 设为 On。
- 将 Minimum TLS Version 选择为 TLS 1.2。
- 将 TLS 1.3、Opportunistic Encryption、Automatic HTTPS Rewrites、Certificate Transparency Monitoring 设为 On。
- 确认 Universal SSL 为 Enabled;不启用付费的 Advanced Certificate Manager、Total TLS 和自定义 Cipher Suites。

设置 HSTS
- 在 SSL/TLS → Edge Certificates 找到 HTTP Strict Transport Security (HSTS),点击 Enable HSTS 或 Change HSTS Settings。
- 阅读警告后勾选 I understand,点击 Next。
- 将 Enable HSTS 设为 On。
- 将 Max Age Header 选择为 1 month。
- 将 Apply HSTS policy to subdomains 设为 Off。
- 将 Preload 设为 Off,其余项保持默认,点击 Save。

验证 HTTPS 与 HSTS
curl -I http://<YOUR_DOMAIN>/
curl -I https://<YOUR_DOMAIN>/
- HTTP 请求应跳转到 HTTPS。
- HTTPS 响应头应包含
strict-transport-security,其中max-age对应 1 个月。
五、源站收口
操作入口:Cloudflare IP 地址说明 | Cloudflare IPv4/IPv6 列表
- 保持当前 SSH 会话在线,先执行
sudo ufw status numbered,确认 SSH 管理规则仍允许自己的可信来源。 - 下载 Cloudflare 当前公布的 IPv4 和 IPv6 网段。
curl -fsSL https://www.cloudflare.com/ips-v4 -o /tmp/cloudflare-ips-v4.txt
curl -fsSL https://www.cloudflare.com/ips-v6 -o /tmp/cloudflare-ips-v6.txt
- 逐个允许 Cloudflare IPv4 网段访问 80 和 443。
while read -r cidr; do
sudo ufw allow from "$cidr" to any port 80 proto tcp
sudo ufw allow from "$cidr" to any port 443 proto tcp
done < /tmp/cloudflare-ips-v4.txt
- 逐个允许 Cloudflare IPv6 网段访问 80 和 443。
while read -r cidr; do
sudo ufw allow from "$cidr" to any port 80 proto tcp
sudo ufw allow from "$cidr" to any port 443 proto tcp
done < /tmp/cloudflare-ips-v6.txt
- 再次执行
sudo ufw status numbered,确认 Cloudflare allow 规则已存在。 - 删除原有面向 Anywhere 的 80/443 allow 规则;按编号从大到小执行
sudo ufw delete <RULE_NUMBER>,避免编号变化误删。 - 在 Cloudflare allow 规则之后添加
sudo ufw deny 80/tcp和sudo ufw deny 443/tcp。 - 执行
sudo ufw enable和sudo ufw reload,再执行sudo ufw status numbered复核顺序。 - 执行
docker ps --format "table {{.Names}}\t{{.Ports}}",确认 New API 没有把 3001 或数据库、Redis 端口绑定到所有网络接口;应用只监听回环地址或 Docker 内网。 - 不要删除 SSH 管理白名单;不要把 SSH 端口开放给 Anywhere。
验证源站收口
curl -I --connect-timeout 5 http://<ORIGIN_IP>/
curl -Ik --connect-timeout 5 https://<ORIGIN_IP>/
curl -I https://<YOUR_DOMAIN>/
- 直接访问源站地址应超时或被拒绝。
- 通过域名访问应正常返回,并包含
cf-ray响应头。
六、WAF 规则
操作入口:Cloudflare 控制台 → 选择域名 → Security → WAF → Custom rules | WAF 自定义规则文档 | 控制台创建规则文档

规则 1:阻断常见探测路径
- 点击 Create rule,Rule name 填
Block common exploit probes。 - 在 When incoming requests match 选择 Edit expression。
- 粘贴下列表达式。
(lower(http.request.uri.path) contains "/.env")
or (lower(http.request.uri.path) contains "/.git")
or (lower(http.request.uri.path) contains "/wp-admin")
or (lower(http.request.uri.path) contains "/wp-login.php")
or (lower(http.request.uri.path) contains "/phpmyadmin")
or (lower(http.request.uri.path) contains "/vendor/phpunit")
or (lower(http.request.uri.path) contains "/server-status")
or (lower(http.request.uri.path) contains "/cgi-bin/")
or (lower(http.request.uri.path) contains "/.aws")
or (lower(http.request.uri.path) contains "/.ssh")
- 在 Then take action 选择 Block。
- 点击 Deploy,将该规则拖到自定义规则列表第一位。
规则 2:阻断不支持的 HTTP 方法
- 点击 Create rule,Rule name 填
Block unsupported HTTP methods。 - 选择 Edit expression,粘贴下列表达式。
(http.request.method in {"TRACE" "CONNECT"})
- Action 选择 Block,点击 Deploy。
- 将该规则放在探测路径规则之后、地区规则之前。
规则 3:中国大陆仅放行 /v1 与 Stripe Webhook
- 点击 Create rule,Rule name 填
Block CN web access except v1 and Stripe webhook。 - 选择 Edit expression,粘贴下列表达式。
(ip.src.country eq "CN" and not (http.request.uri.path eq "/v1" or starts_with(http.request.uri.path, "/v1/")) and http.request.uri.path ne "/api/stripe/webhook")
- Action 选择 Block,点击 Deploy。
- 不要把 HK、MO、TW 加入该表达式。
- 不要删除
/api/stripe/webhook例外;支付回调必须到达应用。 - 免费套餐自定义规则总数有限;部署后确认列表显示 3 条 Active 规则。


验证 WAF
curl -I https://<YOUR_DOMAIN>/.env
curl -I -X TRACE https://<YOUR_DOMAIN>/
- 常见探测路径和 TRACE 请求应返回 Cloudflare 拦截响应。
- 在 Security → Events 按 Rule name 过滤,确认命中的是对应规则。
- Stripe 回调验收参照 Stripe Webhook 文档,回调应进入应用层而不是 Cloudflare 403。
七、登录限速
操作入口:Cloudflare 控制台 → 选择域名 → Security → WAF → Rate limiting rules | 创建限速规则文档
- 点击 Create rule,Rule name 填
Protect password login。 - 在匹配条件中选择 Edit expression,粘贴下列表达式。
(http.request.method eq "POST" and http.request.uri.path eq "/api/user/login")
- 关闭 Also apply rate limiting to cached assets;登录接口本身已绕过缓存。
- 在 With the same characteristics 选择 IP。
- 在 When rate exceeds 中将 Requests 填 5,Period 选择 10 seconds。
- 在 Then take action 选择 Block。
- 在 For duration 选择 10 seconds。
- 点击 Deploy,把规则置于 Rate limiting rules 列表第一位。
- 确认表达式只匹配
POST /api/user/login;不要匹配/v1、日志、设置或支付接口。

验证登录限速
- 使用测试账号连续提交错误密码 6 次;第 6 次应被 Cloudflare 阻断。
- 等待 10 秒后再次登录,正常请求应恢复。
- 进入 Security → Events,按
Protect password login过滤并确认命中记录。
八、Turnstile
操作入口:Cloudflare Turnstile 控制台 | Turnstile 组件创建文档
- 在 Cloudflare 账号级左侧菜单打开 Turnstile,点击 Add widget。
- Widget name 填
example.com authentication。 - 在 Hostname management 点击 Add hostname,分别添加根域名和
www子域名;只填主机名,不带https://和路径。 - Widget mode 选择 Managed。
- Pre-clearance 选择 Off。
- 点击 Create,复制 Site Key 和 Secret Key;Secret Key 只保存在密码管理器和 New API 后台。


写入 New API
操作入口:登录自己的 New API 管理后台 → 系统设置 → 认证设置 → Bot Protection;当前路由为 /console/system-settings/auth/bot-protection。
- 先在 Site Key 输入框粘贴 Cloudflare 的 Site Key。
- 再在 Secret Key 输入框粘贴 Cloudflare 的 Secret Key。
- 打开 Enable Turnstile 开关。
- 点击页面右上角或底部的 保存;等待成功提示后刷新页面,确认开关仍为开启。
- 不要把 Turnstile 加到首页或
/v1请求链路;New API 会在登录、注册、邮箱验证、密码重置等认证流程调用校验。
验证 Turnstile
- 退出管理员账号,使用无痕窗口打开登录页,确认 Turnstile 组件能完成校验并允许登录。
- 依次测试注册、发送邮箱验证码、忘记密码和重置密码。
- 用 API Token 请求
/v1/models,确认没有出现 Turnstile 页面或 HTML 挑战。
九、缓存策略
操作入口:Cloudflare 控制台 → 选择域名 → Caching → Cache Rules | Cache Rules 文档
- 点击 Create rule,Rule name 填
Bypass API and dynamic requests。 - 在 When incoming requests match 选择 Custom filter expression 或 Edit expression。
- 粘贴下列表达式。
(http.request.uri.path eq "/api" or starts_with(http.request.uri.path, "/api/"))
or (http.request.uri.path eq "/v1" or starts_with(http.request.uri.path, "/v1/"))
or (http.request.method ne "GET" and http.request.method ne "HEAD")
- 在 Then 中选择 Cache eligibility,值选择 Bypass cache。
- 点击 Deploy,确认规则状态为 Active。
- 该表达式必须保留
/api、/api/*、/v1、/v1/*以及所有非 GET/HEAD 请求。

设置基础缓存
操作入口:Cloudflare 控制台 → 选择域名 → Caching → Configuration。
- Caching Level 选择 Standard。
- Browser Cache TTL 选择 4 hours。
- Development Mode 设为 Off。
- Crawler Hints 设为 Off。
- Cache Response Rules 保持 0;没有明确需求时不要新增覆盖响应头的规则。
- 发布新版本后只清理变更的静态文件;优先使用 Custom Purge,不要日常执行 Purge Everything。

验证缓存
curl -I https://<YOUR_DOMAIN>/v1/models
curl -I https://<YOUR_DOMAIN>/api/status
curl -I https://<YOUR_DOMAIN>/assets/<STATIC_FILE>
/v1和/api响应的cf-cache-status应为DYNAMIC或BYPASS,不能为HIT。- 同一静态资源连续请求后可以出现
HIT。 - 后台的使用日志、系统设置、余额和用户信息刷新后必须返回最新数据。
十、网络设置
操作入口:Cloudflare 控制台 → 选择域名 → Network | WebSockets 文档
- IPv6 Compatibility:On。
- gRPC:Off。
- WebSockets:On。
- Pseudo IPv4:Off。
- IP Geolocation:On。
- Maximum Upload Size:100 MB。
- Network Error Logging:On。
- Onion Routing:On。

验证网络功能
- 刷新 New API 后台并观察浏览器开发者工具的 Network 面板,接口不得持续 Pending 或反复重连。
- 上传一个小于 100 MB 的测试文件,确认请求能到达应用。
- 如应用使用流式输出,连续测试两次长响应并确认没有被提前截断。
十一、性能设置
操作入口:Cloudflare 控制台 → 选择域名 → Speed → Settings | HTTP/3 文档 | Rocket Loader 文档 | Early Hints 文档
- 打开 Recommendations:将 Web analytics using real user measurement (RUM) 设为 Enabled;不要点击 Enable all available settings。
- 将 Speed Brain 设为 Disabled。

Protocol Optimization
- HTTP/2:On。
- HTTP/2 to Origin:On。
- HTTP/3 (with QUIC):On。
- 0-RTT Connection Resumption:Off。
- 免费套餐不可用的 Enhanced HTTP/2 Prioritization 保持默认。

Content Optimization
- Rocket Loader:Off。
- Cloudflare Fonts:Off。
- Early Hints:Off。
- Speed Brain:Off。
- 付费套餐专属的 Polish 等图片优化项保持未启用。

验证协议与前端
curl -I --http2 https://<YOUR_DOMAIN>/
- 首页、登录页、用户后台、管理员后台分别刷新两次,确认无白屏、按钮失效或资源 404。
- 浏览器开发者工具 Network 面板的 Protocol 列应出现
h2或h3。 - 使用日志和系统设置页面加载后,动态接口仍应由源站返回,不得出现旧数据。
十二、邮件路由
操作入口:Cloudflare 控制台 → Compute → Email Service → Email Routing | Cloudflare Email Routing 文档
- 打开 Email Routing 页面后,不点击 Onboard Domain。
- 确认状态为 Unconfigured,Routing rules 为 0,Destination addresses 为 0。
- 返回域名的 DNS → Records,确认原邮件服务的 MX、SPF、DKIM 仍存在。
- 不要接受 Cloudflare 自动替换 MX、SPF 或 DKIM 的提示。

验证邮件
- 从外部邮箱向域名邮箱发送一封测试邮件,确认可以收到。
- 从域名邮箱回复测试邮件,确认发件成功且未进入垃圾邮件。
- 重新执行 MX、SPF、DKIM 查询,结果应与切换 Cloudflare 前一致。
十三、验收
操作入口:Cloudflare Security Events → 选择域名 → Security → Events | Cloudflare Trace 文档 | Stripe Webhook 文档
- 非中国大陆网络访问首页:应返回 200 或正常跳转。
- 未携带 Token 请求
/v1/models:应进入应用并返回鉴权失败,不应返回 Cloudflare 挑战页。 - 中国大陆网络访问首页:应由地区规则阻断。
- 中国大陆网络请求
/v1/models:应进入应用层;无 Token 时返回应用鉴权失败。 - Stripe 测试 Webhook:应进入应用层;签名无效时由应用拒绝,而不是 Cloudflare 403。
- 登录连续错误 6 次:应触发登录限速;10 秒后恢复。
- 登录、注册、邮箱验证、密码重置:应出现并通过 Turnstile。
- 使用日志、系统设置、余额、用户信息:刷新后返回实时数据,
cf-cache-status不能为 HIT。 - 静态资源:连续请求后允许出现缓存 HIT。
- 直接访问源站地址的 80/443:应超时或拒绝。
- 域名访问:应正常并包含
cf-ray。 - DNSSEC:Cloudflare 显示 Active,DS 查询有结果。
- 邮件:收件、发件均正常。
curl -I https://<YOUR_DOMAIN>/
curl -i https://<YOUR_DOMAIN>/v1/models
curl -I https://<YOUR_DOMAIN>/.env
curl -I -X TRACE https://<YOUR_DOMAIN>/
curl -I --connect-timeout 5 http://<ORIGIN_IP>/
十四、回滚
操作入口:Cloudflare 控制台 | HSTS 关闭步骤 | Namecheap 修改 Nameservers
- 地区误拦截:进入 Security → WAF → Custom rules,先将地区规则设为 Disabled,不要直接删除;复测后再修改表达式。
- 登录限速误伤:进入 Security → WAF → Rate limiting rules,先停用
Protect password login,确认恢复后再提高阈值或缩小匹配范围。 - Turnstile 异常:先在 New API 的 系统设置 → 认证设置 → Bot Protection 关闭 Enable Turnstile 并保存,再到 Cloudflare 停用组件。
- 缓存异常:进入 Caching → Cache Rules 停用缓存规则,使用 Custom Purge 清理受影响静态资源,复测
/api和/v1。 - 前端白屏或按钮失效:确认 Rocket Loader、Cloudflare Fonts、Early Hints、Speed Brain 均为 Off,执行 Custom Purge 后重新加载。
- HSTS 需要撤销:先保证 HTTPS 持续可用,在 HSTS 设置中将 Max Age Header 设为 0 并保存;原 Max-Age 到期前不要关闭 HTTPS、暂停 Cloudflare 或切走 NS。
- DNSSEC 需要撤销:先在注册商删除 DS,再在 Cloudflare 关闭 DNSSEC;不要反向操作。
- 源站防火墙误拦截:保持 SSH 会话在线,只临时允许可信管理来源;修复 Cloudflare 网段 allow 规则后再恢复 deny 规则。
- 需要切回原 DNS:先在原 DNS 服务完整恢复 A、CNAME、MX、TXT、SRV、CAA,再修改注册商 NS;切换完成前保持 Cloudflare 配置不删除。

Comments NOTHING