ARM技术论坛
直播中

dutong0321

3年用户 659经验值
擅长:模拟技术 嵌入式技术 接口/总线/驱动 光电显示 控制/MCU RF/无线
私信 关注

【悟空派H3开发板免费体验】04.在悟空派上使用ALIDDNS进行外网访问

之前的文章里面讲了一些在悟空派上的一些使用,但是无疑这些操作只能做到局域网进行访问,但是在日常生活中,超出局域网的限制,我们依旧想访问悟空派的服务就需要想一些办法了。

办法一共有三种,分别是:内网穿透,公网IPv4,以及现在广为普及的IPv6。

先说内网穿透,其实这个方案相对来讲适用性更广,直接花钱购买就可以了,但是带宽稍大花销也就越大,所以并不推荐。

接下来就是我着重要讲的IPv4和IPv6的方法,先说IPv4,需要和带宽的运营商进行沟通,看看是否可以给IPv4的公网IP地址,一般来讲联通是没问题,移动没有,电信不知道,第二种方案是采用IPv6地址,IPv6目前已经普及了,所以使用起来还是很方便的,但是也不排除刚好使用的设备没有IPv6地址,这个没有办法保证。对于IPv4来讲,可以使用一些老牌的DDNS服务商,然后直接使用CURL的方式即可更新DDNS,但是一般是只支持IPv4的地址,不可以更新IPv6的地址,而且有时候更新会出现一些问题,所以我更加推荐在阿里云上购买一个域名,开销非常小,TECH域名我买的时候一年才19,然后通过脚本去更新DDNS,官方已经给出SDK,我在往上找了大佬开源的脚本,并进行了升级,我忘了大佬的源地址了,我先把我的也开源出来。

#!/bin/bash

echo "######Aliyun DDNS Start `date '+%Y-%m-%d %H:%M:%S'`######" >> /opt/ddns/aliyun.log

ali_id=""#这个地方写自己的ID
ali_key=""#这个地方写自己的KEY
ali_name1=''#这个地方写自己的主机记录
ali_domain=''#这个地方写自己的域名
ali_ttl="600"
dns_server="120.76.107.43"#这个地方可以不用改,也可以写自己域名的DNS

if [ "$ali_name1" = "@" ]
then
ali_name=$ali_domain
else
ali_name=$ali_name1.$ali_domain
fi

now=`date`

ipv4=`curl -s 4.ipw.cn`

current_ipv4=`nslookup -q=A $ali_name $dns_server | grep 'Address: ' | tail -n1 | awk '{print $NF}'`

timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`

urlencode() {
# urlencode <string>
out=""
while read -n1 c
do
case $c in
[a-zA-Z0-9._-]) out="$out$c" ;;
*) out="$out`printf '%%%02X' "'$c"`" ;;
esac
done
echo -n $out
}
enc() {
echo -n "$1" | urlencode
}
send_request() {
local args="AccessKeyId=$ali_id&Action=$1&Format=json&$2&Version=2015-01-09"
local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$ali_key&" -binary | openssl base64)
curl -s "https://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
}
get_recordid() {
grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
query_recordid() {
send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$ali_name&Timestamp=$timestamp&Type=A"
}
update_record() {
send_request "UpdateDomainRecord" "RR=$ali_name1&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$ali_ttl&Timestamp=$timestamp&Type=A&Value=$(enc $ipv4)"
}
add_record() {
send_request "AddDomainRecord&DomainName=$ali_domain" "RR=$ali_name1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$ali_ttl&Timestamp=$timestamp&Type=A&Value=$(enc $ipv4)"
}
###############################################
echo "当前记录: $current_ipv4 >>> $ali_name" >> /opt/ddns/aliyun.log
if [[ $ipv4 != "" ]]; then
if [[ $ipv4 != $current_ipv4 ]]; then
if [[ "$current_ipv4" = "" ]] ;then
ali_record_id=`add_record | get_recordid`
echo "添加新记录: ${ipv4} >>> $ali_name" >> /opt/ddns/aliyun.log
else
ali_record_id=`query_recordid|get_recordid`
update_record $ali_record_id >/dev/null
echo "更新记录: ${ipv4} >>> $ali_name " >> /opt/ddns/aliyun.log
fi
else
echo "无需更新: $current_ipv4 >>> $ali_name" >> /opt/ddns/aliyun.log
fi
else
        echo "未取得IPV4" >> /opt/ddns/aliyun.log
fi

echo "#################Aliyun DDNS End#################" >> /opt/ddns/aliyun.log

我的这个是IPv4的更新脚本,IPv6和IPv4基本一样,主要修改几个地方,一个是curl -s 6.ipw.cn,另外一个就是nslookup -q=AAAA,最后还有几个Type=AAAA,如果可以看明白就可以自己动手修改,下次有空我把IPv4和IPv6的结合版也PO出来。

最后,我们还要把他放在定时任务里,进行自动检测,我一般设计的是每小时更新一次,就不必再管了。
1002.png

首先,我们要输入sudo crontab -e 来编辑定时任务,使用的时候一般让选择编辑器,第一种nano和第二种vim都可以,看自己平常使用什么就用什么就可以。
1001.png

在这个地方设置的时候要注意一些,其中M代表分,H代表小时,后面的分别代表啥,上面其实都有解释,很简单的英文,分别是天、月以及周几,其实并不怎么用到,然后如果不考虑的话,就要写*号,就像我设置的就是每个点的40分执行一次,也就是每小时执行一次,例如10:40,11:40,依次类推,如果你写的是10 * 1 * *,就是每个月1号的每小时10分执行一次,例如1月1号的1:10,1月1号的2:10,2月1号的1:10,以此类推。
1003.png

设置好以后,我们使用sudo crontab -l查询一下,确定没问题后,然后重启cron。
1006.png

接下来我们要做的就是等待,等到过任意一个小时的40分后,就可以查看一下更新记录啦。
1004.png

我们尝试ping一下,看看是否可以ping通。
image.png

然后就没问题啦。

output

更多回帖

发帖
×
20
完善资料,
赚取积分