ダイナミックDNSの更新スクリプト

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行程度で書くことができるはずです。

コメントを残す