【开发记录】ubuntu 2204脚本实现ddns功能(华为云)

/*************这里我只实现了ipv6的ddns功能,ipv4因无公网ip无法验证******************/
/*************原作者地址https://gitee.com/lvcs/huaweicloud_ddns******************/
一、基本思路
通过本机ifconfig命令或通过IP查询网站找到本机ip -> 脚本通过api接口直接对华为云的域名解析项做修改 -> 使用crontab命令对脚本进行周期执行。
二、功能实现
1、添加解析
先在DNS管理控制台https://console.huaweicloud.com/dns/内添加对应域名解析记录。
2、创建IAM账号
在华为云主账号下创建IAM账号(虽然脚本上说没必要,但是我在实际使用时认证失败,保险起见再创建一个为好)https://console.huaweicloud.com/iam/(右上角创建账号),初次设置后需要退出主账号,使用IAM账号登陆华为云,完毕后记住华为主账号、IAM账号和IAM密码。

3、查看IAM账号所在区域

4、获取id和zone_id
登入华为云的API管理https://apiexplorer.developer.huaweicloud.com/apiexplorer/ 选择所有产品>云解析服务>Record Set管理>ListRecordSets ,在name项中输入你的域名点击调试,在响应体中记录下id和zone_id

5、脚本获取与修改
现在我们有了华为云主账号、IAM账号密码、IAM的地址、id和zone_id,此时我们就可以将脚本中需要填写的地方依次填上。
首先安装脚本运行环境
apt-get updateapt-get install wget curl dnsutils net-tools cron -y
获取脚本:
wget -N --no-check-certificate https://raw.githubusercontent.com/lllvcs/huaweicloud_ddns/master/huaweicloud_ddns.sh
或者
wget -N --no-check-certificate https://cdn.jsdelivr.net/gh/lllvcs/huaweicloud_ddns@master/huaweicloud_ddns.sh
或者
wget -N --no-check-certificate https://gitee.com/lvcs/huaweicloud_ddns/raw/master/huaweicloud_ddns.sh
以上若获取不到后面会附上脚本代码
修改脚本权限
chmod +x ./huaweicloud_ddns.sh
修改脚本:
用编辑器打开脚本后
USERNAME为IAM账号
ACCOUNTNAME为华为云主账号
PASSWORD为IAM密码
ZONE_ID为获取的zone_id
RECORDSET_ID为获取的id
REMOTE_RESOLVE为是否从第三方网站获取ip,1为获取,其他数为不获取
INTERFACE为网卡名称,一般为执行ifconfig命令后的第一行左边顶头的几个字符
TARGET_IP为自动获取ip出错时输入固定IP
若需从第三方网站获取ip,则需要取消#GETIPURL的“#”
IAM地址,根据获取的地址,取消相应的“#”(默认北京一)
DNS地址,根据添加记录时的地址,取消相应的“#”(默认北京一)
TOKEN和TOKEN_X为认证相关,不用管
在TARGET_IP=$(ifconfig $INTERFACE | grep 'inet6 ' | grep -oE '所在行的最后,按需修改sed值(默认且一般为1),其含义为ifconfig命令后带inet6前缀的第一个ipv6地址所在行,第几行就是几p。
TARGET_IP=$(ifconfig | grep 'inet6 ' | grep -oE '所在行同上,按需修改sed值。

在curl命令下面,按格式输入相应的域名(name)、解析类型(type)、ttl值(ttl)

ps:脚本的标头根据系统不同而不同,可以用whereis命令查看,如:输入命令whereis sh,我的结果为sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz,故标头应该为#!/usr/bin/sh
以下为全部脚本代码
#!/usr/bin/sh
#. /etc/profile
# Copyright 2021 LVCS
# https://github.com/lllvcs/huaweicloud_ddns
# https://gitee.com/lvcs/huaweicloud_ddns
# 在运行此脚本之前,请先在华为云DNS管理控制台内添加对应域名的A记录
# 并获取对应的 ZONE_ID 和 RECORDSET_ID
# 一般来说用户名和账户名相同
USERNAME=""
ACCOUNTNAME=""
PASSWORD=""
# 对应解析记录的 ZONE_ID 和 RECORDSET_ID
ZONE_ID=""
RECORDSET_ID=""
# 从外网API获取ip地址(默认开启1)
REMOTE_RESOLVE=1
# 从网卡获取ip地址(填写网卡名)
# 并请根据实际情况填写sed行数
INTERFACE="enp2s0"
# 更新IP
TARGET_IP=""
# 获取ip地址网址
#GETIPURL="https://api.ip.sb/ip"
#GETIPURL="https://api.myip.la"
#GETIPURL="https://v6.ip.zxinc.org/getip"
#GETIPURL="https://api6.ipify.org"
#GETIPURL="https://api.ip.gs/ip"
# End Point 终端地址 请根据地域选择,默认为北京1
IAM="iam.myhuaweicloud.com"
#IAM="iam.cn-north-4.myhuaweicloud.com"
#IAM="iam.cn-east-2.myhuaweicloud.com"
#IAM="iam.cn-east-3.myhuaweicloud.com"
#IAM="iam.cn-south-1.myhuaweicloud.com"
#IAM="iam.cn-southwest-2.myhuaweicloud.com"
#IAM="iam.ap-southeast-1.myhuaweicloud.com"
#IAM="iam.ap-southeast-2.myhuaweicloud.com"
#IAM="iam.ap-southeast-3.myhuaweicloud.com"
#IAM="iam.af-south-1.myhuaweicloud.com"
DNS="dns.myhuaweicloud.com"
#DNS="dns.cn-north-4.myhuaweicloud.com"
#DNS="dns.cn-east-2.myhuaweicloud.com"
#DNS="dns.cn-east-3.myhuaweicloud.com"
#DNS="dns.cn-south-1.myhuaweicloud.com"
#DNS="dns.cn-southwest-2.myhuaweicloud.com"
#DNS="dns.ap-southeast-1.myhuaweicloud.com"
#DNS="dns.ap-southeast-2.myhuaweicloud.com"
#DNS="dns.ap-southeast-3.myhuaweicloud.com"
#DNS="dns.af-south-1.myhuaweicloud.com"
TOKEN_X="$(
curl -L -k -s -D - -X POST \
"https://$IAM/v3/auth/tokens" \
-H 'content-type: application/json' \
-d '{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "'$USERNAME'",
"password": "'$PASSWORD'",
"domain": {
"name": "'$ACCOUNTNAME'"
}
}
}
},
"scope": {
"domain": {
"name": "'$ACCOUNTNAME'"
}
}
}
}' | grep X-Subject-Token
)"
TOKEN="$(echo $TOKEN_X | awk -F ' ' '{print $2}')"
if [ -z $TARGET_IP ]; then
if [ $REMOTE_RESOLVE -eq 1 ]; then
if [ $INTERFACE ]; then
TARGET_IP=$(curl -s -6 --interface $INTERFACE $GETIPURL)
else
TARGET_IP=$(curl -s -6 $GETIPURL)
fi
else
if [ $INTERFACE ]; then
TARGET_IP=$(ifconfig $INTERFACE | grep 'inet6 ' | grep -oE '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' | sed -n 1p)
else
TARGET_IP=$(ifconfig | grep 'inet6 ' | grep -oE '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' | sed -n 1p)
fi
fi
fi
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 "{\"name\": \"你的域名\",\"type\": \"AAAA\",\"records\": [\"$TARGET_IP\"],\"ttl\": 60}"
6、周期执行脚本
使用crontab命令可以实现周期执行,在非root用户下输入命令crontab -e,选择编辑器后进入时程表,加入命令50 22 * * * /usr/bin/sh (所在路径)/huaweicloud_ddns_ipv6.sh其含义为每天22:50执行脚本
三、注意事项
若有出错,注意错误代码和错误提示,通过官方文档可以推断出哪里错误
api响应错误码https://support.huaweicloud.com/api-dns/ErrorCode.html

2023.7.20更新
加入了查询云解析IP与本机IP的对比
加入了日志文件