既に同じ趣旨の記事がたくさん投稿されているので、屋上屋を架す憾みがあるが、いくつか新しい知見と工夫を追加できたと思うので、自分用のメモを兼ねて投稿する。
なお、Alma Linux (CentOS) 8 の環境である。
/root/ddnscheck.sh
# !/usr/bin/bash
# This script checks and updates ddns connection for this server.
# TARGET
TARGET="myserver.xxx.xx"
# Operating limit in seconds (default 16 hours : 4am to 8pm)
LIMIT=57600
if [ $# -ge 1 ]; then
  let LIMIT=$1
fi
# Sleep seconds between pings
SLEEP=15
# Forced update limit in seconds (1 hour)
UPDATE_LIMIT=3600
# Overall loop counter
I=0
# Updating loop counter
J=0
echo "Going to check ddns for $LIMIT seconds ..." 1>&2
while [ $I -lt $LIMIT ];
do
  echo -n "`date +"%m-%d %H:%M:%S"` " 1>&2
  ping -4 -c1 -w5 $TARGET >> /dev/null
  if [ $? == 0 ]; then
    echo " OK." 1>&2
  else
    echo " Not Connected."
    let J=$UPDATE_LIMIT
  fi
  if [ $J -ge $UPDATE_LIMIT ]; then
    echo " Going to update DDNS ..."
    wget -4 -O - https://mydns******:password@www.mydns.jp/login.html 1>&2
    wget -6 -O - https://mydns******:password@www.mydns.jp/login.html 1>&2
    let J=0
  fi
  sleep $SLEEP
  let I=$I+$SLEEP
  let J=$J+$SLEEP
done
echo "Operation finished." 1>&2
/etc/cron.d/ddnscheck
55 3 * * * root /root/ddnscheck.sh &> /var/log/nginx/ddnscheck.log
説明
ddnscheck.sh は、デフォルトで 57600秒(16時間)にわたって動作する。15秒ごとに自宅サーバ(自分自身でも良い)に対して DDNS のサーバ名で ping を打ち、応答が返ってこなければ、自宅サーバのグローバル・アドレスが変更されたと見て、MyDNS.JP のアドレス通知 URL を叩く。アドレスが変っていない場合でも、1時間ごとに MyDNS.JP にアドレスを通知する。このスクリプトを cron で毎日 3:55 AM に起動する。
ipv4 と ipv6
ping と wget で使用している -4 および -6 は、それぞれ ipv4 または ipv6 での動作を強制するスイッチである。これらのスイッチを付けずに wget で MyDNS.JP のアドレス通知 URL にアクセスした場合、私の環境では ipv6 のアドレスだけが更新された。それでは具合が悪いので、上記のようにしている。
なお、wget のスイッチを変更する代りに、MyDNS.JP の URL を次のようにそれぞれ専用のアドレスに変更しても良い。
    wget -O - https://mydns******:password@ipv4.mydns.jp/login.html 1>&2
    wget -O - https://mydns******:password@ipv6.mydns.jp/login.html 1>&2
参考
MyDNS.JP のドキュメントを参考にするのが良い。