Cloudflare DNS A 记录自动更新脚本(含优选IP,指定路径版)
一、目录结构(按你的需求固定,结合实际文件)
统一规范路径,避免混乱,适配你的脚本存放需求,结合 /data/cfst 目录实际文件,所有路径均已固定,直接对照使用即可:
# 固定目录结构(已按你的要求配置,结合实际文件)
/data/
├── cfst/ # 你已确定的 CloudflareSpeedTest 工具存放目录
│ ├── cfst # CloudflareSpeedTest 主程序(实际文件名,替换原CloudflareST)
│ ├── cfst_hosts.sh # 辅助脚本(目录内实际存在,无需操作)
│ ├── cfst_linux_amd64.tar.gz # 工具压缩包(可保留,用于后续更新)
│ ├── ip.txt # IP段库(测速用,可自行更新,目录内已存在)
│ ├── ipv6.txt # IPv6段库(目录内已存在,脚本暂不使用,可保留)
│ ├── result.csv # 测速结果文件(脚本自动生成/覆盖,目录内已存在)
│ └── 中文命名文件.txt # 目录内冗余文件(可忽略,不影响脚本运行)
└── scripts/ # 脚本主目录
└── cf_ddns/ # 该脚本专属目录
└── update_cf_dns.sh # 核心脚本(你指定的存放路径)
# 日志路径(系统标准日志目录,避免占用脚本目录空间)
/var/log/cf_ddns.log # 脚本运行日志(方便排查错误)
二、准备工作(必须先完成)
1. 确认 CloudflareSpeedTest 目录及文件
根据你提供的 /data/cfst 目录文件列表,该目录已存在核心文件,无需重新下载压缩包,仅需确认主程序权限即可(若目录内 cfst 主程序无法运行,可重新解压压缩包):
# 确认 /data/cfst 目录文件(可执行该命令验证)
ls /data/cfst/
# 重点:给 CloudflareSpeedTest 主程序(cfst)赋予执行权限(必做)
chmod +x /data/cfst/cfst
# (可选)若cfst主程序无法运行,重新解压压缩包(目录内已存在cfst_linux_amd64.tar.gz)
tar -zxf /data/cfst/cfst_linux_amd64.tar.gz -C /data/cfst/ --overwrite
# (可选)更新IP段库(若ip.txt内容过时,可重新下载)
wget -N https://raw.githubusercontent.com/XIU2/CloudflareSpeedTest/master/ip.txt -P /data/cfst/
说明:目录内的 cfst_hosts.sh、ipv6.txt、中文命名文件及压缩包,不影响脚本正常运行,可保留或按需删除(中文命名文件建议删除,避免后续操作报错,删除命令:rm -f /data/cfst/中文命名文件.txt,替换为实际文件名)。
2. 安装脚本依赖
脚本依赖 curl(请求API)、jq(解析JSON响应),必须安装:
# Debian/Ubuntu 系统
apt update && apt install -y curl jq
# CentOS/RHEL 系统
yum install -y curl jq
3. 获取 Cloudflare API 关键信息
需提前准备4个核心信息,后续填入脚本,获取教程见下文第四部分:
CF_API_TOKEN:Cloudflare API 令牌(需具备 DNS 编辑权限)
CF_ZONE_ID:目标域名所在的区域 ID
CF_DNS_RECORD_ID:要更新的 A 记录 ID(需先手动添加一条A记录)
CF_DOMAIN:要更新的域名(如 ddns.example.com)
三、完整脚本(已适配指定路径+实际cfst文件,直接复制使用)
脚本路径固定为:/data/scripts/cf_ddns/update_cf_dns.sh,已适配 /data/cfst 目录实际文件(主程序名为cfst),所有路径已提前配置好,仅需修改【必须配置】部分的4个API信息即可。
#!/bin/bash
# ==================== 只需修改这4项 ====================
CF_API_TOKEN="你的Cloudflare API令牌"
ZONE_ID="你的Cloudflare区域ID"
DOMAIN="你的自定义域名" # 例:example.com
CFST_PATH="/data/cfst"
# ==============================================
# 8条A记录RECORD_ID
RECORD_IDS=(
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
"A记录RECORD_ID"
)
# ==================== 1. 进入目录测速 ====================
cd "$CFST_PATH" || exit 1
echo "========================================"
echo "执行时间:$(date)"
echo "开始测速 CloudflareSpeedTest..."
# 运行测速(根据实际目录结构调整)
./cfst -tl 500 -sl 3 -dn 10 -o result.csv
# ==================== 2. 读取前8个最优IP ====================
IP_LIST=$(awk -F ',' 'NR>1 && NR<=9 {print $1}' result.csv)
readarray -t IPS <<< "$IP_LIST"
echo "测速完成!获取前8个最优IP:"
printf "%s\n" "${IPS[@]}"
# ==================== 3. 批量更新DNS ====================
for i in "${!RECORD_IDS[@]}"; do
rid="${RECORD_IDS[$i]}"
ip="${IPS[$i]}"
echo "----------------------------------------"
echo "更新记录ID: $rid"
echo "优选IP: $ip"
echo "目标域名: $DOMAIN"
res=$(curl -s --connect-timeout 10 -X PUT \
"https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$rid" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type":"A",
"name":"'"$DOMAIN"'",
"content":"'"$ip"'",
"ttl":1,
"proxied":false
}')
if echo "$res" | grep -q '"success":true'; then
echo "✅ 成功"
else
echo "❌ 失败"
echo "错误信息:$res"
fi
sleep 1.5
done
echo "
执行完成:$(date)
========================================
"四、脚本部署与测试(按步骤执行,无坑)
1. 创建脚本目录并上传脚本
先创建你指定的脚本目录,再将上面的完整脚本写入文件:
# 1. 创建脚本目录(确保路径存在)
mkdir -p /data/scripts/cf_ddns
# 2. 写入脚本内容(直接复制下面的命令,会自动创建update_cf_dns.sh文件)
cat > /data/scripts/cf_ddns/update_cf_dns.sh << 'EOF'
#!/bin/bash
# ==================== 只需修改这4项 ====================
CF_API_TOKEN="你的Cloudflare API令牌"
ZONE_ID="你的Cloudflare区域ID"
DOMAIN="你的自定义域名" # 例:example.com
CFST_PATH="/data/cfst"
# ==============================================
# 8条A记录RECORD_ID
RECORD_IDS=(
"2a6ba5e1ecbedf51fdf9f8811b7f01ca"
"35918fefa1e1cb04bf72d0c16291409e"
"9bbc407de86072cb242f1cf5f872a721"
"9be1d455a68ed5a685b72f30c11dc93a"
"83fa6d36bc3bc73118e9468eb0974bd6"
"3c6a4a10b225f2c86fe506461ebe1d2c"
"b266328216a679ff236578dfe0634d54"
"8161af7692dfa6c5f132cafc3ac7bc9a"
)
# ==================== 1. 进入目录测速 ====================
cd "$CFST_PATH" || exit 1
echo "========================================"
echo "执行时间:$(date)"
echo "开始测速 CloudflareSpeedTest..."
# 运行测速(根据实际目录结构调整)
./cfst -tl 500 -sl 3 -dn 10 -o result.csv
# ==================== 2. 读取前8个最优IP ====================
IP_LIST=$(awk -F ',' 'NR>1 && NR<=9 {print $1}' result.csv)
readarray -t IPS <<< "$IP_LIST"
echo "测速完成!获取前8个最优IP:"
printf "%s\n" "${IPS[@]}"
# ==================== 3. 批量更新DNS ====================
for i in "${!RECORD_IDS[@]}"; do
rid="${RECORD_IDS[$i]}"
ip="${IPS[$i]}"
echo "----------------------------------------"
echo "更新记录ID: $rid"
echo "优选IP: $ip"
echo "目标域名: $DOMAIN"
res=$(curl -s --connect-timeout 10 -X PUT \
"https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$rid" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type":"A",
"name":"'"$DOMAIN"'",
"content":"'"$ip"'",
"ttl":1,
"proxied":false
}')
if echo "$res" | grep -q '"success":true'; then
echo "✅ 成功"
else
echo "❌ 失败"
echo "错误信息:$res"
fi
sleep 1.5
done
echo "
执行完成:$(date)
========================================
"
EOF
2. 赋予脚本执行权限
chmod +x /data/scripts/cf_ddns/update_cf_dns.sh
3. 修改脚本配置(关键步骤)
编辑脚本,替换【必须配置】部分的4个API信息:
vim /data/scripts/cf_ddns/update_cf_dns.sh
进入编辑模式后,找到以下4行,替换成你自己的信息,保存退出(按ESC,输入:wq):
CF_API_TOKEN="你的Cloudflare API令牌"
CF_ZONE_ID="你的区域ID"
CF_DNS_RECORD_ID="你的DNS记录ID"
CF_DOMAIN="要更新的域名(如ddns.example.com)"
4. 手动测试脚本运行
测试脚本是否能正常获取IP、更新DNS,运行后查看日志确认结果:
# 运行脚本
/data/scripts/cf_ddns/update_cf_dns.sh
# 查看日志(确认是否成功)
tail -f /var/log/cf_ddns.log
日志中出现「DNS A 记录更新成功」即为部署正常;若出现错误,可根据日志提示排查(如API信息错误、IP获取失败等)。
五、Cloudflare API 信息获取详细教程(补充完善)
1. 获取 CF_API_TOKEN(DNS 编辑权限,必选)
打开 Cloudflare 控制台:https://dash.cloudflare.com/profile/api-tokens
点击「创建令牌」,选择模板「编辑区域 DNS」(最便捷,无需手动配置权限)
配置权限(默认已满足,无需修改):
区域 → DNS → 编辑(核心权限,用于更新DNS记录)
区域 → 区域 → 读取(用于验证域名信息)
配置「区域资源」(重点,按以下选择):
操作:包括
范围:特定区域
选择:你的目标域名(如 example.com)
点击「继续以显示摘要」→「创建令牌」,保存好生成的令牌(仅显示一次),即为 CF_API_TOKEN。
2. 获取 CF_ZONE_ID(区域ID)
进入 Cloudflare 控制台,点击左侧「网站」,选择你的目标域名
进入域名「概述」页面,拉到页面最底部,找到「区域 ID」,复制即可(无需隐藏,可公开)。
3. 获取 CF_DNS_RECORD_ID(A记录ID)
先手动添加一条 A 记录:进入域名「DNS」页面,点击「添加记录」,类型选「A」,名称填你的子域名(如 ddns),内容随便填一个IP(如 1.1.1.1),TTL设为60秒,保存。
执行以下命令,替换命令中的 ZONE_ID 和 API_TOKEN,获取所有A记录信息:
curl -X GET "https://api.cloudflare.com/client/v4/zones/你的ZONE_ID/dns_records?type=A" \ -H "Authorization: Bearer 你的API_TOKEN" \ -H "Content-Type: application/json" | jq .在返回结果中,找到你刚添加的子域名(name 字段对应),其对应的「id」字段,即为 CF_DNS_RECORD_ID。
六、设置定时任务(自动更新,无需人工干预)
配置 crontab 定时任务,让脚本自动运行,建议每30分钟~1小时更新一次(根据需求调整):
# 编辑定时任务
crontab -e
# 添加以下一行(每30分钟运行一次,日志自动写入/var/log/cf_ddns.log)
*/30 * * * * /data/scripts/cf_ddns/update_cf_dns.sh
# 保存退出(ESC → :wq)
# 查看定时任务是否生效
crontab -l
定时任务说明:*/30 * * * * 表示每30分钟执行一次脚本,若想每1小时执行,改为 0 * * * * 即可。
七、脚本说明与常见问题
1. 脚本关键参数说明
测速参数:-n 10(只测10个IP的延迟,加快测速速度)、-dn 0(关闭下载测速,仅测延迟,适合快速优选)
TTL:60秒(Cloudflare 最低TTL,确保IP更新后能快速生效)
proxied: false(关闭Cloudflare代理,直接解析到优选IP;若需要Cloudflare的CDN和防护,可改为true)
工具路径:CFST_PATH=“/data/cfst/cfst”,已适配你目录内实际的主程序名(替换原CloudflareST),无需修改。
2. 常见问题排查
问题1:脚本运行提示「未获取到有效最优IP」?
解决:检查 /data/cfst/ip.txt 是否存在、网络是否通畅,可重新下载ip.txt(准备工作1中的命令)。问题2:DNS更新失败,提示「权限不足」?
解决:检查 CF_API_TOKEN 的权限是否为「编辑区域DNS」,区域资源是否选择了目标域名。问题3:日志文件无法写入?
解决:执行 chmod 777 /var/log/cf_ddns.log 赋予日志文件写入权限。问题4:定时任务不执行?
解决:检查脚本路径是否正确(必须是绝对路径 /data/scripts/cf_ddns/update_cf_dns.sh),可重启crontab服务:systemctl restart crond。问题5:脚本提示「cfst文件不存在」?
解决:执行 ls /data/cfst/cfst 确认文件是否存在,若不存在,重新解压目录内的cfst_linux_amd64.tar.gz压缩包(准备工作1中的命令)。
八、备份与维护建议
脚本备份:定期备份 /data/scripts/cf_ddns/update_cf_dns.sh,避免误删或修改出错。
日志清理:日志会不断增大,可添加定时任务每月清理一次:0 0 1 * * echo “” > /var/log/cf_ddns.log
工具更新:定期查看 CloudflareSpeedTest 官方仓库,若需更新,可下载最新压缩包到 /data/cfst/,解压后覆盖原有cfst主程序即可。
目录清理:/data/cfst 目录内的 cfst_linux_amd64.tar.gz 压缩包、中文命名文件可按需删除,避免占用空间(删除中文文件命令:rm -f /data/cfst/实际中文文件名.txt)。
(注:文档部分内容可能由 AI 生成)