使用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

