当サイト bird.dip.jp では 家サーバー・プロジェクト のダイナミックDNSサービスを利用させて貰っているが、その他に予備として ZIVE.ORG のサービスで bird.zive.net ドメインを取得している。 現在は Apache で "name based virtual host" としており、コンテンツは共用ではない。 長期外出の時などでもっとも困るのは自ホストの IP アドレスがわからなくなることなので、 その対策が主であるが、大して意味はない。
[2006.03.30 追記]
Zive では 2005.05 よりサービスを有料化した。
当サイトでは 2003.7 より ASAHI-NET + Flet's ADSL での固定 IP オプション、更に
2005.06 より B-Flet's にしたため、上記のような予備としての必要性が薄くなったこともあり、
これを機にサービスの利用を終了した。
この ZIVE.ORG のサービスでの IP アドレス登録は基本的に Web インターフェースのみで 自動設定ツールが用意されていない。おなじみの gdipc も使えない。 おまけに有効期間が比較的短いので必ず定期的に再登録しなければならない。 DiCEには Linux 版はあるが、 FreeBSD では面倒だし、大げさなことはしたくない。 というわけで、ちょちょいと Perl のスクリプトを書く。
あなたが ZIVE.ORG にユーザー登録済みであるのなら、IP アドレス設定ページを表示してみよう。 URI は「http://www.zive.org/REGISTERED/update.php3?HOST=登録ドメイン名」だ。 ユーザー認証があるので未登録者は参照できない。 プラウザで「ページのソース」を表示し、FORM タグの内容を抜き出してみる。 コメントや TABLE などを削り落としたのがこれだ。
<form action="/REGISTERED/update.php3" method="POST"> <input type="hidden" name="HOST" value="XXXX.zive.net"> <p> <input type="radio" name="mode" value="on" checked> IPアドレスを設定する <input type="text" name="ip_a4" value=""><br> 有効期間 <select name="rr_ttl_day"><option value="0"> 0<option value="1"> 1<option value="2"> 2<option value="3"> 3<option value="4"> 4<option value="5"> 5<option value="6" selected> 6</select>日 <select name="rr_ttl_hour"><option value="0">0<option value="1">1<option value="2">2<option value="3">3<option value="4">4<option value="5">5<option value="6">6<option value="7">7<option value="8">8<option value="9">9<option value="10">10<option value="11">11<option value="12">12<option value="13">13<option value="14">14<option value="15">15<option value="16">16<option value="17">17<option value="18">18<option value="19">19<option value="20">20<option value="21">21<option value="22">22<option value="23">23</select>時間 <select name="rr_ttl_minute"><option value="0">0<option value="10">10<option value="20">20<option value="30">30<option value="40">40<option value="50">50</select>分間 <br> <input type="submit" name="act_update" value="データ更新"> </p> </form>
「XXX.zive.net」の部分があなたのドメイン名になる。 これをファイルに落として「データ更新」ボタンを押しても動作しない。 「action="/REGISTERED/update.php3"」の部分を次のようにすればよい。 まず、この HTML から登録できることを確認しよう。
action="http://USER_NAME:PASSWORD@www.zive.org/REGISTERED/update.php3"
Navigator などのプラウザでは http:// の直後に「ユーザ名:パスワード@」を入れることで認証ダイアログを回避できる。 便利であるが、これをそのままブックマークするのはセキュリティ上、お薦めできない。
HTML 中の FORM タグで「method="POST"」となっているが、これを "GET" にすると登録はおこなわれない。 サーバ側で認識しないようだ。 GET で使えるのであれば、URI 中にパラメータを含めることができて楽なのだがさすがにそうはゆかない。 家サーバープロジェクトの Web インターフェースでは GET メソッドが使えるので、w3m や lynx などのツールと 組み合わせて一行で済んでしまう。
そこで Perl の libwww-perl ライブラリを使用してプログラムを書くことにした。 libwww-perl ライブラリには依存関係があるので必要に応じて以下のライブラリをインストールしておく。
- libwww-perl
- URI
- MIME-Base64
- HTML-Parser
- libnet
- Digest-MD5
できたのがこれ。zive.pl と言う名前で保存し、実行属性を立てたなら % ./zive.pl IP_address
という形式で実行する。
例によって無保証である。
#!/usr/local/bin/perl ... あなたの使っている perl へのパス # # zive.pl IP_ADDRESS # # 2002.08.09 masato at bird.email.ne.jp # # 以下の 3 行を自分の登録内容に合わせて変更する。 use constant DOMAIN_NAME => '登録ドメイン名'; use constant USER => 'ユーザ名'; use constant PASS => 'パスワード'; # この後は何もしなくて良い。 use constant URI => 'http://www.zive.org/REGISTERED/update.php3'; use strict; use LWP::UserAgent; die unless $ARGV[0]; # IP address my $ip = $ARGV[0]; # POST parameters my @param = ('HOST='.DOMAIN_NAME, # my domain name 'ip_a4='.$ip, # IP address 'mode=on', # update IP address 'rr_ttl_day=6', # TTL (day) 'rr_ttl_hour=0', # TTL (hour) 'rr_ttl_minute=0', # TTL (minute) 'act_update=ON'); # submit my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(POST => URI); $req->authorization_basic(USER, PASS); $req->content_type('application/x-www-form-urlencoded'); $req->content(join('&', @param)); my $res = $ua->request($req); print $res->as_string; exit 0;
これをどう使うのかと言うと、「ダイナミック DNS の設定」 のページで紹介した、ルータからグローバル IP アドレスを取得するプログラムを組み合わせて 定期的に登録をおこなう他、IP アドレスの変更を検出するスクリプトと組み合わせても実行する。 これで IP アドレスの変更と有効期限切れの両方に対応できる。 DiCE の ZIVE.ORG 用のプラグインファイルを見ると、 IP アドレスの変更チェックに ZIVE.ORG の登録ページ内のデータを用い、同じ方法で登録をおこなっていると思われる。
[2003.04.05] 実はこの方法だけでは「ログインした」と見倣されず、放っておくとアカウント削除の対象になってしまう。 この前に http://www.zive.org/REGISTERED/index.php3 にアクセスする必要がある。 以下のようなスクリプトを組み込んで自動にしてもよいが、zive.org のアナウンスを見るという意味もあるから、たまにはブラウザからアクセスしよう。
$ua = LWP::UserAgent->new; $req = HTTP::Request->new(POST => 'http://www.zive.org/REGISTERED/index.php3'); $req->authorization_basic(USER, PASS); $req->content_type('application/x-www-form-urlencoded'); $res = $ua->request($req);