找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 2024|回复: 1

ipv6,ddns,阿里云,下级设备配置

[复制链接]
发表于 2019-10-2 11:06 | 显示全部楼层 |阅读模式
我这里的网络自带ipv6-pd,组了台nas想外网直接域名访问。自己折腾了好久,看了一堆帖子,最后把两个代码结合了下,总算搞定了。脚本代码如下。
  1. #!/bin/sh
  2. #前置函数
  3. urlencode1() {
  4. local length="${#1}"
  5. i=0
  6. out=""
  7. for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
  8. do
  9. local c="${1:$i:1}"
  10. case $c in
  11. [a-zA-Z0-9.~'&'=_-]) out="$out$c" ;;
  12. *) out="$out`printf '%%%02X' "'$c"`" ;;
  13. esac
  14. i=$(($i + 1))
  15. done
  16. echo -n $out
  17. }
  18. urlencode2() {
  19. local length="${#1}"
  20. i=0
  21. out=""
  22. for i in $(awk "BEGIN { for ( i=0; i<$length; i++ ) { print i; } }")
  23. do
  24. local c="${1:$i:1}"
  25. case $c in
  26. [a-zA-Z0-9.~_-]) out="$out$c" ;;
  27. *) out="$out`printf '%%%02X' "'$c"`" ;;
  28. esac
  29. i=$(($i + 1))
  30. done
  31. echo -n $out
  32. }
  33. send_request() {
  34. args="AccessKeyId=$ak&Action=$1&Format=json&$2&Version=2015-01-09"
  35. StringToSign1="$(urlencode1 $args)"
  36. StringToSign2="GET&%2F&$(urlencode2 $StringToSign1)"
  37. hash=$(urlencode2 $(echo -n "$StringToSign2" | openssl dgst -sha1 -hmac $sk -binary | openssl base64))
  38. RESULT=$(curl -k -s "https://alidns.aliyuncs.com/?$args&Signature=$hash") ## 2> /dev/null)
  39. echo $RESULT
  40. }
  41. query_recordid() {
  42. if [ "$host" = "@" ]; then
  43. echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$domain&Timestamp=$timestamp"`
  44. else
  45. echo `send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$host.$domain&Timestamp=$timestamp"`
  46. fi
  47. }
  48. update_record() {
  49. echo `send_request "UpdateDomainRecord" "RR=$host&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=AAAA&Value=$ip"`
  50. }
  51. add_record() {
  52. echo `send_request "AddDomainRecord&DomainName=$domain" "RR=$host&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=AAAA&Value=$ip"`
  53. }

  54. ##配置信息
  55. ##主函数入口
  56. host="aa" #主机名
  57. domain="bb.cc" #你的域名
  58. timestamp=`date -u +"%Y-%m-%dT%H:%M:%SZ"`
  59. ak="ak" #你的阿里云app key
  60. sk="sk&" #“你的阿里云app secret&” 注意后面多个“&”
  61. DUID="DUID" #设备的DUID

  62. #读取本地数据库存储的信息,若有
  63. ipfilename=$(echo $(basename $0)) #获取自身文件名
  64. ipfilename=$(cd "$(dirname "$0")"; pwd)/${ipfilename%.*}
  65. if [ -f "$ipfilename"_ip ]
  66. then
  67. . "$ipfilename"_ip
  68. else
  69. record_id="" ;saved_ip="" ;saved_host="" ;saved_domain=""
  70. fi
  71. ip=""
  72. RETRY="0"
  73. while [ $RETRY -lt 5 ]; do #获取设备ipv6地址信息
  74. ip=$(cat /tmp/hosts/odhcpd |grep $DUID|cut -f9 -d' '|cut -f1 -d'/')
  75. RETRY=$((RETRY+1))
  76. if [ -z "$ip" ];then
  77. sleep 3
  78. else
  79. break
  80. fi
  81. done

  82. #获取DNS域名服务器对域名解析的ipv6地址<br>#此处由<a id="a_comment_author_3947953" href="http://home.cnblogs.com/u/1351825/" target="_blank">jethroso</a>指正,再次表示感谢
  83. if [ "$ip" = "$saved_ip" ];then
  84. if [ $host = "@" -o $host = "" ];then
  85. IPDNS=$(nslookup $domain dns16.hichina.com 2>/dev/null | sed -n 's/Address 1: \([0-f.]*\)/\1/p' | sed -n '2p' | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')
  86. else
  87. IPDNS=$(nslookup $host.$domain dns16.hichina.com 2>/dev/null | sed -n 's/Address 1: \([0-f.]*\)/\1/p' | sed -n '2p' | grep -oE '[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}\:[0-f]{0,4}')
  88. fi
  89. fi

  90. #检查比对本地数据库存储的ip
  91. #也可以与IPDNS进行比较,替换saved_ip为IPDNS即可
  92. if [ "$ip" = "$saved_ip" -a "$host" = "$saved_host" -a "$domain" = "$saved_domain" ];then
  93. echo "$(date +"%Y-%m-%d %H:%M:%S")--Host:[$host.$domain] Already updated."
  94. exit 0
  95. fi
  96. #查询解析记录信息
  97. RESULT=`query_recordid`
  98. record_id=$(echo $RESULT | grep -o "RR":"$host","Status":"[a-zA-Z]*","Value":"[0-f:]*","Weight":[0-9]*,"RecordId":"[0-9]*"" | grep -o "RecordId":"[0-9]*""|grep -o "[0-9]*")
  99. if [ "$record_id" = "" ]
  100. then
  101.    RESULT=`add_record`
  102.     record_id=$(echo $RESULT | grep -o "RecordId":"[0-9]*"" | grep -o "[0-9]*")
  103.      echo "$RESULT"
  104.      if [ "$record_id" != "" ];then
  105.     echo "$(date +"%Y-%m-%d %H:%M:%S") -- Added Host [$host.$domain] (IP: $ip)"
  106.     echo "record_id=$record_id; saved_ip=$ip ;saved_host=$host ;saved_domain=$domain" > "$ipfilename"_ip
  107.     else
  108.     echo "Not Find Such Host $host.$domain"
  109.     fi
  110. else
  111. #更新解析记录
  112. RESULT=`update_record $record_id`
  113. #record_id=$(echo $RESULT | grep -o "RecordId":"[0-9]*"" | grep -o "[0-9]*")
  114.         echo "$RESULT"
  115.         echo "$(date +"%Y-%m-%d %H:%M:%S") -- Update Host [$host.$domain] (IP: $ip)"
  116.         echo "record_id=$record_id; saved_ip=$ip ;saved_host=$host ;saved_domain=$domain" > "$ipfilename"_ip
  117. fi
复制代码
配置信息里几个改一下就行,之后怎么定时运行就是另一件事了。可以直接计划任务,也可以放到pppoe拨号时运行的那个文件夹里,拨号时运行。
也可以配合固件整合的ddns,直接修改IP来源为脚本,脚本里就写一句
  1. cat /tmp/hosts/odhcpd |grep $DUID|cut -f9 -d' '|cut -f1 -d'/'
复制代码
$DUID修改下。完事。
代码来源
https://github.com/Archeb/ADDNS/blob/master/addns.sh
https://www.cnblogs.com/jsp1256/p/7764632.html

只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2019-10-5 10:55 | 显示全部楼层
我也在搞这个。。刚刚解决ipv6访问外网。nas在内网用frp太慢了。你这个应该可以解决我的这个问题。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-9-30 12:23

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表