您的位置:

OpenWrt阿里云DDNS详细指南

一、安装依赖

在执行脚本之前,需要确保你的OpenWrt设备已安装了curl和jq两个软件包。

运行以下命令,安装缺失的软件包:

opkg update
opkg install curl
opkg install jq

二、阿里云获取Access Key

在运行脚本时需要使用阿里云的Access Key,获取方法如下:

  1. 登录阿里云控制台,在AccessKey管理页面创建一个AccessKey。
  2. 记录AccessKey ID和Access Key Secret,后续需要在脚本中使用。

三、创建OpenWrt阿里云DDNS脚本

在OpenWrt设备上,创建一个名为aliyun-ddns.sh的文件,并在文件中粘贴以下脚本:

#!/bin/sh

ACCESS_KEY_ID="YourAccessKeyId" #阿里云Access Key ID
ACCESS_KEY_SECRET="YourAccessKeySecret" #阿里云Access Key Secret
DOMAIN_NAME="YourDomainName" #域名名称,例如"example.com"
SUB_DOMAIN="YourSubDomain" #子域名名称,例如"www"
RECORD_TYPE="A" #记录类型,例如"A"、"CNAME"等
RECORD_LINE="default" #记录行,例如"default"
TTL="600" #TTL,例如"600",单位为秒

#获取当前的IP地址
IP=`curl -s https://api.ipify.org`

#获取解析记录ID
RECORD_ID=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=DescribeDomainRecords&DomainName=$DOMAIN_NAME&Format=json&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=DescribeDomainRecords&DomainName=$DOMAIN_NAME&Format=json&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"`

#解析记录不存在,添加一条解析记录
if [ `echo $RECORD_ID | jq '.TotalCount'` -eq 0 ]
then
    RESPONSE=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=AddDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=AddDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"`
else #解析记录已存在,更新解析记录的IP地址
    RECORD=`echo $RECORD_ID | jq ".DomainRecords.Record | map(select(.RR == \"$SUB_DOMAIN\" and .Type == \"$RECORD_TYPE\"))[0]"`
    RECORD_ID=`echo $RECORD | jq -r '.RecordId'`
    RECORD_IP=`echo $RECORD | jq -r '.Value'`
    if [ "$RECORD_IP" != "$IP" ]
    then
        RESPONSE=`curl -s -X POST https://alidns.aliyuncs.com/ -d "AccessKeyId=$ACCESS_KEY_ID&Action=UpdateDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RecordId=$RECORD_ID&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09&Signature=$(/usr/bin/printf $(/bin/echo -n "POST&`/usr/bin/printf "/&/" | /usr/bin/xxd -c 256 -ps`&`/usr/bin/printf "AccessKeyId=$ACCESS_KEY_ID&Action=UpdateDomainRecord&DomainName=$DOMAIN_NAME&Format=json&RecordId=$RECORD_ID&RR=$SUB_DOMAIN&SignatureMethod=HMAC-SHA1&SignatureNonce=$RANDOM&SignatureVersion=1.0&Timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`&Type=$RECORD_TYPE&Value=$IP&Line=$RECORD_LINE&TTL=$TTL&Version=2015-01-09" | /usr/bin/iconv -f utf8 -t iso88591 | /usr/bin/openssl dgst -sha1 -binary -hmac "$ACCESS_KEY_SECRET&" | /usr/bin/base64))"`
    fi
fi

四、设置定时任务

将刚才创建的脚本设置为定时任务,每隔一段时间执行一次,更新解析记录的IP地址。

在OpenWrt设备上,执行以下命令打开定时任务编辑器:

crontab -e

在编辑器中添加以下一行,设置定时任务每隔10分钟执行一次:

*/10 * * * * /bin/sh /root/aliyun-ddns.sh

五、运行脚本

在命令行中运行以下命令,手动测试脚本是否正常:

/bin/sh /root/aliyun-ddns.sh

六、总结

通过本文的指南,我们成功地创建了一个OpenWrt阿里云DDNS脚本,并将其设置为定时任务,实现了自动更新解析记录的IP地址。