假设我们现在有域名<你的域名>,我们可以使用DNS提供商(以Cloudflare为例)的API定期更新IPv6。
登录https://dash.cloudflare.com,在Cloudflare中加入域,并将你的域名的DNS解析服务器(你购买域名的服务商)替换成Cloudflare的DNS服务器,在该域名的DNS管理后台添加记录:
类型 名称 IPv6地址 代理状态 TTL AAAA www <随便填一个> 仅DNS 2分钟
并在dash页面的该域名下的概述界面的右下角,获取您的API令牌,并在此处记住你的域名的区域ID(ZONE ID)。
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
crontab -e
加入
*/5 * * * * /usr/local/bin/ddns-ipv6/sh > /dev/null 2>&1
这样每5分钟检测一次IPv6变化并更新DNS。