有些时候vps或者家宽ip不是固定的,此时就需要一个简单的ddns服务
如果你有一个托管在cloudflare的域名,就可以通过脚本来自建ddns
要快速设置基于 Cloudflare 的 DDNS 服务,可以按以下步骤操作,这里以ddns.example.com为例:


1. 准备环境

这里以debian和ubuntu为例,其余linux发行版安装curl和fq即可
确保你的系统已安装以下工具:

  • curl:用于与 Cloudflare API 交互。
  • jq:用于解析 JSON 格式的数据。

debian和ubuntu下的安装命令:

sudo apt update
sudo apt install curl jq -y

2. 创建 Cloudflare API 令牌

  1. 登录到你的 Cloudflare Dashboard.
  2. 进入 API Tokens页面,点击 创建令牌
    API令牌页面
  3. 使用 编辑区域 DNS 模板。
    选择编辑区域 DNS模板
  4. 这里Select选择你的域名 example.com,其余照填,创建令牌并复制它,备用。
    创建对应域名的API令牌

3. 编写 DDNS 脚本

创建一个脚本文件 ddns.sh
注意将Cloudflare API 配置部分替换为你的域名和令牌

#!/bin/bash

# Cloudflare API 配置
ZONE_NAME="example.com"       # 域名
RECORD_NAME="ddns.example.com"  # DDNS 记录
CF_API_TOKEN="your_cloudflare_api_token"  # 替换为你的 Cloudflare API 令牌

# 获取 Zone ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=${ZONE_NAME}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" | jq -r '.result[0].id')

# 获取记录 ID
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=${RECORD_NAME}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" | jq -r '.result[0].id')

# 获取当前公网 IP
CURRENT_IP=$(curl -s https://ipv4.icanhazip.com)

# 更新 DNS 记录
UPDATE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}\",\"content\":\"${CURRENT_IP}\",\"ttl\":120,\"proxied\":false}")

# 检查结果
if echo "$UPDATE" | grep -q '"success":true'; then
    echo "[$(date)] DNS 记录更新成功: ${CURRENT_IP}"
else
    echo "[$(date)] DNS 记录更新失败!"
    echo "$UPDATE"
fi

4. 设置脚本权限

将脚本设置为可执行:

chmod +x ddns.sh

5. 设置定时任务

使用 cron 每 30 分钟运行一次脚本:

  1. 编辑 crontab

    crontab -e
  2. 添加以下内容:

    */30 * * * * /path/to/ddns.sh >> /var/log/ddns.log 2>&1

如果需要其他间隔时间,例如十分钟一次,则将30改为10即可。

测试脚本

直接运行脚本以测试:

./ddns.sh

查看 /var/log/ddns.log 确保日志记录正确。


完成后,DDNS 会每 30 分钟更新一次你的 ddns.example.com 记录。
其他记录同理,只需修改脚本中RECORD_NAME="ddns.example.com"的域名即可。

最后修改:2025 年 01 月 07 日
如果觉得我的文章对你有用,请点赞支持