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" 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" } # 尝试多种方法获取可靠的公网IPv6 get_ipv6() { # 方法1: 使用系统命令(推荐获取主要地址) local ip_system=$(ip -6 addr show dev $NET_INTERFACE scope global | grep -E 'global (dynamic|mngtmpaddr)' | awk '/inet6/{print $2}' | cut -d'/' -f1 | head -1) # 方法2: 使用公共API(备用) local ip_api=$(curl -6 --connect-timeout 5 -s https://api64.ipify.org || curl -6 --connect-timeout 5 -s https://ipv6.icanhazip.com) # 优先使用系统检测的IP,其次使用API检测的 [ -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" # 获取记录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" 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 > /dev/null 2>&1

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