既に同じ趣旨の記事がたくさん投稿されているので、屋上屋を架す憾みがあるが、いくつか新しい知見と工夫を追加できたと思うので、自分用のメモを兼ねて投稿する。
なお、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 のドキュメントを参考にするのが良い。