我家的电信宽带升级成了千兆ipv6,用了路由器后,家里的好几台电脑和手机都分配到了以240e开头的公网ipv6。我觉得要把ipv6充分利用起来,所以想起了远程控制家里的电脑,想自己打造智慧家庭,所以把一台用蜗牛星际改装的黑群晖设置成外网能够访问,所以参考了大神们的代码后,自己写出了阿里云域名ipv6自动解析的linux代码,在文章后面,我要写出参考的文章及我遇到的坑,以供参考。(此代码可以运用于linux任何家庭电脑或家庭虚拟机的动态域名解析,以后有机会写个windows下的)
1.注册阿里云账号。
2.注册一个域名。
如果域名不在阿里云解析托管,需要先转过去,具体方法是联系域名提供商修改域名的DNS服务器,修改方式参考这里:
参考:https://help.aliyun.com/knowledge_detail/39844.html
然后去控制台找到云解析,将域名添加进去;
3.到阿里云控制中心找到access key和secret并保存下来(强烈建议遵循阿里云安全最佳实践的说明 ,使用RAM子用户的AccessKey);
参考:https://help.aliyun.com/document_detail/28647.html
4.到群晖控制中心找到任务计划新增一个计划。
新增->计划的任务->用户自定义脚本
设置10分钟定时
复制以下内容,根据自己的情况修改中文部分并添加到任务设置自定义脚本
#!/bin/sh
aliddns_name=”你的域名前缀”
aliddns_domain=”你的域名”
aliddns_ak=”你的AccessKeyId”
aliddns_sk=”你的AccessKeySecret”
# 获取本地ipv6并与以前保存的ipv6比较
# 获取本地ipv6,我这边有三个ipv6,一个是240e开头的互联网能互相访问的,
# 一个是240e开头的临时网址,但互联网不能访问,却能访问互联网。
# 一个是fe80开头的本地ipv6,应该舍弃
# 得筛选出那个互联网能够互访的ipv6
ip=$(/sbin/ifconfig eth0 | grep 'inet6 addr' | sed 's/^.*addr://g' )
# 获取本地保存的已经解析过的ipv6
oldip=$(cat /root/ip.txt 2>&1)
echo $oldip
if [ -n "$oldip" ]
then
result=$(echo $ip | grep "$oldip")
if [ -n "$result" ]
then
echo 跟以前保存的一样,没必要解析,退出。
exit 0
fi
fi
# 在ip.sb网站上查到一个本地ipv6,我发现,都是临时ipv6
# 不知道再有什么选择能互访的ipv6的办法?
localip=$(curl -6 ip.sb)
# 将本机三个ipv6保存进数组
OLD_IFS="$IFS"
IFS="/"
array=($ip)
IFS=$OLD_IFS
# 取掉临时的和fe80开头的ipv6,留下能互访问的ipv6
for var in ${array[@]}
do
result=$(echo $var | grep "fe80")
echo var是$var
if [[ "$result" != "" ]]
then
echo 是内网ipv6退出
continue
fi
if [[ $var = $localip ]]
then
echo 是不能互访的ipv6返回
continue
fi
length=${#var}
ipv6num=16
if [[ $length -gt $ipv6num ]];
then
echo 是可以互访的ipv6,退出选择
ip=$var
break
else
echo 长度太小
continue
fi
done
ip=`echo $ip`
echo $ip ###正确ip
echo "数组元素个数为: ${#array[*]}"
echo $ip >/root/ip.txt ##把ip替换到文件中
# 安装阿里云cli
cg=$(aliyun version 2>&1)
cg=${cg:0:1}
if ! [[ "$cg" -gt 0 ]] 2>/dev/null
then
# 下载阿里cli
wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
# 解压
tar xzvf aliyun-cli-linux-latest-amd64.tgz
# 复制到系统文件夹
cp aliyun /usr/local/bin
# cli初始化设置
aliyun configure set \
--profile akProfile \
--mode AK \
--region cn-hangzhou \
--access-key-id $aliddns_ak \
--access-key-secret $aliddns_sk
fi
# 得到解析id
get_recordid() {
grep -Eo '"RecordId": "[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
# 向阿里云域名cli获取解析id
query_recordid() {
aliddns_record_id=`aliyun alidns DescribeDomainRecords --DomainName $aliddns_domain --RRKeyWord $aliddns_name --Type AAAA`
echo -n $aliddns_record_id
}
# 修改解析
update_record() {
aliyun alidns UpdateDomainRecord --RR $aliddns_name --RecordId $1 --Type AAAA --Value $ip
}
# 添加解析
add_record() {
aliyun alidns AddDomainRecord --DomainName $aliddns_domain --RR $aliddns_name --Type AAAA --Value $ip
}
if [ "$aliddns_record_id" = "" ]
then
aliddns_record_id=`query_recordid | get_recordid`
echo $aliddns_record_id
fi
if [ "$aliddns_record_id" = "" ]
then
aliddns_record_id=`add_record | get_recordid`
echo "added record $aliddns_record_id"
else
update_record $aliddns_record_id
echo "updated record $aliddns_record_id"
fi
参考的文章:https://blog.csdn.net/weixin_43858126/article/details/86529782
遇到的坑:
1、这个代码是ipv4下的代码,我在改造的时候,里面的阿里云签名代码一直出错,所以我就下载了阿里云cli,用阿里云cli来解析域名,代码量变少了,设置也成功了。
2、原来代码中的get_recordid()少打了一个空格,得不到recordid,我改过来了。
3、在阿里云设置获取access key和secret时,我把RAM子用户的权限没有设置,设置后就成功了。
阿里云cli参考:https://help.aliyun.com/product/29991.html
阿里云解析参考:https://help.aliyun.com/product/29697.html
我的联系方式:QQ:306805680 微信:shuizhongyue-_
我的黑群晖网址:http://nas.cpsj.pub:5000/ 为了节省电,没有经常开,且ipv4不能访问,只能用ipv6。