目前家里的主站点的访问,使用用的TPLINK路由器自带的TPDDNS.CN的动态域名,路由器公网地址更新,会自动更新域名解析。但是这项服务快要停止了。”因业务调整,TPDDNS服务将于2025年6月30日起正式停止*.tpddns.cn的域名解析服务。请您在停服前尽快完成服务迁移。”
官方提供了花生壳等其他几个动态域名的替代方案,不过既然免费的动态域名越来越少,而且还越来越奇怪,还不如切换为自己搞动态DDNS,以前曾写过一个文章,怎么利用华为云的API修改域名解析记录,来实现IPV6的解析,同理我们现在在那个基础上把功能完善下,支持IPV4记录的更新即可。
这次我们在xudongvp.com域名下建一个杭州主站对一个主机域名,专门用来指向家庭网络入口路由器的外网地址。相关脚本更新如下:
#!/usr/bin/sh
#. /etc/profile
# 在运行此脚本之前,请先在华为云DNS管理控制台内添加对应域名的A记录
# 并获取对应的 ZONE_ID 和 RECORDSET_ID
DOMAIN_NAME="xxxxxx.xudongvp.com"
RECORDSET_ID="XXXXXX"
# 一般来说用户名和账户名相同
USERNAME="XXXXXX"
ACCOUNTNAME="XXXXXX"
PASSWORD="XXXXXX"
# 对应解析记录的 ZONE_ID、RECORDSET_ID和PROJECT_ID,其中PROJECT_ID可以在华为云APIexplorer中的云解析服务>recordset管理>showRecordSet中填写id后的调试结果中的请求头X-Project-Id看到
ZONE_ID="XXXXXX"
PROJECT_ID="XXXXXX"
# 从外网API获取ip地址(默认开启1)
REMOTE_RESOLVE=1
# 从网卡获取ip地址(填写网卡名)
# 并请根据实际情况填写sed行数
INTERFACE="enp3s0"
# 更新IP
TARGET_IP=""
# 获取ip地址网址
GETIPURL="https://4.ipw.cn"
# End Point 终端地址 请根据地域选择,默认为北京1
IAM="iam.af-south-1.myhuaweicloud.com"
DNS="dns.cn-east-3.myhuaweicloud.com"
#认证token获取:
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}')"
#echo "TOKEN:${TOKEN}"
#获取本机IP:
if [ -z $TARGET_IP ]; then
if [ $REMOTE_RESOLVE -eq 1 ]; then
if [ $INTERFACE ]; then
TARGET_IP=$(curl -s -4 --interface $INTERFACE $GETIPURL)
#echo "TIP-01:${TARGET_IP}"
else
TARGET_IP=$(curl -s -4 $GETIPURL)
fi
else
if [ $INTERFACE ]; then
TARGET_IP=$(ifconfig $INTERFACE | grep 'inet6' | grep global | 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 global | 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
#判断IP是否一致、是否需要调用API修改:
echo $(echo "[";date "+%Y-%m-%d %H:%M:%S";echo "] ";echo "修改云解析IP为:"[$TARGET_IP]",API响应内容如下:";
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\": \"$DOMAIN_NAME\",\"type\": \"A\",\"records\": [\"$TARGET_IP\"],\"ttl\": 30}";)
该脚本就不能在路由器上运行,当前我们是挂载一台内网服务器的宝塔面板上,每两分钟运行一次。如果公网IP变更,则执行API进行更新。
官网、存储、宝塔面板等各种资源入口,开始进行动态域名切换了。逐步都切换到自己的这个DDNS的域名上,自己做自己的DDNS服务商,谁也不依赖,也不需要注册其他账号或者上其他平台上去了。
好像一切变简单了。
存储、宝塔面板用自己的新域名访问了,都看着顺眼多了。