公開日: 2012年8月10日 14:28:19
最終更新: 2016年7月7日 18:24:43

DDNS の更新スクリプト作成(bash)

DDNSを利用してホスト名でサーバを公開する

2016/06/02 いろいろ修正中

DDNS は、動的に変わるIPアドレスに対して、固定のホスト (or ドメイン) と関連付けてくれるサービスです。DDNS を利用すれば固定IPアドレスを取得しなくても、自宅サーバを「cro-pel.mydns.jp」 のようなドメイン名でインターネットへ公開することができます。

IP アドレスの登録・更新

自宅サーバに割り当てられている IP アドレスは、常時接続といえど PC 再起動や ISP のメンテナンスなど、インターネットに接続するたびに違ったアドレスが割り当てられます。IP アドレスの変更があった場合には速やかに更新作業を行う必要があります。
ここではシェルスクリプトの練習がてら、wget を使用して IP アドレス登録を更新するスクリプトを作成します。

更新スクリプトの作成

基本的なフローは次の通りとし、排他処理やら例外処理とか、他のOSでの汎用性などと小難しいことは一切考えないようにします。つーかそういうものが欲しい人はDiCEを使ってくらさい。

  1. ip コマンドで、自サーバの IP アドレスを取得する・・・(A)
  2. dig コマンドで、ドメイン名から IP アドレスを正引きする・・・(B)
  3. (A) と (B) の結果が異なる時だけ、DDNS 更新を実行する
  4. IP アドレスの更新が無い場合でも、7日おきに更新を行う (mydns の仕様)

まず、スクリプト本体の中にIDやパスワードが書かれているのは具合が悪いので、自称セキュリティ対策のため設定ファイルを別に作る。

※ 「OPT」の部分は wgetで Basic認証を行う場合の wget のオプションどす。
設定情報は、更新スクリプトにコマンドラインの引数として渡す。

ipchk.sh の作成

IP 更新スクリプトの本体を作成します。標準入力から引数「$1」(設定ファイル名)を受け取って、最初に読み込んでおきます。また、WIF (WAN 側 NIC) とログファイルのパスを固定します。

IPアドレスの取得

DDNSサービスに登録されているIPアドレスと、自機に割り当てられているグローバルアドレスが一致するかを確認します。自機の IP アドレス取得は、ip コマンドから得られる情報を awk で切り取って加工します。

DDNS に登録されている IP アドレスは、dig コマンドで外部 DNS へ問い合わせます。
+short オプションで IP アドレスのみ取得。

IP アドレスの更新

DDNS サービスの提供者の中には、30日(1ヶ月)以上ログイン実績がないと、アカウントを停止する規則を設けているところがあります。IP アドレスが変わっていなくとも、前回の更新から30日が経過していたら、フラグを立てて IP アドレスの更新を行うようにします。

IP アドレスが変わっていたら更新を行います。下記は mydns.jp のログインページに、Basic認証でアクセスする方法です。wget を利用し、ID/PW を送信します。ID/PW は平分で送られてしまいますのであまりお薦めはできませんが。

cron サービスへの登録

/etc/crontab へ以下を記述します。15分おきにスクリプトが実行され、IPアドレスに変更があった場合は更新を行います。

ログファイルのローテート

長期運用や回線断が長く続いた場合、ログファイルが肥大することがありますので、logrotate で世代管理し、古いログは削除します。