步骤1:获取 API 令牌
登录到您的 Cloudflare 账户。
点击您托管到CF的域名
在右侧导航栏中,复制区域 ID
屏幕截图 2025-01-21 084533.png
2: 然后点击获取您的API令牌-创建令牌-API 令牌模板-编辑区域 DNS
DNS 模板,只需2个权限:
权限保持默认
区域资源:包括-特定区域-后面选择你的域名
屏幕截图 2025-01-21 085027.png
点击“继续”。

创建令牌复制此令牌以访问 Cloudflare API


步骤2:配置 DDNS 脚本
在您的服务器上创建一个脚本文件,例如 cloudflare_ddns.sh

例:root目录下创建cloudflare_ddns.sh,文件路径为/root/cloudflare_ddns.sh ,

屏幕截图 2025-01-21 090809.png

在finalshell中右键选择该文件,选择文件权限-全部打勾确定,然后打开cloudflare_ddns.sh这个文件

将以下脚本内容粘贴到文件中,并用您的信息替换

your_api_token:第二步获取的API
your_zone_id: 你的域名的区域 ID
your_record_name.example.com:替换为你需要使用的DDNS域名比如aa.bb.com

#!/bin/bash

# 配置 Cloudflare 信息
auth_token="your_api_token"                       # Cloudflare API Token
zone_identifier="your_zone_id"                    # Cloudflare 区域 ID
record_name="your_record_name.example.com"        # 要同步的记录名称 

# 开始脚本
echo "正在检查 IP 更新..."

# 获取当前外网 IP
ip=$(curl -s4 https://icanhazip.com/)
if [[ -z "$ip" ]]; then
  echo "错误: 无法获取外部网络 IP。" >&2
  exit 1
fi
echo "当前外部 IP: $ip"

# 设置认证头
auth_header=(-H "Authorization: Bearer $auth_token")

# 获取当前 DNS 记录
record=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name&type=A" \
  "${auth_header[@]}" -H "Content-Type: application/json")

# 检查记录是否存在
if [[ -z "$record" ]] || [[ "$record" == *'"count":0'* ]]; then
  echo "DNS 记录不存在,正在创建新记录..."

  # 创建新的 DNS 记录
  create=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records" \
    "${auth_header[@]}" -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\",\"ttl\":120,\"proxied\":false}")

  # 检查创建结果
  if echo "$create" | grep -q '"success":true'; then
    echo "DNS 记录创建成功。IP: $ip"
  else
    echo "错误: DNS 记录创建失败。响应: $create" >&2
    exit 1
  fi
  exit 0
fi

# 提取记录 ID 和当前的 IP 地址
record_identifier=$(echo "$record" | sed 's/.*"id":"\([^"]*\)".*/\1/')
old_ip=$(echo "$record" | sed 's/.*"content":"\([^"]*\)".*/\1/')
echo "当前 DNS IP: $old_ip"

# 如果 IP 没有变化,则退出
if [[ "$ip" == "$old_ip" ]]; then
  echo "IP 地址未更改,更新已取消。"
  exit 0
fi

# 更新 DNS 记录
update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" \
  "${auth_header[@]}" -H "Content-Type: application/json" \
  --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\",\"ttl\":120,\"proxied\":false}")

# 检查更新结果
if echo "$update" | grep -q '"success":true'; then
  echo "更新成功。旧 IP: $old_ip, 新 IP: $ip"
else
  echo "错误: 更新失败。响应: $update" >&2
  exit 1
fi

步骤3:打开运行 DDNS 脚本
导航到您保存脚本文件的目录。例:文件在/root/cloudflare_ddns.sh

cd /root

运行脚本:bash cloudflare_ddns.sh


步骤4:配置 DDNS 定时运行

输入:crontab -e

按键盘方向键下或者滑动滚轮到文本末尾最后一行

*/50 * * * * bash /root/cloudflare_ddns.sh

以上文本中的数字是每50分钟运行一次

如果你需要每天的 0 点执行,格式就是这样:

*/0 0 * * * bash /root/cloudflare_ddns.sh

如果你需要每隔 10 分钟执行就是这样:

*/10 * * * * bash /root/cloudflare_ddns.sh

执行含义参考文章末尾有参考

然后 按ctrl+x 然后输入y 回车即可保存

然后查看当前用户的 cron 任务可以使用:

crontab -l

如果在末尾最后一行看到你添加的代码那么已经成功

以下是进阶或者无用的:

如何输出日志:在任意文档新建一个txt文档,文档权限记得赋予写入权限,更换代码为

 */50 * * * * bash /root/cloudflare_ddns.sh >> /root/ddnslog.txt 2>&1

/root/ddnslog.txt 2>&1 其中/root/ddnslog.txt 为你文档路径和名字

2>&1 是把标准错误重定向到标准输出,忽略即可

如果在末尾最后一行看到你添加的代码那么已经成功

时间设置 含义

*/5 * * * *  为每5分钟执行一次

屏幕截图2 2025-01-21 092123.png