自宅で、ウェブ(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で実行するたびに更新してしまう、というようなことはない。
よく自宅とかできることがわかった
返信削除ネットで最後とか重く前提条件やメニューを自作されたみたい…