Archive

ダイナミックDNSへの同期スクリプト

Value Domainからドメインを購入して 自宅サーバを作動させていますが、 プロバイダから付与されるIPアドレスが接続の度に変わるので 簡単なスクリプトを作成し5分毎にcronで実行しています。 以下使用中のスクリプト。

なお、スクリプトはLinux上で使用しているものです。流れとしては、

  1. 現在のIPアドレスを取得(初期設定でhttp://dyn.value-domain.com/cgi-bin/dyn.fcg?ipから)
  2. 取得IPをローカルに保存しておいたIPと比較
  3. 異っていた場合は取得IPをダイナミックDNSサービスに通知し、取得IPをローカルに保存する
  4. 2で同じだった場合は何もせず終了

ローカルに保存する仕様としたのは、 インターネット上に更新専用とはいえパスワードを垂れ流している(但しValue Domainの場合)ことに一抹の不安を覚えるからです。 まずはローカル内に保存したIPと比較することによりインターネット上へパスワードなどを垂れ流すのを最小限に抑えます。

ちなみに現在のIPアドレスはhttp://dyn.value-domain.com/cgi-bin/dyn.fcg?ipから取得します。 もし異る方法を希望する場合はGetGlobalIP関数内をいじくってください。 失敗した場合は1秒後に再試行するようにしています(初期設定では10回まで)。

その他の注意点は…

  • bashスクリプトを実行できる環境が必要(Linux/Unixなど)
  • 改変改造再配布はご自由に。ただし一切無保証、無責任。
  • IP更新はValue Domain用に作成してあります。
  • wgetが必要です(Wgetを使おう的ページ参照)。

以下がスクリプト全文です。

#! /bin/sh
#-*- coding:euc-jp; -*-

# this script use global variable

# --------------------------------------------------------------------
# Basic information
# --------------------------------------------------------------------
GET_IP_URL=http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip
GET_IP_ACCESS_COUNT_LIMIT=10
GLOBAL_IP_SAVED_FILE=/tmp/global_ip_saved

# --------------------------------------------------------------------
# Sync destination information
# --------------------------------------------------------------------
IPURL01='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=*'
IPURL02='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=mail'
IPURL03='http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=your_domain.com&p=your_password&h=@'
IPURL="$IPURL01 $IPURL02 $IPURL03"



# --------------------------------------------------------------------
# GetGlobalIP  global IP address from value-domain service
# --------------------------------------------------------------------
GetGlobalIP () {
  wget \
  -O - $GET_IP_URL
}

# --------------------------------------------------------------------
# main
# --------------------------------------------------------------------

# get Global IP
GLOBAL_IP_TEMP=
COUNT=$GET_IP_ACCESS_COUNT_LIMIT

while [ $COUNT -gt 0 ] ;do
  GLOBAL_IP_TEMP=`GetGlobalIP`
  if [ x$GLOBAL_IP_TEMP = x ]; then
    COUNT=$((COUNT - 1))
    sleep 1
  else
    COUNT=0
  fi
done

# get Saved IP
if [ -r $GLOBAL_IP_SAVED_FILE ]; then
  MYDNS_IP_SAVED=`cat $GLOBAL_IP_SAVED_FILE`
else
  MYDNS_IP_SAVED=
fi

# print header
echo -n `date +'%Y/%m/%d(%H:%M)'`

# check global ip addres
if [ x$GLOBAL_IP_TEMP = x ]; then
  echo " Can't get Global IP (try $GET_IP_ACCESS_COUNT_LIMIT times)."
  exit 0
else
  echo -n " GlobalIP=$GLOBAL_IP_TEMP"
fi

# print saved ip
if [ x$MYDNS_IP_SAVED = x ]; then
  echo -n " SavedIP=Empty"
else
  echo -n " SavedIP=$MYDNS_IP_SAVED"
fi

# check saved ip
if [ x$GLOBAL_IP_TEMP = x$MYDNS_IP_SAVED ]; then
  echo " ... Not updated. Done."
  exit 0
else
  echo -n " ... Begin to sync ..."
fi

# sync IP
for i in $IPURL
do
  echo -n " `expr $i : ".*h=\([^&]*\)"`.`expr $i : ".*d=\([^&]*\)"`/"
  if [ `wget -O - $i | grep "status=0"` ]
  then
    echo -n OK
  else
    echo -n ERROR
  fi
done

# Update saved IP
echo -n $GLOBAL_IP_TEMP > $GLOBAL_IP_SAVED_FILE
echo " ... Update saved IP"

# exit
exit 0

使用している/etc/crontabから上のスクリプト部分(抜粋)。

# 5分毎に実行して、結果をログに保存
*/5 * * * *     root    /usr/local/bin/dynamicsync-server-ip >> /var/log/dynamicsync-server-ip.log
# 3時間毎にログを削除
0 */3 * * *     root    rm /var/httpd/dynamicsync-server-ip.log

cronで出力されたログ(/var/log/dynamicsync-server-ip.log)の内容例

2005/10/16(11:05) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:10) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:15) GlobalIP=211.231.12.1 SavedIP=211.231.12.1 ... Not updated. Done.
2005/10/16(11:20) GlobalIP=211.168.3.1 SavedIP=211.231.12.1 ... Begin to sync ... @.your_domain.com/OK mail.your_domain.com/OK ... Update saved IP
2005/10/16(11:25) GlobalIP=211.168.3.1 SavedIP=211.168.3.1 ... Not updated. Done.