配套文章:《把域名接入 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 时的核对模板 |
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.jsWindows 用户可以在 WSL 或 Git Bash 里运行;不装也行,nslookup -type=ns 你的域名 1.1.1.1 能看到同样的 NS。
完整源码
check-ns.sh
25 行 · bash#!/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; ficheck-proxy.sh
14 行 · bash#!/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"
ficheck-psl.sh
12 行 · bash#!/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 免费版大概率不接"
fidns-records-template.txt
9 行 · text# 接入 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(第三方验证记录一般不开代理)