用 cf 管理 Cloudflare DNS:从查记录到验证一次变更

从区域 ID、分页导出到代理开关,整理 Cloudflare DNS 变更流程,并解释解析成功与网站可访问之间的区别。

·8 minCloudflare命令行DNS
把应用部署到土耳其|BRNCHOST · 土耳其 VDS
云服务器,积分可续期|雨云 · 国内外节点 · 积分兑换权益
低价年付,大流量 VPS|RackNerd · SSD 存储 · 1Gbps 端口
香港轻量,搭个小站|晚安云 · 香港云服务器
香港 VPS,大带宽可选|野草云 · BGP 直连
大陆访问,精品线路|搬瓦工 · CN2 GIA / CTGNet 套餐
资料归档,交给 AI 整理|WorkBuddy · 本地文件处理
建站起步,先看应用镜像|腾讯云 · 轻量应用服务器
CN2 GIA,中国方向优化|DMIT · Premium 网络
双 ISP 原生住宅 IP|丽萨主机 · 美国 9929 精品线路
高频 CPU,多地部署|Evoxt · 云服务器 · 每周异地备份
京东云轻量云主机:129元/年,新人专享,限购1台

网站换服务器时,修改 A 记录只占几秒钟。真正耗时间的是后面的判断:记录改到了哪个账号?还有没有旧 AAAA?橙云是不是仍开着?证书正常,为什么浏览器还是进不去?Cloudflare 新 CLI cf 的价值,在于把这些变更之前的查询和记录做得更方便。

这里不以“全自动迁站”为目标,而是把一项 DNS 变更拆成可检查的步骤。先查清楚当前状态,再预览请求,最后确认访问结果。命令依据 2026 年 9 月 30 日的官方 Beta 文档;示例不包含任何实际网站的源站地址。

DNS 管理不需要创建 Workers 项目

cf 提供公共 API 命令,可以在普通目录运行,不要求先生成 cloudflare.config.ts。如果只管理域名,不必先 cf init,也不必把 VPS 应用迁移到 Workers。

安装要求 Node.js 22.18 或更新版本:

npm install --global cf
cf --version
cf auth login
cf auth whoami

新工具不会继承 Wrangler 的登录凭据,需要单独认证。无交互脚本则使用 API Token,并限定它能管理的域名及权限。能列出区域与能修改区域内 DNS 是不同操作,不要只看登录是否成功。cf 安装说明

先把域名和区域 ID 对上

cf zones list --name example.com
cf dns records list --zone example.com

zone 可以理解为 Cloudflare 管理的域名区域。记录 ID、zone ID 和 account ID 分别指向不同对象,后面写脚本时需要保留完整对应关系。多个账号时,显式设置正确的 CLOUDFLARE_ACCOUNT_ID,减少交互选择或旧缓存造成的歧义。

不要仅凭“网站现在能打开”判断记录状态。Cloudflare 控制台里的记录、公网递归解析器里的缓存和浏览器的连接结果,是三个不同观察点。变更前留一份记录输出,至少能知道准备修改的对象原来是什么。

cf dns records list --zone example.com --type A
cf dns records list --zone example.com --type AAAA

域名同时有 A 和 AAAA 时,支持 IPv6 的客户端可能走另一条路径。如果只改 IPv4,而旧 IPv6 地址仍指向以前的服务,网站就会表现为有些网络正常、有些网络异常。不要因此直接删除所有 AAAA,先确认服务器是否仍提供正确的 IPv6 服务。

导出时,记住“列表”可能只有第一页

官方说明 cf dns records list 每次返回一页。先看帮助,确认分页参数,再按页面收集:

cf dns records list --help
cf dns records list --zone example.com --page 1 --per-page 100 > dns-page-1.json

记录超过一页时继续取后续页。把结果合并前,检查退出状态和 JSON 是否能解析。不要因为文件非空就认定备份完成,错误、空列表和第一页列表都可能让脚本产生错误判断。

如果安装了 jq,可以整理为便于审阅的表格:

jq -r '.[] | [.id, .type, .name, .content, .proxied] | @tsv' dns-page-1.json

这份文件适合做变更前快照,但不是“整个域名设置”的备份。缓存规则、证书设置、邮件策略和安全规则属于其他配置,不能从 DNS 列表恢复。官方 DNS 管理示例

找到命令,再看请求,不凭印象写参数

cf cli search "create a DNS record"
cf schema dns records create
cf dns records create --help

搜索结果里会同时出现 create、edit、update 等入口。当前版本命令摘要将 edit 描述为更新、update 描述为覆盖,这也提醒我们:英文名字相近,不等于修改语义相同。更新已有记录前应检查对应 API 说明,确认哪些字段必须提供,不能把新增命令拿来反复运行。

某些操作只接受完整 JSON 请求体,schema 展示的字段列表也可能不完整。帮助用于检查命令用法,API 文档用于确认请求体结构,两者配合才够用。创建记录 API

DNS 创建请求的实际 dry-run 输出

创建 DNS 记录的请求预览,使用示例区域 ID 和文档地址。

用测试子域名走一遍流程

先预览一条记录:

cf dns records create \
  --zone 00000000000000000000000000000000 \
  --body '{"type":"A","name":"test","content":"192.0.2.1","proxied":false}' \
  --dry-run

预览结果应包含 POST 方法、目标 zone 的路径和 JSON 内容。dry run 不会按域名名称查询 zone,所以这里使用 ID。示例 ID 和地址都不能拿来正式创建记录。

在真实操作中,换成自己的区域 ID、测试子域名及受控服务器地址。先确认这个名称没有现存记录或业务,再决定是否执行。运行不带 dry run 的命令会真的改远程资源,不是另一种形式的演示。

本文没有替读者实际创建测试记录。建议第一次练习不要选根域名、邮件记录或线上 API 地址;选一个没有业务依赖的名称,出了问题更容易判断影响范围。

橙云与灰云,是访问路径的选择

proxied 是 DNS 请求体里的一个字段。对支持代理的记录,true 表示流量经 Cloudflare 代理,false 表示直接解析到源站。它不是一个单纯的“提速按钮”。

走代理时,用户到 Cloudflare、Cloudflare 到源站分别是一段链路;直接解析则由用户连接源站。哪种更快取决于用户网络、源站线路、内容大小和缓存情况,不能凭开关颜色给所有地区下结论。代理记录的工作方式

切到直接解析前,要检查源站允许的来源地址。有的反向代理只接受 CDN 出口 IP,去掉代理后仍保留这条限制,访客就会遇到 403 或类似“Direct origin access denied”的错误。这种情况下 DNS 可以完全正确,问题仍在服务器的访问规则。

源站证书也要适合浏览器直接访问。DNS 修改不会替你申请公开可信证书,更不会替 Caddy、Nginx 或应用修改域名配置。

执行后,用三层证据验收

第一层是资源回读:通过 CLI 再列出对应名称,核对 ID、内容和代理状态。第二层是解析结果:查询权威 DNS,并对比常用递归解析器。第三层才是网页访问:保留原域名与 TLS 校验,检查首页、文章及图片。

dig NS example.com
dig A test.example.com
dig AAAA test.example.com
curl -I https://test.example.com/

需要查权威结果时,根据 NS 查询得到的真实服务器运行 dig @<权威服务器> ...。代理开启时,公网解析显示代理地址而非源站地址是正常现象;直接解析时才应看到配置的目标地址。

记录值已经回读成功,但一部分递归解析器仍返回旧值,可能是缓存尚未过期。把测试时间、解析器和结果记下来,避免反复来回修改记录,让迁移状态更加混乱。

删除记录的脚本,不能只看退出码

官方文档特别提到:无交互环境中的删除命令,未带 --force 时会中止、输出 Aborted.,退出状态却可能是 0。脚本看到成功退出,不代表记录已经删除。

因此,删除之后必须查询资源是否仍存在。--force 在部分命令中还有 API 层面的含义,不宜作为所有命令的默认参数。整理旧记录时,按记录 ID、类型、名称逐项确认,别把同名的 MX 或 TXT 一起处理掉。无交互行为说明

CLI 带来的便利是把操作过程留下来;一次迁移是否完成,仍要由记录回读和真实访问共同确认。