2005年8月14日日曜日

ダイナミックDNS

自宅で、ウェブ(WWW)などのネットワークサービスを動かしたいけど、インターネット接続が固定IPアドレスではない場合には、ダイナミックDNSのお世話になるのが、常套手段。

うちでも、2つのダイナミックDNSを使ってる(2つあるのは、どちらか1つが落ちてても大丈夫なようにするための保険)。IPアドレスの更新は、自作のシェルスクリプトで、えいやーとやっている。



この更新作業をやってくれるツールはいくつかあって、試してみたけど、ツールを実行するコンピュータに割り当てられたIPアドレスを登録してしまう、という問題があった。NAT機能つきのADSLルーターを使っている場合は、LAN内にあるコンピュータには、192.168.0.2のようなプライベートネットワークアドレスが割り振られているので、こんなアドレスをダイナミックDNSに登録されてしまっては、何の役にもたたない。



自作のシェルスクリプトでやっているのは、こんな処理。



・ 30分に1回くらいの間隔で
・・ 現在割り当てられたグローバルIPアドレスを、ADSLルーターの管理メニュー(ブラウザを使ってADSLルータの設定を行うやつ)から、httpでとってくる
・・ nslookupでひいたIPアドレスが、現在割り当てられたIPアドレスと異なる場合は、ダイナミックDNSで、IPアドレスを更新する
・・ そうでない場合でも、前回のIPアドレス更新から、数日経過している場合は、とりあえず、IPアドレスを更新する



たぶんこんなんでも、ダイナミックDNSの利用ルール(頻繁に更新するんじゃねー!サーバーが重くなるんだよ、みたいな)にあってるんじゃないかと思う。



さて、現在、夏休みで帰省中。



実は、実家の24時間運用サーバでは、これまで、ダイナミックDNSを利用していなかった。
たまたま、http://www.dyndns.com/ に登録したけど、あまり有効に利用していないドメインがあるので、実家でも、ちゃんとダイナミックDNSを使うようにしてみた。





前提条件
・ 実家のサーバは、FreeBSDで運用中
・ 保守性をよくするために、ファイルシステムは、64MBのコンパクトフラッシュを、read onlyでマウント。ハードディスクは使っていない。実家は遠くにあり、コンピュータに詳しい人がいないので、動かなくなったら、電源を入れなおすだけで復旧させられるようにしたい。そのためには、ハードディスクがあると、ファイルシステムの障害発生のために、自動復旧できなくなる可能性が高い
・ NAT機能つきのADSLルータを利用。FreeBSDマシンには、プライベートIPアドレスが割り振られている
・ www.dyndns.org を利用する
・ dyndnsのIPアドレスの更新インターフェイスが、ちょっと複雑なので、自作のシェルスクリプトを流用できない。既存のツールを使いたい



dyndns.orgでは、Unix用自動更新ツールとして、「ddclient」、「ez-ipupdate」が紹介されていた。どちらもFreeBSDではportsとして用意されているので(/usr/ports/dns/ddclient, /usr/ports/dns/ez-ipupdate)、インストールするのは、とってもかんたんだ。



この2つのツールのうち、ddclientは、perlを使っている。実家FreeBSDでは、64MBのCFにぜんぶを収めるために、perlは消してしまった。だから、ddclientは使えない。ez-ipupdateは、Cで書かれていてperlは必要ないので、こちらを使うことにした。



懸念していた、ダイナミックDNSに、プライベートIPアドレスでなく、グローバルIPアドレスを登録する方法も、ez-ipupdateでは、コマンドライン引数で、登録したIPアドレスを指定できることがわかった。



あとは、グローバルIPアドレスを知る方法。



たいてい、グローバルIPアドレスは、ADSLルータの管理メニュー(Webベースの設定ユーティリティ)から、もってこれる。実家で使ってるのは、MegaBit Gear TE4521CというADSLルータ。かなり乱暴なシェルスクリプトだが、wgetとsedを使って、こんなかんじで一応取得できた。

#! /bin/sh

wget --quiet \
  --http-user 名前 \
  --http-passwd=パスワード \
  -O - \
  'http://192.168.1.1/cgi-bin/main.cgi?cc_webname=STATUS' | \
  sed -n -e '/ADSL IP/s|[^0-9]*\([0-9.]*\).*|\1|p'



とりあえず、これを、たとえば/usr/local/bin/global-ip.sh という名前で実行可能にしておく。



ez-ipupdateは、こんな感じで実行することになる。

#! /bin/sh



/usr/local/bin/ez-ipupdate --quiet \
    --config-file /usr/local/etc/ez-ipupdate.conf \
    --address `/usr/local/bin/global-ip.sh`

FreeBSDのportsでインストールした場合、ファイルez-ipdate.confのサンプルが、/usr/local/share/example/ez-ipupdateのなかにたくさん用意されている。



上記のシェルスクリプトを、cronで定期的に実行すればOK。ez-ipupdateには、daemonモードという実行方法もあるようだが、IPアドレスを渡す方法がよくわかんなかったので、cronを使ってみた。ez-ipupdateはcacheファイルを作って、最後にいつダイナミックDNSを更新したかを記録しているので、cronで実行するたびに更新してしまう、というようなことはない。





1 件のコメント:

  1. よく自宅とかできることがわかった
    ネットで最後とか重く前提条件やメニューを自作されたみたい…

    返信削除