MyDNSなどのダイナミックDNSの更新スクリプトを作ったのでメモ程度に残しておきます。
このスクリプトはhttp://blog.nogisawa.net/ip.phpを使い現在のIPを取得し、違っていたらBASIC認証で更新を行うというもの。これを5分おきぐらいにcronで走るように設定します。更にDNSの更新を待ってFTPの再起動も行います。ただしこれでは長期間更新が無かった場合にアカウントが使われていないと見なされ削除されてしまいます。それを回避する為IPアドレスを保存している一時ファイルを1日1回削除してやります。
#!/bin/bash
LOCKFILE="/tmp/mydns_update.lock"
IPADDR="/tmp/ip_addr"
HOSTNAME="XXXX.mydns.jp"
#Check LOCKFILE
#FTP再起動などで時間がかかかっている場合などを考慮してロックファイルを使います。
if [ -e $LOCKFILE ];
then
echo "ERROR: Lock fike exists."
exit 1
fi
#Create LOCKFILE
touch $LOCKFILE
#GET Now IP Address
#ここではnogisawa.net上のip.phpを利用しています。
NOW_IP=`wget -q http://blog.nogisawa.net/ip.php -O - | cat`
#$IPADDRが存在したらIP変更による更新
#存在しない(削除されていたら)定期的な通知してDAIRY_REFRESH=1にする
if [ -e $IPADDR ];
then
OLD_IP=`cat $IPADDR`
DAIRY_REFRESH="0"
else
OLD_IP="0.0.0.0"
DAIRY_REFRESH="1"
fi
if [ "${NOW_IP}" != "${OLD_IP}" ];then
echo "IP address is changed.( $OLD_IP -> $NOW_IP )";
#DNS REFRESH COMMANDS --------------------------------------------------------------------------------------------------------------
# DNS更新用のコマンド(wgetなど)をここに記述します。
#mydns
wget -q -t 1 -4 -O /dev/null http://USERNAME:PASSWORD@www.mydns.jp/login.html
#DNS REFRESH COMMANDS END ----------------------------------------------------------------------------------------------------------
if [ "$DAIRY_REFRESH" = "0" ];
then
sleep 30
echo "Restarting FTP Server..."
#ローカルのDNSが更新されるまで最大10回繰り返します。
#それでもローカルのDNSが更新されなかった場合のエラー処理は面倒くさくて書いてません。
for num in `seq 0 10`
do
DNS_RESULT=`dig $HOSTNAME A +short`
echo "Now IP: $NOW_IP, DNS IP: $DNS_RESULT"
if [ "$NOW_IP" = "$DNS_RESULT" ];
then
# FTPの更新コマンドをここに記述します。
sudo /etc/init.d/proftpd stop
sudo /etc/init.d/proftpd start
break;
fi
#1回につき1分待ちます。
sleep 60
done
fi
echo $NOW_IP > /tmp/ip_addr;
fi
rm $LOCKFILE
exit 0
cronには次のように設定(5分おきにチェック(上)、毎日昼12時に定期更新(下))
*/5 * * * * username /home/username/bin/mydns_update.sh > /tmp/mydns_log 0 12 * * * username rm /tmp/ip_addr
ご利用は自己責任で。
MyDNS以外でもDynamic DO!.jpなどBASIC認証を使うタイプのダイナミックDNSならどこでも使えると思います。(更新コマンドはこちらを参照)
FTPを更新するときわざわdigで取ってきてローカルのDNSが更新されるのを待ってから再起動するのは、FTPが名前解決をしてIPを取得する為です。ローカルのDNSが更新される前に再起動してしまうと、PASVで返すアドレスが古いままになってしまうので、それを回避しています。
また、このスクリプトをそのままコピペして使うと当サイトのip.phpを利用する事になりますので、ip.phpと同じ挙動をするものを自作して自分が持っている外部のサーバーに設置し、利用してください。ただREMOTE_ADDRを返すだけのプログラムなので5行程度で書くことができるはずです。