黑群晖(linux)ipv6使用腾讯DDNS动态解析(dnspod)的api脚本实现

因为最近发现家里的电信和移动都支持了ipv6,原来移动都没有分配ipv4公网地址,所以打起ipv6主意,所以有了这次的折腾记录。

试了网上诸多方法,都不太好用,最后试了这里的这个方法,是可行的,不过也发现几个问题。

1.获取到两条ipv6记录无法正确更新。

2.log文件无法写入。

3.二级域名没有定义

以下为原贴内容直接复制过来:

 

偶然发现ipv6是不封端口的,于是就想着使用ddns添加ipv6的动态域名解析,使用ipv6解析的好处是不用设置复杂繁琐的端口转发,而且可以通过不同的主机记录直接访问一级路由器下面的每一台设备。首先在dnspod里添加一条ipv6解析记录,并且拿到你的token id,token id由两部分组成

  1. ID:xxxxx
  2. Token:4caxxxxxxxxxxxxxxxd

复制代码

后面需要用的login_token的写法为

  1. id,token
  2. xxxxx,4caxxxxxxxxxxxxxxxxxd

复制代码

接下来获取domain id

  1. curl -k ‘https://dnsapi.cn/Domain.List’ -d ‘login_token=<token_id>&format=xml’

复制代码

一个域名对应一个domain_id,通过domain id获取该域名下的解析记录

  1. curl -k ‘https://dnsapi.cn/Record.List’ -d ‘login_token=<token_id>&format=xml&domain_id=<domain_id>’

复制代码

每一条解析记录会有一个record id
这样我们就有了 login_token , domain_id ,record_id
就可以通过curl命令来随时修改解析记录实现动态域名解析了

  1. curl -s  -X POST “https://dnsapi.cn/Record.Modify” -d “login_token=<token_id>&format=xml&domain_id=<domain_id>&record_id=<record_id>&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4&value=<ipaddress>&sub_domain=@”

复制代码

其中

  1. record_type=AAAA
  2. record_type=A
  3. 分别对应IPv6和IPv4

复制代码

ipv6地址可以通过ipconfig或者ifconfig获取
为每一台设备配置不同的sub_domain,就可以无需端口转发直接访问该设备。
最后将其加入定时任务就可以了。


将附件解压修改参数之后上传到root文件夹,赋予执行权限

  1. chmod 755 /root/dnsupdate
  2. chmod 755 /root/ip.log

复制代码

添加定时计划任务

  1. */3 * * * * /root/dnsupdate
  2. #每隔三分钟检测地址是否更新

复制代码

10.20 补图

经过上面的测试发现,配置文件中有一些问题

原配置文件:

token=”—,—–“
domain=”——“
record=”——“
#在引号内将你的参数填入
pv6=$(ip addr show eth0 | grep inet6 | sed ‘s/\/.*//g’ | awk ‘{print $2}’ | grep 2408)
# eth0 根据情况替换为你自己的网口
#2408替换为你的外网ipv6地址的第一段,用来从众多地址中筛选出对外地址
oldip=$( awk ‘ {printf $1}’ /root/ip.log | cut -d/ -f1)
# echo $pv6
if [ $IPtime != $oldip ] ;then
# 判断地址是否改变,如果地址未变则不调用api更新记录
{
echo $IPtime > /root/ip.log 2>&1 ;
curl -s -X POST “https://dnsapi.cn/Record.Modify” -d “login_token=$token&format=json&domain_id=$domain&record_id=$record&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4&value=${pv6}”
}
fi

 

pv6=$(ip addr show eth0 | grep inet6 | sed ‘s/\/.*//g’ | awk ‘{print $2}’ | grep 2408)

这句获取到的ip我的群辉会获取到两条,所以更新错误,我观察发现第一行的ipv6地址是正确的,所以让命令获取第一行。

所以这行命令是:

pv6=$(ip addr show eth0 | grep inet6 | sed ‘s/\/.*//g’ | awk ‘{print $2}’ | grep 2408 | awk ‘NR==1{print}’)

而且$IPtime这个参数并不存在所以直接用$pv6代替。最后加上二级域名前缀sub_domain

最后我的配置文件为:

token=”—-,—–”
domain=”—-”
record=”—-”
#在引号内将你的参数填入
pv6=$(ip addr show ovs_eth0 | grep inet6 | sed ‘s/\/.*//g’ | awk ‘{print $2}’ | grep 2409 | awk ‘NR==1{print}’)
# eth0 根据情况替换为你自己的网口
#2408替换为你的外网ipv6地址的第一段,用来从众多地址中筛选出对外地址
oldip=$( awk ‘ {printf $1}’ /root/ip.log | cut -d/ -f 1)
# echo $pv6
if [ $pv6 != $oldip ] ;then
# 判断地址是否改变,如果地址未变则不调用api更新记录
{
echo $pv6 > /root/ip.log 2>&1 ;
curl -s -X POST “https://dnsapi.cn/Record.Modify” -d “login_token=$token&format=json&domain_id=$domain&record_id=$record&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4&value=${pv6}&sub_domain=——
}
fi

至此结束。


0 条评论

发表评论