最近应朋友的需求,研究一个华为云的DDNS解决方式,并且支持OpenWRT和一些主流Linux发行版本。

本教程来源于Github大佬开发的脚本,传送门

并且感谢另外一位大佬修改脚本,使其支持Openwrt网卡获取IP:传送门

此脚本支持IPV4与IPV6双栈,但是需要对脚本做出一些改动,下文会提到。

准备工作

首先将域名解析到华为云上,这里不再赘述。

添加需要ddns的A记录或者AAAA记录。建议将TTL改小。

配置单IPV4或者单IPV6

首先点击链接下载脚本文件(IPV4IPV6),请下载对应的脚本。

  • 首先在脚本开头,修改个人配置
1
2
3
4
5
6
7
8
9
10
11
#用户名
username=""
#账户名
accountname=""
#密码
password=""

#域名
domain="example.com"
#主机名
host="www"

username与accountname都填你登陆的用户名,password填入密码

domain填入你的顶级域名,hosts填入二级域名,如果想直接用顶级域名,将hosts改成#

  • 填写IP获取方式
1
2
3
4
5
6
#从外网api获取ip地址(开启1/关闭0 默认开启)
REMOTE_RESOLVE=0

#从网卡获取ip地址(填写网卡名 如eth0 ens3 he-ipv6)
#并请根据实际情况填写sed行数(第96 98行处)
INTERFACE=""

如果需要从网卡获取,将Interface改成对应的WAN口网卡。

如果要从外网API获取,请将REMOTE_RESOLVE改成1

  • 上传到LINUX,给予权限,运行脚本
  • 如果返回没有报错,添加到Crontab中间进行定时获取。

配置双栈

据脚本作者所说:

1
2
本项目存在已知的BUG,由于华为云API采用模糊搜索策略,recordset可能存在多个返回值,这会导致解析记录无法正常更新。
经确认,为华为云方面更能迭代,目前只支持recordset的模糊搜索,请谨慎使用本脚本!

并且按照未修改的脚本,AAAA记录会和A记录产生冲突,无法更新某一条记录。

由此我们这里需要对脚本进行手动配置

首先将A记录与AAAA记录同时添加完成。

IPV6脚本从上面的链接下载以后按照原来的脚本配置好,不需要改动,我们主要改动IPV4脚本。(改动哪个脚本都行,哪个脚本报错改哪个。)

首先,我们进入华为云DNS界面,并且对一个记录点击修改

在这里不要动任何东西。

在Chrome浏览器中,按F12,切换到Network选项卡,清除所有记录

此时在华为dns界面点击确定,此时右边会出现一些返回数据。

在控制台中按CTRL + F,搜索recordset,找到如下图所示的值,打开response选项卡,复制所有数据到一个记事本中,方便分析。

仔细阅读记事本,首先找到你需要修改的记录。

找到Zone_ID和Recordset_ID,每一条记录都会如下图所示

记住Recordset_ID和Zone_ID,打开脚本

在最后

1
2
3
4
5
6
curl -X PUT -L -k -s \
"https://$dns/v2/zones/$ZONE_ID/recordsets/$RECORDSET_ID" \
-H "Content-Type: application/json" \
-H "X-Auth-Token: $token" \
-d "{\"records\": [\"$TARGET_IP\"],\"ttl\": 1}"
logger -t "【更新dns地址解析】" "完成"

中间的$RECORDSET_ID$Zone_ID替换成记事本中对应的值

修改完成后上传Linux进行测试。