2025-08-12
计算机
00

假设我们现在有域名<你的域名>,我们可以使用DNS提供商(以Cloudflare为例)的API定期更新IPv6。

  1. DNS添加AAAA记录(指向你的IPv6)

登录https://dash.cloudflare.com,在Cloudflare中加入域,并将你的域名的DNS解析服务器(你购买域名的服务商)替换成Cloudflare的DNS服务器,在该域名的DNS管理后台添加记录:

类型 名称 IPv6地址 代理状态 TTL AAAA www <随便填一个> 仅DNS 2分钟

并在dash页面的该域名下的概述界面的右下角,获取您的API令牌,并在此处记住你的域名的区域ID(ZONE ID)。

  1. 安装DDNS脚本 安装必要的软件(Debian系下):
sudo apt install curl jq

创建一个如下脚本/usr/local/bin/ddns-ipv6.sh,注意修改配置部分的内容:

Shell
#!/bin/bash LOGFILE="/var/log/ddns-ipv6.log" LAST_IP_FILE="/var/tmp/last_ipv6.txt" touch $LOGFILE chmod 644 $LOGFILE echo "=== $(date) Starting DDNS update ===" >> $LOGFILE # 配置部分 CF_API_TOKEN="<你的Cloudflare API Token>" CF_ZONE_ID="<你的Zone ID>" RECORD_NAME="<你的域名>" NET_INTERFACE="enp0s31f6" # 改为你的实际网卡名 TTL=120 # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOGFILE } # 尝试多种方法获取可靠的公网IPv6 get_ipv6() { local ip_system=$(ip -6 addr show dev $NET_INTERFACE scope global \ | grep -E 'global (dynamic|mngtmpaddr|temporary|permanent)' \ | awk '/inet6/{print $2}' | cut -d'/' -f1 | head -1) local ip_api=$(curl -6 --connect-timeout 5 -s https://api64.ipify.org || \ curl -6 --connect-timeout 5 -s https://ipv6.icanhazip.com) [ -n "$ip_system" ] && echo $ip_system || echo $ip_api } # 获取当前IPv6 IP=$(get_ipv6) if [ -z "$IP" ]; then log "错误:无法获取有效的IPv6地址" exit 1 fi log "检测到的IPv6地址: $IP" # 读取上一次的IP if [ -f "$LAST_IP_FILE" ]; then LAST_IP=$(cat "$LAST_IP_FILE") if [ "$IP" = "$LAST_IP" ]; then log "IPv6地址未变化,无需更新 ($IP)" echo "=== $(date) Finished DDNS update ===" >> $LOGFILE exit 0 else log "检测到IPv6已变化: $LAST_IP → $IP" fi else log "首次运行,未检测到历史IP" fi # 获取记录ID RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records?type=AAAA&name=$RECORD_NAME" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json") SUCCESS=$(echo "$RESPONSE" | jq -r '.success') if [ "$SUCCESS" != "true" ]; then ERRORS=$(echo "$RESPONSE" | jq -r '.errors[]?.message') log "错误:获取记录ID失败 - $ERRORS" exit 1 fi RECORD_ID=$(echo "$RESPONSE" | jq -r '.result[0].id') if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" = "null" ]; then log "错误:未找到记录 $RECORD_NAME,请先在Cloudflare创建此AAAA记录" exit 1 fi log "找到记录ID: $RECORD_ID" # 更新DNS记录 UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$RECORD_ID" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ --data "{\"type\":\"AAAA\",\"name\":\"$RECORD_NAME\",\"content\":\"$IP\",\"ttl\":$TTL,\"proxied\":false}") UPDATE_SUCCESS=$(echo "$UPDATE_RESPONSE" | jq -r '.success') if [ "$UPDATE_SUCCESS" = "true" ]; then NEW_CONTENT=$(echo "$UPDATE_RESPONSE" | jq -r '.result.content') log "成功更新记录! $RECORD_NAME → $NEW_CONTENT" echo "$IP" > "$LAST_IP_FILE" # 保存新IP else ERRORS=$(echo "$UPDATE_RESPONSE" | jq -r '.errors[]?.message') log "错误:更新记录失败 - $ERRORS" exit 1 fi echo "=== $(date) Finished DDNS update ===" >> $LOGFILE

并添加权限

chmod +x /usr/local/bin/ddns-ipv6.sh
  1. 使用crontab定时任务自动更新
crontab -e

加入

*/5 * * * * /usr/local/bin/ddns-ipv6.sh >/var/log/ddns-ipv6.log 2>&1

这样每5分钟检测一次IPv6变化并更新DNS。