ダイナミックDNS

はじめに

自宅サーバは、家サーバー・プロジェクトの無料のダイナミックDNS(DDNS)サービスを利用して運営しています。
自宅のグローバルIPアドレスは動的IPアドレスで、IPアドレスが変わったタイミングで、DDNSサービスに再登録する必要があります。
このページでは、グローバルIPアドレスの変化を検知して、DDNSサービスに自動的に登録しているスクリプトを紹介します。

前提条件

以下のスクリプトは、ルーターは「PR-400NE」、DDNSサービスは「家サーバー」の前提です。
条件が異なる場合は、グローバルIPアドレスを調べる箇所、DDNSサービスに登録する箇所を変更してみてください。

処理概要

  • ①ルーターからグローバルIPアドレスを取得します。
  • ②DNSに登録されているIPアドレスを取得します。
  • ③2つを比較し、グローバルIPアドレスが変わっていなければ終了します。
  • ④DDNSに登録したIPアドレスと、グローバルIPアドレスを比較し、登録済みの場合は終了します。
  • ⑤DDNSにグローバルIPアドレスを登録します。

スクリプト

以下のスクリプトを文字コード「UTF-8」で作成します。(日本語で文字を検索している箇所があり、文字コードが違うとうまく動作しません)
スクリプトはファイル名の箇所のリンクからダウンロードできます。
背景が黄色の個所は、各自の環境に合わせて変更する必要があります。

UpdateDDNS.sh

#!/bin/sh

# 認証情報
DDNS_USER=xxxxxxxx
DDNS_PASS=xxxxxxxx
DDNS_DOMAIN=dip.jp
ROUTER_USER=user
ROUTER_PASS=xxxxxxxx

# 各種設定
NAME_SERVER=xxx.xxx.xxx.xxx
BASEDIR=`dirname $0`
LOG_FILE=$BASEDIR/ddns_`date '+%y%m%d'`.log
REG_FILE=$BASEDIR/ddns.reg
DOMAIN_NAME=$DDNS_USER.$DDNS_DOMAIN

# ログ出力
log() {
    echo -e `date '+%Y/%m/%d %H:%M:%S '`"$1" >> $LOG_FILE
}

# ルータ(PR-400NE)からグローバルIPアドレスを取得
IP_GBL=`wget -O - -o /dev/null http://$ROUTER_USER:$ROUTER_PASS@router/index.cgi/info2_main \
    | iconv -f EUC-JP -t UTF-8 \
    | sed -n "/WAN側IPアドレス/,/td/p" \
    | egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
    | sed -e "s/^.*>\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)<.*$/\1/g"`
# ログ出力
log "router : $IP_GBL"

# IPアドレスを取得できていない場合は終了
if [ -z "$IP_GBL" ] || [ "$IP_GBL" = "0.0.0.0" ] ; then
    exit 0
fi

# DNSに登録されているIPアドレスを取得
IP_DNS=`dig @$NAME_SERVER $DOMAIN_NAME \
    | egrep "^$DOMAIN_NAME" \
    | sed -e "s/.*\t\([0-9]\+\.[0-9]*\.[0-9]\+\.[0-9]\+\)/\1/g"`
# ログ出力
log "dns    : $IP_DNS"

# グローバルIPアドレスが変わってなければ終了
if [ $IP_GBL = $IP_DNS ]; then
    exit 0
fi

# 設定済みIPアドレス取得
IP_REG=`cat $REG_FILE 2> /dev/null`
# 設定済みなら終了
if [ "$IP_GBL" = "$IP_REG" ]; then
    # ログ出力
    log "result : $IP_REG"
    exit 0
fi

# ieServerに登録
HTML=`wget -O - -o /dev/null \
    --post-data "username=$DDNS_USER&password=$DDNS_PASS&domain=$DDNS_DOMAIN&updatehost=1" \
    https://ieserver.net/cgi-bin/dip.cgi \
    | iconv -f EUC-JP -t UTF-8`
# 設定されたIPアドレスを抽出
IP_REG=`echo $HTML \
    | grep "に設定されています。" \
    | sed -e "s/^.*[^0-9]\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)[^0-9].*$/\1/g"`
# ログ出力
log "result : $IP_REG\n$HTML"

echo $IP_REG > $REG_FILE

環境に合わせてスクリプトの変更

各自の環境に合わせて、設定を変更すべき個所を説明します。

# 認証情報
DDNS_USER=xxxxxxxx・・・①
DDNS_PASS=xxxxxxxx・・・②
DDNS_DOMAIN=dip.jp・・・③
ROUTER_USER=user
ROUTER_PASS=xxxxxxxx・・・④

  • ①DDNS_USER、②DDNS_PASS、③DDNS_DOMAINの個所は、家サーバーで登録した情報を設定します。
  • ④ROUTER_PASSの個所は、ルーター「PR-400NE」の管理画面のパスワードを設定します。(ROUTER_USERは「user」固定)

 

# 各種設定
NAME_SERVER=xxx.xxx.xxx.xxx・・・⑤
BASEDIR=`dirname $0`
LOG_FILE=$BASEDIR/ddns_`date '+%y%m%d'`.log・・・⑥

  • ⑤NAME_SERVERの箇所は、サーバのデフォルトゲートウェイを指定して、外部のDNSを利用するよう設定します。(例:192.168.0.1など)
  • ⑥LOG_FILEの個所は、シェルと同じ場所に、ddns_yyyyMMdd.logでログを出力する設定になっているので、適宜変更してください。

 

定期的に実行

cronに登録して、10分ごとに起動しています。

$ crontab -e

# UpdateDDNS
*/10 * * * * sh /xxx/xxx/xxx/UpdateDDNS.sh

/xxx/xxx/xxxの部分は、シェルを配置した場所に合わせて適宜変更してください。

 

亀ツール