返回列表 发布新帖

[巴法络] Buffalo Nas启用阿里云DDNS实现动态域名解析

4269 2
发表于 2021-1-15 13:46:54 | 查看全部 阅读模式

来吧兄弟,一起玩一起讨论!

您需要 登录 才可以下载或查看,没有账号?注册

×
阿里云上RAM子账号的配置是通用的,可以参考群晖等一系列教程。
由于buffalo的机器都比较老了,受机能限制,获取公网IP地址可能为空值,导致陷入无限空值的死循环。随提供如下脚本供各位使用。相比网上的各种shell脚本,添加了IP检查功能。
需要替换阿里云AK/SK,以及域名地址等内容。
  1. #!/bin/bash
  2. echo "[$(date "+%G/%m/%d %H:%M:%S")] AliDDNS.sh start..."

  3. function  Check_IP() {
  4.      IP=$1
  5.      VALID_CHECK=$( echo  $IP| awk  -F.  '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}' )
  6.      if  echo  $IP| grep  -E  "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" > /dev/null ;  then
  7.          if  [ ${VALID_CHECK:-no} ==  "yes"  ];  then
  8.              echo  "[$(date "+%G/%m/%d %H:%M:%S")] IP $IP available."
  9.              CheckResult="Pass"
  10.          else
  11.              echo  "[$(date "+%G/%m/%d %H:%M:%S")] IP $IP not available!"
  12.              CheckResult="Reject"
  13.          fi
  14.      else
  15.          echo  "[$(date "+%G/%m/%d %H:%M:%S")] IP format error!"
  16.          CheckResult="Reject"
  17.      fi
  18. }

  19. while true
  20. do

  21. # 设置需要DDNS的地址,格式为 AliDDNS_SubDomainName.AliDDNS_DomainName ,
  22. # 例如 AliDDNS_DomainName 为 example.com, AliDDNS_SubDomainName 为 ddns ,
  23. # 连接起来就是 ddns.example.com
  24. #
  25. # 设置需要DDNS的域名 <DomainName>
  26. AliDDNS_DomainName="abc.cn"
  27. # 设置需要DDNS的子域名 <SubDomainName>
  28. AliDDNS_SubDomainName="abc"

  29. # 设置域名记录的TTL (生存周期)
  30. # 免费版产品最低为600(10分钟)~86400(1天), 付费版(企业版)包括以上范围, 还可以按照购买产品配置设置为:
  31. # 600(10分钟)、120(2分钟)、60(1分钟)、10(10秒)、5(5秒)、1(1秒),
  32. # 请按照自己的产品配置和DDNS解析速度需求妥善配置TTL值, 免费版设置低于600的TTL将会报错。
  33. AliDDNS_TTL="600"

  34. # 设置阿里云的AccessKeyId/AccessKeySecret,

  35. # 设置阿里云的Access Key
  36. AliDDNS_AK="LTAI4GD3zJDMZYMtVFYS"
  37. # 设置阿里云的Secret Key
  38. AliDDNS_SK="8p2D9fA1fxKYnVuhmdoMy8YFL"

  39. # 设置获取本机IP需要执行的命令 (用于nslookup命令获取DDNS域名的当前IP)
  40. AliDDNS_LocalIP="curl -s whatismyip.akamai.com"
  41. # 设置解析使用的DNS服务器 (推荐使用 223.5.5.5/223.6.6.6 , 毕竟都是阿里家的东西)
  42. AliDDNS_DomainServerIP="223.5.5.5"

  43. # 获取本机公网IP
  44. AliDDNS_LocalIP=`$AliDDNS_LocalIP 2>&1` || die "$AliDDNS_LocalIP"
  45. # 获取DDNS域名当前解析记录IP
  46. AliDDNS_DomainIP=`nslookup $AliDDNS_SubDomainName.$AliDDNS_DomainName $AliDDNS_DomainServerIP 2>&1`

  47. # 判断上一条命令的执行是否成功
  48. if [ "$?" -eq "0" ]
  49. then
  50.     AliDDNS_DomainIP=`echo "$AliDDNS_DomainIP" | grep 'Address:' | tail -n1 | awk '{print $NF}'`
  51. # 检查本机IP是否合规,如果合规则将本机IP与域名获取IP进行对比   
  52.     Check_IP $AliDDNS_LocalIP
  53.     if [ "$CheckResult" = "Pass" ]
  54.     then
  55.         if [ "$AliDDNS_LocalIP" = "$AliDDNS_DomainIP" ]
  56.         then
  57.             echo "[$(date "+%G/%m/%d %H:%M:%S")] Local IP ($AliDDNS_LocalIP) is the same with Domain IP ($AliDDNS_DomainIP)"
  58.             echo "[$(date "+%G/%m/%d %H:%M:%S")] No change modified ..., AliDDNS.sh will take 5 minute break."
  59.             sleep 300
  60.             continue
  61.         fi
  62.     fi
  63.          
  64. fi

  65. # 如果IP发生变动,开始进行修改
  66. # 生成时间戳
  67. timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`
  68. # URL加密函数
  69. urlencode() {
  70.     # urlencode <string>
  71.     out=""
  72.     while read -n1 c
  73.     do
  74.         case $c in
  75.             [a-zA-Z0-9._-]) out="$out$c" ;;
  76.             *) out="$out`printf '%%%02X' "'$c"`" ;;
  77.         esac
  78.     done
  79.     echo -n $out
  80. }
  81. # URL加密命令
  82. enc() {
  83.     echo -n "$1" | urlencode
  84. }
  85. # 发送请求函数
  86. send_request() {
  87.     local args="AccessKeyId=$AliDDNS_AK&Action=$1&Format=json&$2&Version=2015-01-09"
  88.     local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$AliDDNS_SK&" -binary | openssl base64)
  89.     /opt/bin/curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
  90. }
  91. # 获取记录值 (RecordID)
  92. get_recordid() {
  93.     grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
  94. }
  95. # 请求记录值 (RecordID)
  96. query_recordid() {
  97.     send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$AliDDNS_SubDomainName.$AliDDNS_DomainName&Timestamp=$timestamp"
  98. }
  99. # 更新记录值 (RecordID)
  100. update_record() {
  101.     send_request "UpdateDomainRecord" "RR=$AliDDNS_SubDomainName&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$AliDDNS_TTL&Timestamp=$timestamp&Type=A&Value=$AliDDNS_LocalIP"
  102. }
  103. # 添加记录值 (RecordID)
  104. add_record() {
  105.     send_request "AddDomainRecord&DomainName=$AliDDNS_DomainName" "RR=$AliDDNS_SubDomainName&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$AliDDNS_TTL&Timestamp=$timestamp&Type=A&Value=$AliDDNS_LocalIP"
  106. }

  107. # 判断RecordIP是否为空
  108. if [ "$AliDDNS_RecordID" = "" ]
  109. then
  110.     AliDDNS_RecordID=`query_recordid | get_recordid`
  111. fi
  112. if [ "$AliDDNS_RecordID" = "" ]
  113. then
  114.     AliDDNS_RecordID=`add_record | get_recordid`
  115.     echo -e "[$(date "+%G/%m/%d %H:%M:%S")] Added RecordID : $AliDDNS_RecordID \n"
  116. else
  117.     update_record $AliDDNS_RecordID
  118.     echo -e "[$(date "+%G/%m/%d %H:%M:%S")] Updated RecordID : $AliDDNS_RecordID \n"
  119. fi

  120. # 输出最终结果
  121. if [ "$AliDDNS_RecordID" = "" ]; then
  122.     # 输出失败结果 (因为没有获取到RecordID)
  123.     echo "[$(date "+%G/%m/%d %H:%M:%S")] DDNS Update Failed !"
  124. else
  125.     # 输出成功结果
  126.     echo "[$(date "+%G/%m/%d %H:%M:%S")] DDNS Update Success, New IP is : $AliDDNS_LocalIP"
  127. fi

  128. sleep 30
  129. done
复制代码


评论2

long_szLv.4 发表于 2021-1-16 23:58:19 | 查看全部
虽然用不上,还是点赞楼主
回复 点赞

使用道具 举报

jethrosoLv.3 发表于 2021-2-12 19:26:08 | 查看全部
不错不错,顶一个!
回复 点赞

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

淘宝小店

邀请码

VIP会员

微信客服

公众号

微信群

投诉/建议联系

support@gebi1.cn

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 隔壁网 版权所有 All Rights Reserved. 粤ICP备14056481号-1
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表