使用shell脚本获取本机IPV6地址(DHCP),通过Cloudflare的API更新域名IP(Cloudflare DDNS实现)
通过shell脚本实现一个DDNS客户端
功能:
自动获取本机IPV6地址,找出通过DHCP获取到的IPV6
查询指定的域名IP是否与本机相同,如果不同则更新
如果要IPV4就自行修改一下脚本,修改的不多
实现过程:
先进入Cloudflare创建好要更新的域名,Type=AAAA,地址先填个::1
再创建一个API Token
创建链接: 点这里跳转到API Tokens管理界面
进入界面后点击 Create Token
选择Edit Zone DNS
创建的Token权限如下
点击下一步之后创建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