Cloudflare 接入 New API:DNSSEC、HSTS、WAF、Turnstile 与缓存策略实录

cc 发布于 3 天前 35 次阅读


准备清单

操作入口:Cloudflare 控制台Namecheap Domain ListCloudflare Full Setup 文档

  1. 准备一个可登录的 Cloudflare 账号,并确认可以登录域名注册商后台。
  2. 记录当前根域名和 www 的解析目标;导出或截图保存现有 A、AAAA、CNAME、MX、TXT、SRV、CAA 记录。
  3. 记录现有邮件服务的 MX、SPF、DKIM、autodiscover、autoconfig 记录;切换 NS 后逐条复核,不启用 Cloudflare Email Routing。
  4. 确认源站 443 已安装有效证书,证书域名覆盖根域名和 www,并且证书未过期。
  5. 保留一个已登录的 SSH 会话;源站防火墙操作完成前不要关闭该会话。
  6. 全文中的 example.com<YOUR_DOMAIN><ORIGIN_IP> 均替换为自己的值;截图、日志和文章中不公开真实值。

一、域名接入与 NS

操作入口:Cloudflare 控制台Namecheap 修改 NameserversCloudflare 接入步骤

  1. 登录 Cloudflare,点击 Add a domainOnboard a domain
  2. 在域名输入框填写根域名,例如 example.com;不要填写 www.example.com,点击 Continue
  3. 套餐选择 Free / $0,点击 Continue
  4. 等待自动扫描 DNS。逐条对照准备清单中的记录;缺失的邮件记录先补齐,再继续。
  5. 确认根域名和 www 网站记录使用橙色云朵;MX、SPF、DKIM、mail、autodiscover、autoconfig 等邮件记录使用灰色云朵或不可代理状态。
  6. 进入 Cloudflare 的 NS 确认页,复制页面分配的两个权威 Nameserver;两个值都要保存。
  7. 打开 Namecheap Domain List,找到域名后点击 Manage
  8. Nameservers 下拉框选择 Custom DNS,删除旧 NS,分别粘贴 Cloudflare 分配的两个 NS。
  9. 点击绿色对勾保存;不要在此处填写 IP 地址。
  10. 返回 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 记录文档代理状态文档

  1. 点击 Add record,类型选择 A,Name 填 @,IPv4 address 填源站地址,Proxy status 选择 Proxied,TTL 选择 Auto,点击 Save
  2. 再次点击 Add record,类型选择 A,Name 填 www,IPv4 address 填与根域名相同的源站地址,Proxy status 选择 Proxied,TTL 选择 Auto,点击 Save
  3. 逐条添加原邮件服务提供的 MX 记录;优先级和目标必须与原记录一致,Proxy status 保持 DNS only
  4. 逐条添加 SPF TXT、DKIM TXT/CNAME、mail、autodiscover、autoconfig 记录;与邮件有关的 CNAME 一律选择 DNS only
  5. 检查同名冲突:同一个主机名不能同时保留互相冲突的 A、AAAA、CNAME。确认无误后再删除停放页或旧源站记录。
  6. 不要把数据库、Redis、SSH 或内部管理端口创建为公开 DNS 记录。
Cloudflare DNS 记录配置
根域名与 www 使用 Proxied;邮件相关记录保持 DNS only。

验证 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 → DNSSECCloudflare DNSSEC 文档Namecheap Custom DNS 的 DNSSEC 文档

  1. 在 Cloudflare 的 DNSSEC 页面点击 Enable DNSSEC
  2. 页面生成 DS 后,完整保存 Key TagAlgorithmDigest TypeDigest 四项;不要手动修改任何一项。
  3. 打开 Namecheap Domain List,点击域名右侧 Manage,进入 Advanced DNS
  4. 找到 DNSSEC,打开开关,点击 Add New Record
  5. Key Tag 填 Cloudflare 的 Key Tag;Algorithm 按 Cloudflare 页面显示值选择;Digest Type 按 Cloudflare 页面显示值选择;Digest 粘贴完整长字符串。
  6. 点击绿色对勾保存。不要把示例值、其他域名的 DS 或截图中的值填入。
  7. 等待注册商提交完成,返回 Cloudflare DNSSEC 页面刷新,状态应变为 Active
  8. 保持 Multi-signer DNSSECMulti-provider DNSOff
Cloudflare DNSSEC 状态
DNSSEC 开启后,在注册商填写 Cloudflare 生成的四项 DS 数据。

验证 DNSSEC

dig DS <YOUR_DOMAIN> +short
dig +dnssec <YOUR_DOMAIN> A
  • DS 查询应返回记录。
  • Cloudflare DNSSEC 页面应显示 Active;如果显示 Pending,先复核四个 DS 字段,不要重复添加第二条。

四、HTTPS 与 HSTS

操作入口:Cloudflare 控制台 → 选择域名 → SSL/TLSFull (strict) 文档HSTS 文档边缘证书选项文档

  1. 先用浏览器直接检查源站证书覆盖根域名和 www,且 443 能正常返回页面。
  2. 进入 SSL/TLS → Overview,关闭 Automatic SSL/TLS,加密模式选择 Full (strict)
  3. 不要选择 Flexible;保存后刷新首页,确认没有 525、526 或重定向循环。
  4. 进入 SSL/TLS → Edge Certificates,将 Always Use HTTPS 设为 On
  5. Minimum TLS Version 选择为 TLS 1.2
  6. TLS 1.3Opportunistic EncryptionAutomatic HTTPS RewritesCertificate Transparency Monitoring 设为 On
  7. 确认 Universal SSL 为 Enabled;不启用付费的 Advanced Certificate Manager、Total TLS 和自定义 Cipher Suites。
Cloudflare SSL TLS 模式
SSL/TLS 加密模式选择 Full (strict),Automatic SSL/TLS 保持关闭。

设置 HSTS

  1. SSL/TLS → Edge Certificates 找到 HTTP Strict Transport Security (HSTS),点击 Enable HSTSChange HSTS Settings
  2. 阅读警告后勾选 I understand,点击 Next
  3. Enable HSTS 设为 On
  4. Max Age Header 选择为 1 month
  5. Apply HSTS policy to subdomains 设为 Off
  6. Preload 设为 Off,其余项保持默认,点击 Save
Cloudflare HSTS 与最低 TLS 设置
HSTS 为 On,Max-Age 为 1 month,不包含子域名,不启用 preload;最低 TLS 为 1.2。

验证 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 列表

  1. 保持当前 SSH 会话在线,先执行 sudo ufw status numbered,确认 SSH 管理规则仍允许自己的可信来源。
  2. 下载 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
  1. 逐个允许 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
  1. 逐个允许 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
  1. 再次执行 sudo ufw status numbered,确认 Cloudflare allow 规则已存在。
  2. 删除原有面向 Anywhere 的 80/443 allow 规则;按编号从大到小执行 sudo ufw delete <RULE_NUMBER>,避免编号变化误删。
  3. 在 Cloudflare allow 规则之后添加 sudo ufw deny 80/tcpsudo ufw deny 443/tcp
  4. 执行 sudo ufw enablesudo ufw reload,再执行 sudo ufw status numbered 复核顺序。
  5. 执行 docker ps --format "table {{.Names}}\t{{.Ports}}",确认 New API 没有把 3001 或数据库、Redis 端口绑定到所有网络接口;应用只监听回环地址或 Docker 内网。
  6. 不要删除 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 rulesWAF 自定义规则文档控制台创建规则文档

Cloudflare Security 设置入口
进入 Security 的 WAF 页面创建并排序自定义规则。

规则 1:阻断常见探测路径

  1. 点击 Create rule,Rule name 填 Block common exploit probes
  2. When incoming requests match 选择 Edit expression
  3. 粘贴下列表达式。
(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")
  1. Then take action 选择 Block
  2. 点击 Deploy,将该规则拖到自定义规则列表第一位。

规则 2:阻断不支持的 HTTP 方法

  1. 点击 Create rule,Rule name 填 Block unsupported HTTP methods
  2. 选择 Edit expression,粘贴下列表达式。
(http.request.method in {"TRACE" "CONNECT"})
  1. Action 选择 Block,点击 Deploy
  2. 将该规则放在探测路径规则之后、地区规则之前。

规则 3:中国大陆仅放行 /v1 与 Stripe Webhook

  1. 点击 Create rule,Rule name 填 Block CN web access except v1 and Stripe webhook
  2. 选择 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")
  1. Action 选择 Block,点击 Deploy
  2. 不要把 HK、MO、TW 加入该表达式。
  3. 不要删除 /api/stripe/webhook 例外;支付回调必须到达应用。
  4. 免费套餐自定义规则总数有限;部署后确认列表显示 3 条 Active 规则。
Cloudflare WAF 自定义规则列表
规则顺序:常见探测路径、不支持的方法、中国大陆非 API 页面。
Cloudflare 中国大陆访问规则
CN 的 /v1、/v1/* 与 Stripe Webhook 保持放行。

验证 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创建限速规则文档

  1. 点击 Create rule,Rule name 填 Protect password login
  2. 在匹配条件中选择 Edit expression,粘贴下列表达式。
(http.request.method eq "POST" and http.request.uri.path eq "/api/user/login")
  1. 关闭 Also apply rate limiting to cached assets;登录接口本身已绕过缓存。
  2. With the same characteristics 选择 IP
  3. When rate exceeds 中将 Requests 填 5,Period 选择 10 seconds
  4. Then take action 选择 Block
  5. For duration 选择 10 seconds
  6. 点击 Deploy,把规则置于 Rate limiting rules 列表第一位。
  7. 确认表达式只匹配 POST /api/user/login;不要匹配 /v1、日志、设置或支付接口。
Cloudflare 登录接口限速
同一 IP 在 10 秒内超过 5 次 POST 登录请求后阻断 10 秒。

验证登录限速

  • 使用测试账号连续提交错误密码 6 次;第 6 次应被 Cloudflare 阻断。
  • 等待 10 秒后再次登录,正常请求应恢复。
  • 进入 Security → Events,按 Protect password login 过滤并确认命中记录。

八、Turnstile

操作入口:Cloudflare Turnstile 控制台Turnstile 组件创建文档

  1. 在 Cloudflare 账号级左侧菜单打开 Turnstile,点击 Add widget
  2. Widget name 填 example.com authentication
  3. 在 Hostname management 点击 Add hostname,分别添加根域名和 www 子域名;只填主机名,不带 https:// 和路径。
  4. Widget mode 选择 Managed
  5. Pre-clearance 选择 Off
  6. 点击 Create,复制 Site KeySecret Key;Secret Key 只保存在密码管理器和 New API 后台。
Cloudflare Turnstile 组件
Turnstile 组件绑定根域名与 www 主机名。
Cloudflare Turnstile Managed 模式
Widget mode 选择 Managed,Pre-clearance 保持 Off。

写入 New API

操作入口:登录自己的 New API 管理后台 → 系统设置 → 认证设置 → Bot Protection;当前路由为 /console/system-settings/auth/bot-protection

  1. 先在 Site Key 输入框粘贴 Cloudflare 的 Site Key。
  2. 再在 Secret Key 输入框粘贴 Cloudflare 的 Secret Key。
  3. 打开 Enable Turnstile 开关。
  4. 点击页面右上角或底部的 保存;等待成功提示后刷新页面,确认开关仍为开启。
  5. 不要把 Turnstile 加到首页或 /v1 请求链路;New API 会在登录、注册、邮箱验证、密码重置等认证流程调用校验。

验证 Turnstile

  • 退出管理员账号,使用无痕窗口打开登录页,确认 Turnstile 组件能完成校验并允许登录。
  • 依次测试注册、发送邮箱验证码、忘记密码和重置密码。
  • 用 API Token 请求 /v1/models,确认没有出现 Turnstile 页面或 HTML 挑战。

九、缓存策略

操作入口:Cloudflare 控制台 → 选择域名 → Caching → Cache RulesCache Rules 文档

  1. 点击 Create rule,Rule name 填 Bypass API and dynamic requests
  2. When incoming requests match 选择 Custom filter expressionEdit expression
  3. 粘贴下列表达式。
(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")
  1. Then 中选择 Cache eligibility,值选择 Bypass cache
  2. 点击 Deploy,确认规则状态为 Active。
  3. 该表达式必须保留 /api/api/*/v1/v1/* 以及所有非 GET/HEAD 请求。
Cloudflare API 缓存绕过规则
API、v1 和非 GET/HEAD 请求统一设置为 Bypass cache。

设置基础缓存

操作入口:Cloudflare 控制台 → 选择域名 → Caching → Configuration

  1. Caching Level 选择 Standard
  2. Browser Cache TTL 选择 4 hours
  3. Development Mode 设为 Off
  4. Crawler Hints 设为 Off
  5. Cache Response Rules 保持 0;没有明确需求时不要新增覆盖响应头的规则。
  6. 发布新版本后只清理变更的静态文件;优先使用 Custom Purge,不要日常执行 Purge Everything
Cloudflare 基础缓存设置
Caching Level 为 Standard,Browser Cache TTL 为 4 hours,Development Mode 为 Off。

验证缓存

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 应为 DYNAMICBYPASS,不能为 HIT
  • 同一静态资源连续请求后可以出现 HIT
  • 后台的使用日志、系统设置、余额和用户信息刷新后必须返回最新数据。

十、网络设置

操作入口:Cloudflare 控制台 → 选择域名 → NetworkWebSockets 文档

  1. IPv6 Compatibility:On。
  2. gRPC:Off。
  3. WebSockets:On。
  4. Pseudo IPv4:Off。
  5. IP Geolocation:On。
  6. Maximum Upload Size:100 MB。
  7. Network Error Logging:On。
  8. Onion Routing:On。
Cloudflare Network 设置
开启 IPv6、WebSockets、IP Geolocation 与 Network Error Logging;gRPC 和 Pseudo IPv4 保持关闭。

验证网络功能

  • 刷新 New API 后台并观察浏览器开发者工具的 Network 面板,接口不得持续 Pending 或反复重连。
  • 上传一个小于 100 MB 的测试文件,确认请求能到达应用。
  • 如应用使用流式输出,连续测试两次长响应并确认没有被提前截断。

十一、性能设置

操作入口:Cloudflare 控制台 → 选择域名 → Speed → SettingsHTTP/3 文档Rocket Loader 文档Early Hints 文档

  1. 打开 Recommendations:将 Web analytics using real user measurement (RUM) 设为 Enabled;不要点击 Enable all available settings
  2. Speed Brain 设为 Disabled。
Cloudflare Speed Recommendations
RUM 为 Enabled,Speed Brain 为 Disabled,不批量启用推荐项。

Protocol Optimization

  1. HTTP/2:On。
  2. HTTP/2 to Origin:On。
  3. HTTP/3 (with QUIC):On。
  4. 0-RTT Connection Resumption:Off。
  5. 免费套餐不可用的 Enhanced HTTP/2 Prioritization 保持默认。
Cloudflare 协议优化设置
HTTP/2、HTTP/2 to Origin、HTTP/3 开启,0-RTT 关闭。

Content Optimization

  1. Rocket Loader:Off。
  2. Cloudflare Fonts:Off。
  3. Early Hints:Off。
  4. Speed Brain:Off。
  5. 付费套餐专属的 Polish 等图片优化项保持未启用。
Cloudflare Content Optimization
Speed Brain 关闭;不要自动改写 New API 前端的脚本加载顺序。

验证协议与前端

curl -I --http2 https://<YOUR_DOMAIN>/
  • 首页、登录页、用户后台、管理员后台分别刷新两次,确认无白屏、按钮失效或资源 404。
  • 浏览器开发者工具 Network 面板的 Protocol 列应出现 h2h3
  • 使用日志和系统设置页面加载后,动态接口仍应由源站返回,不得出现旧数据。

十二、邮件路由

操作入口:Cloudflare 控制台Compute → Email Service → Email RoutingCloudflare Email Routing 文档

  1. 打开 Email Routing 页面后,不点击 Onboard Domain
  2. 确认状态为 Unconfigured,Routing rules 为 0,Destination addresses 为 0
  3. 返回域名的 DNS → Records,确认原邮件服务的 MX、SPF、DKIM 仍存在。
  4. 不要接受 Cloudflare 自动替换 MX、SPF 或 DKIM 的提示。
Cloudflare Email Routing 未启用
继续使用原邮件服务时,Email Routing 保持 Unconfigured,规则和目标地址均为 0。

验证邮件

  • 从外部邮箱向域名邮箱发送一封测试邮件,确认可以收到。
  • 从域名邮箱回复测试邮件,确认发件成功且未进入垃圾邮件。
  • 重新执行 MX、SPF、DKIM 查询,结果应与切换 Cloudflare 前一致。

十三、验收

操作入口:Cloudflare Security Events → 选择域名 → Security → EventsCloudflare Trace 文档Stripe Webhook 文档

  1. 非中国大陆网络访问首页:应返回 200 或正常跳转。
  2. 未携带 Token 请求 /v1/models:应进入应用并返回鉴权失败,不应返回 Cloudflare 挑战页。
  3. 中国大陆网络访问首页:应由地区规则阻断。
  4. 中国大陆网络请求 /v1/models:应进入应用层;无 Token 时返回应用鉴权失败。
  5. Stripe 测试 Webhook:应进入应用层;签名无效时由应用拒绝,而不是 Cloudflare 403。
  6. 登录连续错误 6 次:应触发登录限速;10 秒后恢复。
  7. 登录、注册、邮箱验证、密码重置:应出现并通过 Turnstile。
  8. 使用日志、系统设置、余额、用户信息:刷新后返回实时数据,cf-cache-status 不能为 HIT。
  9. 静态资源:连续请求后允许出现缓存 HIT。
  10. 直接访问源站地址的 80/443:应超时或拒绝。
  11. 域名访问:应正常并包含 cf-ray
  12. DNSSEC:Cloudflare 显示 Active,DS 查询有结果。
  13. 邮件:收件、发件均正常。
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

  1. 地区误拦截:进入 Security → WAF → Custom rules,先将地区规则设为 Disabled,不要直接删除;复测后再修改表达式。
  2. 登录限速误伤:进入 Security → WAF → Rate limiting rules,先停用 Protect password login,确认恢复后再提高阈值或缩小匹配范围。
  3. Turnstile 异常:先在 New API 的 系统设置 → 认证设置 → Bot Protection 关闭 Enable Turnstile 并保存,再到 Cloudflare 停用组件。
  4. 缓存异常:进入 Caching → Cache Rules 停用缓存规则,使用 Custom Purge 清理受影响静态资源,复测 /api/v1
  5. 前端白屏或按钮失效:确认 Rocket Loader、Cloudflare Fonts、Early Hints、Speed Brain 均为 Off,执行 Custom Purge 后重新加载。
  6. HSTS 需要撤销:先保证 HTTPS 持续可用,在 HSTS 设置中将 Max Age Header 设为 0 并保存;原 Max-Age 到期前不要关闭 HTTPS、暂停 Cloudflare 或切走 NS。
  7. DNSSEC 需要撤销:先在注册商删除 DS,再在 Cloudflare 关闭 DNSSEC;不要反向操作。
  8. 源站防火墙误拦截:保持 SSH 会话在线,只临时允许可信管理来源;修复 Cloudflare 网段 allow 规则后再恢复 deny 规则。
  9. 需要切回原 DNS:先在原 DNS 服务完整恢复 A、CNAME、MX、TXT、SRV、CAA,再修改注册商 NS;切换完成前保持 Cloudflare 配置不删除。