欢迎光临散文网 会员登陆 & 注册

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

2022-11-29 12:42 作者:锁部千本  | 我要投稿

/*************这里我只实现了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密码。

图片
创建IAM账号

3、查看IAM账号所在区域

图片
查看IAM账号区域

 

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

 

图片
获取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值。 

图片
修改sed行数



在curl命令下面,按格式输入相应的域名(name)、解析类型(type)、ttl值(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的对比

加入了日志文件


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

分享到微博请遵守国家法律