【開發(fā)記錄】ubuntu 2204腳本實現(xiàn)ddns功能(華為云)

/*************這里我只實現(xiàn)了ipv6的ddns功能,ipv4因無公網(wǎng)ip無法驗證******************/
/*************原作者地址https://gitee.com/lvcs/huaweicloud_ddns******************/
一、基本思路
通過本機ifconfig命令或通過IP查詢網(wǎng)站找到本機ip? ? ->? ? 腳本通過api接口直接對華為云的域名解析項做修改? ? ->? ? 使用crontab命令對腳本進行周期執(zhí)行。
二、功能實現(xiàn)
1、添加解析
先在DNS管理控制臺https://console.huaweicloud.com/dns/內(nèi)添加對應(yīng)域名解析記錄。
2、創(chuàng)建IAM賬號
在華為云主賬號下創(chuàng)建IAM賬號(雖然腳本上說沒必要,但是我在實際使用時認證失敗,保險起見再創(chuàng)建一個為好)https://console.huaweicloud.com/iam/(右上角創(chuàng)建賬號),初次設(shè)置后需要退出主賬號,使用IAM賬號登陸華為云,完畢后記住華為主賬號、IAM賬號和IAM密碼。

3、查看IAM賬號所在區(qū)域

?
4、獲取id和zone_id
登入華為云的API管理https://apiexplorer.developer.huaweicloud.com/apiexplorer/?選擇所有產(chǎn)品>云解析服務(wù)>Record Set管理>ListRecordSets ,在name項中輸入你的域名點擊調(diào)試,在響應(yīng)體中記錄下id和zone_id
?

5、腳本獲取與修改
現(xiàn)在我們有了華為云主賬號、IAM賬號密碼、IAM的地址、id和zone_id,此時我們就可以將腳本中需要填寫的地方依次填上。
首先安裝腳本運行環(huán)境
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
以上若獲取不到后面會附上腳本代碼
修改腳本權(quán)限
chmod +x ./huaweicloud_ddns.sh
修改腳本:
用編輯器打開腳本后
USERNAME為IAM賬號
ACCOUNTNAME為華為云主賬號
PASSWORD為IAM密碼
ZONE_ID為獲取的zone_id
RECORDSET_ID為獲取的id
REMOTE_RESOLVE為是否從第三方網(wǎng)站獲取ip,1為獲取,其他數(shù)為不獲取
INTERFACE為網(wǎng)卡名稱,一般為執(zhí)行ifconfig命令后的第一行左邊頂頭的幾個字符
TARGET_IP為自動獲取ip出錯時輸入固定IP
若需從第三方網(wǎng)站獲取ip,則需要取消#GETIPURL的“#”
IAM地址,根據(jù)獲取的地址,取消相應(yīng)的“#”(默認北京一)
DNS地址,根據(jù)添加記錄時的地址,取消相應(yīng)的“#”(默認北京一)
TOKEN和TOKEN_X為認證相關(guān),不用管
在TARGET_IP=$(ifconfig $INTERFACE | grep 'inet6 ' | grep -oE '所在行的最后,按需修改sed值(默認且一般為1),其含義為ifconfig命令后帶inet6前綴的第一個ipv6地址所在行,第幾行就是幾p。
TARGET_IP=$(ifconfig | grep 'inet6 ' | grep -oE '所在行同上,按需修改sed值。?

在curl命令下面,按格式輸入相應(yīng)的域名(name)、解析類型(type)、ttl值(ttl)

ps:腳本的標頭根據(jù)系統(tǒng)不同而不同,可以用whereis命令查看,如:輸入命令whereis sh,我的結(jié)果為sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz,故標頭應(yīng)該為#!/usr/bin/sh
以下為全部腳本代碼
#!/usr/bin/sh
#. /etc/profile
# Copyright 2021 LVCS
# https://github.com/lllvcs/huaweicloud_ddns
# https://gitee.com/lvcs/huaweicloud_ddns
# 在運行此腳本之前,請先在華為云DNS管理控制臺內(nèi)添加對應(yīng)域名的A記錄
# 并獲取對應(yīng)的 ZONE_ID 和 RECORDSET_ID
# 一般來說用戶名和賬戶名相同
USERNAME=""
ACCOUNTNAME=""
PASSWORD=""
# 對應(yīng)解析記錄的 ZONE_ID 和 RECORDSET_ID
ZONE_ID=""
RECORDSET_ID=""
# 從外網(wǎng)API獲取ip地址(默認開啟1)
REMOTE_RESOLVE=1
# 從網(wǎng)卡獲取ip地址(填寫網(wǎng)卡名)
# 并請根據(jù)實際情況填寫sed行數(shù)
INTERFACE="enp2s0"
# 更新IP
TARGET_IP=""
# 獲取ip地址網(wǎng)址
#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 終端地址 請根據(jù)地域選擇,默認為北京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、周期執(zhí)行腳本
使用crontab命令可以實現(xiàn)周期執(zhí)行,在非root用戶下輸入命令crontab -e,選擇編輯器后進入時程表,加入命令50 22 * * * /usr/bin/sh (所在路徑)/huaweicloud_ddns_ipv6.sh其含義為每天22:50執(zhí)行腳本
三、注意事項
若有出錯,注意錯誤代碼和錯誤提示,通過官方文檔可以推斷出哪里錯誤
api響應(yīng)錯誤碼https://support.huaweicloud.com/api-dns/ErrorCode.html?

2023.7.20更新
加入了查詢云解析IP與本機IP的對比
加入了日志文件