利⽤shell脚本,实现腾讯云DNSPod进⾏DDNS动态域名解析ipv6地址
快捷导航
开始
本代码为shell脚本,且已在Linux环境测试,理论上可以在各种Linux设备进⾏DDNS动态域名服务,如晖等NAS或Linux虚拟机。
代码已在晖和Ubuntu测试过。
在开始之前,⾸先你需要在腾讯云上购买域名或域名解析服务在腾讯云上。
如何购买域名?
在⽹页上,可以购买域名。
在购买完成后,可以进⼊腾讯云的,查看域名信息。
如何设置API(密钥)
在DNSPod即可设置API(密钥)。
步骤
⾸先进⼊;
然后点击头像,进⼊【我的账号】,或直接进⼊;
接下来点击左边【账号中⼼】的【密钥管理】,或直接进⼊;
在密钥管理中,点击【创建密钥】即可创建密钥(API)
在输⼊名称之后(名称随意),便可以⽣成密钥(API)
重点
在创建API时候,API的Token仅⼀次可见,如果忘记复制,需要重新申请。
在完成之后,你便获得了ID与Token,这样你就可以将这两个信息填⼊代码当中,即可利⽤代码⾃动更新IP。
⚠重点⚠
ID——即脚本中dnspod_ddnsipv6_id,将"API_KEY_ID"替换为ID值
Token——即脚本中的dnspod_ddnsipv6_token,将"API_KEY_TOKEN"替换为Token值
如何使⽤DDNS动态域名服务
为什么使⽤DDNS
家⽤宽带的IPV6地址动态分配,每次拨号设备重启或重新拨号,IP地址都会变换。
绝⼤多数家庭的IPV4地址为内⽹地址,⽆法使⽤IPV4地址访问服务器。
对于晖,⾃带的DNSPod的DDNS域名解析仅⽀持ipv4,实⽤性不⼤。
利⽤脚本更新DNS
更新情况
V1.02
修改了ipv6的提取规则,现在可以判定fe80开头的地址;
对于ipv6的提取错误,添加了中⽂的提⽰;
V1.01
添加了对于syntax error的错误解决⽅法;
V1.00
发布
这⾥使⽤的是shell脚本,在Linux(如NAS、Linux虚拟机),该命令都可以执⾏。
对于shell脚本,使⽤的命令包括curl、ip这些与⽹络相关的包,NAS与⼤部分虚拟机都⾃带,如没有⾃带,也可以⾃⾏安装。
代码复制到⽂件后,将⽂件名的后缀,如txt等,修改为sh,例如dnsUpdate.sh(当然,你也可以使⽤bash命令,⽽不修改后缀。)在复制完成后,将脚本中需要替换的名称替换掉,你可以使⽤bash命令执
⾏这个脚本,从⽽实现DNS的更新。
命令:bash ⽂件名称或bash ⽂件绝对路径,例如bash dnsUpdate.sh或bash /volume1/.../dnsUpdate.sh
你也可以不重名(这样执⾏需要添加bash):
⚠重点⚠
该代码在更新或添加DNS记录后,⾃动退出,如果需要实现DDNS,需要定时执⾏该代码。
关于定时执⾏该代码的时间,与设置的ttl时间有关,⼀般与ttl时间⼀致。
代码仅需将开头的7⾏(不包括第1⾏),替换为⾃⼰的需要的信息即可,后⾯可以保持不动。
# 填写⽰例
dnspod_ddnsipv6_id="123456"
dnspod_ddnsipv6_token="abcdefghijklmnopqrstuvwxyz123456"
dnspod_ddnsipv6_ttl="600"
dnspod_ddnsipv6_domain='test'
dnspod_ddnsipv6_subdomain='file'
local_net="eth0"
# 执⾏成功后,访问地址为st
下⾯放完整代码。
脚本代码
#!/usr/bin/bash
dnspod_ddnsipv6_id="API_KEY_ID"#【API_id】将引号内容修改为获取的API的ID
dnspod_ddnsipv6_token="API_KEY_TOKEN"#【API_token】将引号内容修改为获取的API的token
dnspod_ddnsipv6_ttl="600"# 【ttl时间】解析记录在 DNS 服务器缓存的⽣存时间,默认600(s/秒)
dnspod_ddnsipv6_domain='替换⾃⼰所购买的域名'#【已注册域名】引号⾥改成⾃⼰注册的域名
dnspod_ddnsipv6_subdomain='替换为想要的名字'#【⼆级域名】将引号内容修改为⾃⼰想要的名字,需要符合域名规范,附常⽤的规范
local_net="eth0"# 【⽹络适配器】默认为eth0,如果你的公⽹ipv6地址不在eth0上,需要修改为对应的⽹络适配器
# 常⽤的规范【⼆级域名】
# 【www】常见主机记录,将域名解析为 st
# 【@】直接解析主域名 test
# 【*】泛解析,匹配其他所有域名 *.test
# 举例
# 在腾讯云注册域名,登陆DNSPOD,在【我的账号】的【账号中⼼】中,有【密钥管理】
# 点击创建密钥即可创建⼀个API
# 如果你在腾讯云注册域名叫【test】
# 那么【dnspod_ddnsipv6_domain】后⾯就填【test】
# 然后根据常⽤的规范/⾃⼰想要的名字在【dnspod_ddnsipv6_subdomain】填⼊⾃⼰需要的名字
# 现假设为【file】,那么你的访问地址为【st】
if["$dnspod_ddnsipv6_record"="@"]
then
dnspod_ddnsipv6_name=$dnspod_ddnsipv6_domain
else
dnspod_ddnsipv6_name=$dnspod_ddnsipv6_subdomain.$dnspod_ddnsipv6_domain
fi
die (){
echo"Error: unable to find [public IPv6 address], please use the 'ip addr' command or query the network panel of the system to check the network card, and fill in the name of the network card with the IPv6 address in the 'local_net' position in the command file.">&2
echo"IP地址提取错误: 在指定的⽹络适配器上[$local_net]不到<;公⽹IPv6地址>(不是fe80开头),请使⽤'ip addr'命令或在系统的⽹络⾯板查询有公⽹IP 的⽹络适配器,然后在脚本的[local_net]中⽤填写⽹络适配器的名称。">&2
exit
}
ipv6_list=`ip addr show $local_net |grep"inet6.*global"|awk'{print $2}'|awk -F"/"'{print $1}'`|| die
for ipv6 in${ipv6_list[@]}
for ipv6 in${ipv6_list[@]}
do
if[["$ipv6"=~ ^fe80.* ]]
then
continue
else
echo select IP: $ipv6>&1
break
fi
done
if["$ipv6"==""]||[["$ipv6"=~ ^fe80.* ]]
then
die
fi
dns_server_info=`nslookup -query=AAAA $dnspod_ddnsipv6_name 2>&1`
dns_server_ipv6=`echo"$dns_server_info"|grep'address '|awk'{print $NF}'`
if["$dns_server_ipv6"=""]
then
dns_server_ipv6=`echo"$dns_server_info"|grep'Address: '|awk'{print $NF}'`
fi
怎么查自己的ipif["$?" -eq "0"]
then
echo"DNS server IP: $dns_server_ipv6">&1
if["$ipv6"="$dns_server_ipv6"]
then
echo"The address is the same as the DNS server.">&1
fi
unset dnspod_ddnsipv6_record_id
else
dnspod_ddnsipv6_record_id="1"
fi
send_request(){
local type="$1"
local data="login_token=$dnspod_ddnsipv6_id,$dnspod_ddnsipv6_token&domain=$dnspod_ddnsipv6
_domain&sub_domain=$dnspod_ddnsipv6_subdo main$2"
return_info=`curl -X POST "dnsapi/$type" -d "$data" 2> /dev/null`
}
query_recordid(){
send_request "Record.List"""
}
update_record(){
send_request "Record.Modify""&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6&record_id=$dnspod_ddnsipv6_record_id "
}
add_record(){
send_request "Record.Create""&record_type=AAAA&record_line=默认&ttl=$dnspod_ddnsipv6_ttl&value=$ipv6"
}
if["$dnspod_ddnsipv6_record_id"=""]
then
echo"seem exists, try update.">&1
query_recordid
code=`echo $return_info |awk -F \"code\":\" '{print $2}'|awk -F \",\"message\" '{print $1}'`
echo"return code $code">&1
if[ "$code" = "1" ]
then
dnspod_ddnsipv6_record_id=`echo $return_info |awk -F \"records\":.{\"id\":\" '{print $2}'|awk -F \",\"ttl\" '{print $1}'`
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论