随着IPv6的大面积普及,我们普通用户也可以拥有“外网”IP了。有了外网IP,可以在任何支持IPv6的设备上访问我们的“服务”。现在有个问题,分配的IPv6地址不是固定的,可能过段时间就变了,如果能自动把整个地址更新到域名提供商处,即DDNS。我们就可以自由访问我们的服务了。
我的域名是在腾讯云处注册的,其它类似操作。
我从外部找到并修改的脚本,xxxx自动替换成自己的配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #!/bin/ash domain='xxxx' subDomain='xxxx' recordId='xxxx' sId='xxxx' sKey='xxxx' # # Get record list first, then find out record id whatever you want to update # function get_record_list() { signatureMethod='HmacSHA1' timestamp=`date +%s` nonce=`head -200 /dev/urandom | gnu-cksum | cut -f2 -d" "` region=bj url="https://cns.api.qcloud.com/v2/index.php" action='RecordList' src=`printf "GETcns.api.qcloud.com/v2/index.php?Action=%s&Nonce=%s&Region=%s&SecretId=%s&SignatureMethod=%s&Timestamp=%s&domain=%s" $action $nonce $region $sId $signatureMethod $timestamp $domain` signature=`echo -n $src|openssl dgst -sha1 -hmac $sKey -binary |base64` params=`printf "Action=%s&domain=%s&Nonce=%s&Region=%s&SecretId=%s&Signature=%s&SignatureMethod=%s&Timestamp=%s" $action $domain $nonce $region $sId "$signature" $signatureMethod $timestamp ` curl -G -s -d "$params" --data-urlencode "Signature=$signature" "$url" } # # $1 ipv6 # You provide a new ipv6 address to update your subDomain record # function modify_record() { signatureMethod='HmacSHA1' timestamp=`date +%s` nonce=`head -200 /dev/urandom | cksum | cut -f2 -d" "` region=bj url="https://cns.api.qcloud.com/v2/index.php" #设置新ipv6 action='RecordModify' recordType='AAAA' recordLine='默认' value=$1 timestamp=`date +%s` nonce=`head -200 /dev/urandom | cksum | cut -f2 -d" "` src=`printf "GETcns.api.qcloud.com/v2/index.php?Action=%s&Nonce=%s&Region=%s&SecretId=%s&SignatureMethod=%s&Timestamp=%s&domain=%s&recordId=%s&recordLine=%s&recordType=%s&subDomain=%s&value=%s" $action $nonce $region $sId $signatureMethod $timestamp $domain $recordId $recordLine $recordType $subDomain $value` signature=`echo -n $src|openssl dgst -sha1 -hmac $sKey -binary |base64` params=`printf "Action=%s&Nonce=%s&Region=%s&SecretId=%s&SignatureMethod=%s&Timestamp=%s&domain=%s&recordId=%s&recordLine=%s&recordType=%s&subDomain=%s&value=%s" $action $nonce $region $sId $signatureMethod $timestamp $domain $recordId $recordLine $recordType $subDomain $value` result=`curl -G -s -d "$params" --data-urlencode "Signature=$signature" "$url"` echo $result } # # # we only get the first ipv6 address that owned by interface # get_ipv6() { ret=`ip a | grep 2409 | tail -n1 | awk '{print $2}' | awk -F'/' '{print $1}'` echo $ret } # # Main Entry # ipv6=$(get_ipv6) echo "Assign $ipv6 to xxxx" modify_record "$ipv6"
获取IPv6的函数需要自己根据情况修改。
给openwrt添加cron任务,让脚本每隔5分钟自动执行,实现DDNS功能。
1 2 root@OpenWrt:~# crontab -l */5 * * * * /root/ddns.sh