🔎 Cloudflare 域名接入自检工具包

三个 Bash 脚本:查后缀是否在 PSL、用 DoH 确认 NS 已交给 Cloudflare、检查小橙云和缓存命中。

BashcurljqDoH· 5 个文件 · 80 行 · MIT 协议

配套文章:《把域名接入 Cloudflare》《0 元拿一个能接入 Cloudflare 的免费域名》,配套视频:抖音/B 站 EP02、EP03。

文件作用
check-psl.sh免费后缀是否在公共后缀列表里(决定能不能接 Cloudflare 免费版)
check-ns.sh用 DoH 查 NS,判断是否已交给 Cloudflare,可对比后台分配的两个 NS
check-proxy.sh看响应头确认小橙云生效、静态资源缓存是否命中
dns-records-template.txt迁移 DNS 时的核对模板
bash
chmod +x *.sh
./check-psl.sh kdns.fr
./check-ns.sh 你的域名 ada.ns.cloudflare.com bob.ns.cloudflare.com   # 换成你后台显示的两个
./check-proxy.sh https://你的域名 /static/app.js

Windows 用户可以在 WSL 或 Git Bash 里运行;不装也行,nslookup -type=ns 你的域名 1.1.1.1 能看到同样的 NS。

完整源码

check-ns.sh

25 行 · bash
check-ns.sh
#!/usr/bin/env bash
# 用法:./check-ns.sh 你的域名 [期望的NS1] [期望的NS2]
# 通过 Google 公共 DNS 的 JSON 接口(DoH)查询 NS 记录,判断域名是否已交给 Cloudflare。
# 依赖:curl;jq 可选(没装就打印原始 JSON)。
set -euo pipefail
DOMAIN="${1:?用法: $0 example.com [ns1] [ns2]}"
URL="https://dns.google/resolve?name=${DOMAIN}&type=NS"
RAW="$(curl -fsS --max-time 10 "$URL")"
if ! command -v jq >/dev/null 2>&1; then
  echo "未安装 jq,原始返回:"; echo "$RAW"; exit 0
fi
mapfile -t NS < <(echo "$RAW" | jq -r '.Answer[]?.data' | sed 's/\.$//' | sort)
if [ "${#NS[@]}" -eq 0 ]; then
  echo "❌ 没查到 NS 记录:检查域名是否写对(要写完整域名,不是上一级后缀),或者稍后再查"; exit 1
fi
printf '查到的 NS:\n'; printf '  %s\n' "${NS[@]}"
ok=1
for n in "${NS[@]}"; do [[ "$n" == *.ns.cloudflare.com ]] || ok=0; done
if [ $# -ge 3 ]; then
  want=$(printf '%s\n' "${2%.}" "${3%.}" | sort | tr '\n' ' ')
  got=$(printf '%s\n' "${NS[@]}" | tr '\n' ' ')
  [ "$want" == "$got" ] || { echo "⚠️ 和你后台分配的不一致:期望 $want"; ok=0; }
fi
if [ $ok -eq 1 ]; then echo "✅ 已交给 Cloudflare,后台状态随后会变 Active"; else echo "⏳ 还没生效(官方说最多 24 小时),过会儿再查"; exit 2; fi

check-proxy.sh

14 行 · bash
check-proxy.sh
#!/usr/bin/env bash
# 用法:./check-proxy.sh https://你的域名 [静态资源路径]
# 检查网站是否经过 Cloudflare 代理(小橙云),以及静态资源缓存是否命中。
set -euo pipefail
SITE="${1:?用法: $0 https://example.com [/static/app.js]}"
ASSET="${2:-}"
echo "== 响应头 =="
curl -sI --max-time 10 "$SITE" | grep -iE '^(server|cf-ray|cf-cache-status):' || echo "没看到 Cloudflare 响应头:记录可能是小灰云(仅 DNS)"
if [ -n "$ASSET" ]; then
  echo "== 缓存测试(连续请求两次)=="
  for i in 1 2; do curl -sI --max-time 10 "${SITE%/}${ASSET}" | grep -i '^cf-cache-status:' || echo "无 cf-cache-status"; done
  echo "第一次 MISS、第二次 HIT 说明缓存生效;HTML 页面默认是 DYNAMIC"
fi

check-psl.sh

12 行 · bash
check-psl.sh
#!/usr/bin/env bash
# 用法:./check-psl.sh kdns.fr
# 免费二级域名能否接入 Cloudflare 免费版,前提之一是它的后缀在公共后缀列表(PSL)里。
set -euo pipefail
SUFFIX="${1:?用法: $0 后缀,例如 kdns.fr}"
LIST="$(curl -fsS --max-time 20 https://publicsuffix.org/list/public_suffix_list.dat)"
if grep -qx "$SUFFIX" <<<"$LIST"; then
  echo "✅ $SUFFIX 在 PSL 里:在它下面注册的 名字.$SUFFIX 可以作为独立域名接入 Cloudflare 免费版"
else
  echo "❌ $SUFFIX 不在 PSL 里:Cloudflare 免费版大概率不接"
fi

dns-records-template.txt

9 行 · text
dns-records-template.txt
# 接入 Cloudflare 前,拿原 DNS 服务商的记录逐条核对(示例域名 example.com,示例 IP 用文档专用段)
类型    名称      内容                      代理状态
A       @         192.0.2.1                 橙云 Proxied
CNAME   www       example.com               橙云 Proxied
A       ssh       192.0.2.1                 灰云 DNS only(SSH 不能走代理)
MX      @         10 mx1.mail-provider.test 无(MX 不能代理)
TXT     @         "v=spf1 include:... ~all" 无
CNAME   verify    xxx.third-party.test      灰云 DNS only(第三方验证记录一般不开代理)