当前位置:首页 > 环境配置 > 应用 > 正文内容

使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现)

大地主刘发财1个月前 (05-29)应用690

通过shell脚本实现一个DDNS客户端

功能:

  自动获取本机IPV6地址,找出通过DHCP获取到的IPV6

  查询指定的域名IP是否与本机相同,如果不同则更新

如果要IPV4就自行修改一下脚本,修改的不多


实现过程:

先进入Cloudflare创建好要更新的域名,Type=AAAA,地址先填个::1

 使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现) 系统 环境配置 域名 Shell Ubuntu 第1张


再创建一个API Token


创建链接: 点这里跳转到API Tokens管理界面

进入界面后点击 Create Token


 使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现) 系统 环境配置 域名 Shell Ubuntu 第2张


选择Edit Zone DNS


 使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现) 系统 环境配置 域名 Shell Ubuntu 第3张


创建的Token权限如下


 使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现) 系统 环境配置 域名 Shell Ubuntu 第4张


点击下一步之后创建Token,将界面上显示的Token字符串保存好,只显示一次,忘了就得轮换或者重新创建


安装jq

apt install jq


创建脚本文件

vi /home/update_domain.sh


脚本内容

#!/bin/bash
# 配置变量
API_TOKEN="你的API Token"
ZONE_NAME="根域名 例如: yaotou.org"
RECORD_NAME="二级域名 例如: test1.yaotou.org"
# 获取通过 DHCP 分配的 IPv6 地址(dynamic)
IPV6_ADDR=$(ip -6 addr show scope global dynamic | grep inet6 | awk '{print $2}' | cut -d/ -f1 | head -n1)
if [ -z "$IPV6_ADDR" ]; then
  echo "未找到通过DHCP分配的IPv6地址"
  exit 1
fi
echo "当前本机IPv6地址: $IPV6_ADDR"
# 获取 Zone ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" | jq -r '.result[0].id')
if [ -z "$ZONE_ID" ] || [ "$ZONE_ID" == "null" ]; then
  echo "获取Zone ID失败"
  exit 1
fi
# 获取当前 AAAA 记录信息(ID + 当前记录值)
RECORD_DATA=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME&type=AAAA" \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json")
RECORD_ID=$(echo "$RECORD_DATA" | jq -r '.result[0].id')
CURRENT_CF_IP=$(echo "$RECORD_DATA" | jq -r '.result[0].content')
# 判断是否需要更新
if [ "$IPV6_ADDR" == "$CURRENT_CF_IP" ]; then
  echo "IPv6地址未变化,无需更新Cloudflare记录。"
  exit 0
fi
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" == "null" ]; then
  echo "未找到AAAA记录,尝试创建新记录..."
  # 创建记录
  CREATE_RESULT=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
    -H "Authorization: Bearer $API_TOKEN" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"AAAA\",\"name\":\"$RECORD_NAME\",\"content\":\"$IPV6_ADDR\",\"ttl\":300,\"proxied\":false}")
  if echo "$CREATE_RESULT" | grep -q '"success":true'; then
    echo "成功创建AAAA记录"
  else
    echo "创建AAAA记录失败: $CREATE_RESULT"
    exit 1
  fi
else
  echo "IPv6地址已变更,更新Cloudflare记录..."
  # 更新记录
  UPDATE_RESULT=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
    -H "Authorization: Bearer $API_TOKEN" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"AAAA\",\"name\":\"$RECORD_NAME\",\"content\":\"$IPV6_ADDR\",\"ttl\":300,\"proxied\":false}")
  if echo "$UPDATE_RESULT" | grep -q '"success":true'; then
    echo "成功更新AAAA记录"
  else
    echo "更新AAAA记录失败: $UPDATE_RESULT"
    exit 1
  fi
fi

保存后操作

# 给脚本执行权限
chmod +x update_domain.sh

# 执行脚本开始更新域名
./update_domain.sh

# 如果需要定时执行就加一个定时任务
crontab -e
# 加入一行任务, 5分钟执行一次
*  */5 * * * /home/update_domain.sh

# 保存后重启cron服务
service cron restart


分享给朋友:

“使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现)” 的相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。