陈同学
陈同学
发布于 2026-03-30 / 6 阅读
0
0

Cloudflare DNS A 记录自动更新脚本(含优选IP,指定路径版)

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 编辑权限,必选)

  1. 打开 Cloudflare 控制台:https://dash.cloudflare.com/profile/api-tokens

  2. 点击「创建令牌」,选择模板「编辑区域 DNS」(最便捷,无需手动配置权限)

  3. 配置权限(默认已满足,无需修改):

  4. 区域 → DNS → 编辑(核心权限,用于更新DNS记录)

  5. 区域 → 区域 → 读取(用于验证域名信息)

  6. 配置「区域资源」(重点,按以下选择):

  7. 操作:包括

  8. 范围:特定区域

  9. 选择:你的目标域名(如 example.com

  10. 点击「继续以显示摘要」→「创建令牌」,保存好生成的令牌(仅显示一次),即为 CF_API_TOKEN。

2. 获取 CF_ZONE_ID(区域ID)

  1. 进入 Cloudflare 控制台,点击左侧「网站」,选择你的目标域名

  2. 进入域名「概述」页面,拉到页面最底部,找到「区域 ID」,复制即可(无需隐藏,可公开)。

3. 获取 CF_DNS_RECORD_ID(A记录ID)

  1. 先手动添加一条 A 记录:进入域名「DNS」页面,点击「添加记录」,类型选「A」,名称填你的子域名(如 ddns),内容随便填一个IP(如 1.1.1.1),TTL设为60秒,保存。

  2. 执行以下命令,替换命令中的 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 .

  3. 在返回结果中,找到你刚添加的子域名(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中的命令)。

八、备份与维护建议

  1. 脚本备份:定期备份 /data/scripts/cf_ddns/update_cf_dns.sh,避免误删或修改出错。

  2. 日志清理:日志会不断增大,可添加定时任务每月清理一次:0 0 1 * * echo “” > /var/log/cf_ddns.log

  3. 工具更新:定期查看 CloudflareSpeedTest 官方仓库,若需更新,可下载最新压缩包到 /data/cfst/,解压后覆盖原有cfst主程序即可。

  4. 目录清理:/data/cfst 目录内的 cfst_linux_amd64.tar.gz 压缩包、中文命名文件可按需删除,避免占用空间(删除中文文件命令:rm -f /data/cfst/实际中文文件名.txt)。

(注:文档部分内容可能由 AI 生成)


评论