(※この項は、BIND+PHPでDiCEで更新可能なダイナミックDNSサーバ構築から派生しています。)
一言で言うならば、脱線。
俺と同じく自宅サーバでシコシコしてる会社のシステムさんと、互いのサーバを監視するようなものを作ろうと話していたのが事の発端かと。
おおまかな話の流れとしては、
やっぱり不安定な自宅サーバ。いつも見張ってるわけには行かず、ふと気づけば半日以上落ちてたなんてことはザラで。
このサーバダウン状態を極力早急に察知したい。
でも、そのためには外部サーバを利用する必要がある。
だって、自分のサーバは落ちてるんだから、「落ちましたよー」って連絡も出来ない。
じゃぁ逆にフェイルセーフ的な発想で、大丈夫なときは常に定期的にメールを発射すれば、メールが来ない=サーバダウンと判断付くかもしれないけど、そんな常時メールが来続けるようなウザい方法は却下。
そして、ISPのサーバを使うとか、フリーのサービス(たとえばこんなの)というのも、却下。
だってそんなもの使っちゃったら、「じゃぁ何のために自宅サーバなの?」という根本的な問いかけに返答できなくなる。
で、そんな悩みを解決してくれる方法が、今回思いついたやつ。
つまり、
知人宅サーバで自宅サーバを監視しよう。
ってこと。これについては作ったら、このサイトかその人のサイトで紹介されると思われる。
で、脱線の話をする前からなかなか軌道に乗らないわけだけど、ここからDDNSの話に近づきます。
その前にもうひとつ脱線。
会社マシンのMS-IMEさん。
「はなしにちかづきます。」を変換して、「話しに近づきます。」じゃダメでしょう。
「はなしをする。」も「話しをする。」になるな。
最近マスコミの字幕でもこの間違いよく見かけると思ったら、これのせいなのか・・・?
いや、これのせいではないか。結局は使い手の問題か。
気を取り直してDDNSの話。
ここまでで考えたのは、サーバ監視をして、落ちたら携帯にメールするということ。
そこから更に、せっかく自宅サーバが知人宅サーバのダウンを察知してるんだから、お互いのDNSサーバをセカンダリ登録しておいて、ダウンしたらレコードを書き換えて自分のサーバに誘導すればどうだろうかと。
そしたら、サーバダウン中に送られたメールがどっかに消えちゃう悲しい事故が防げるし、WEBに関しても、「ただいまサーバが落ちちゃってます。」てなページを表示させて、接続できないよりはちょっとマシな感じになる。
そこまで考えて、問題になるのは「じゃぁ、どうやってDNSを更新するの?」ってことで調べ始めたら止まらない。
軽く調べてたどり着いたのは、「nsupdate」と「GnuDIP」という二つの言葉。
前者は、BINDに付属してるツール。
なんと、悩むまでもなくBIND9にはダイナミックDNS機能が付いてたわけ。
ところがこれに意外と大きな問題があったわけだけど、それは後述。
もうひとつは、GNUのダイナミックDNS用のツール。
でもこれも上のnsupdateと同じ設定がBINDに必要なので、アップデートの仕方は同じなのかな多分。
それよか、ユーザ管理とかそういうのがメインみたい。
nsupdateの問題点
もともとうちの環境は、LAN内にあるメインサーバにBINDを入れていて、ルータで53番をメインサーバに飛ばしてDNSを提供してる。
そして自前ドメインに関しては、LANからのアクセスとWANからのアクセスで別々のゾーンファイルを読みに行くという、おそらく一般的な運用をしているのだが、この状態でLAN内からnsupdateで更新を試みると、内側用のレコードが更新される。
じゃぁ、resolve.confを書き換えてネームサーバを自分とこのグローバルIPアドレスに設定してやっても、当然つながらない。
「ネームサーバとおしゃべりできません。」とか愉快なエラーが返ってくる。
GnuDIPのインストール
GnuDIPでググって一番上に出てきたサイトに書かれている通りに忠実にインストール・・・しようと思ったけど、データベースを使いたかったからPostgreSQLの設定もやりながらインストール。
結局うまくいかず、英語の説明も読めず、諦めてこのサイトに書いてある通りflat fileで動作。
なかなかおもしろいものだけど、やはり残念ながら、LAN内からグローバルのレコードを書き換えることは出来ず。
ちなみに、このサイトはBINDの設定とかも詳しく書いてるから、DDNSサーバ立ててみたい人はここ読めば、とりあえず動作するとこまでは簡単にいけそう。
最終手段
どうもルータを超えてグローバルアドレスに接続するのは無理くさいので、直接グローバルアドレスを持っているマシン、つまりルータマシンにBINDをインストールして、ルータマシンのネームサーバを自分のグローバルアドレスにして、ルータマシン上でnsupdateを発行してやる。
これで、WAN側のレコードの書き換えが出来るようになって、DDNS完成。
しかし、このルータマシンはたった1GBのコンパクトフラッシュにVine Linux 3.2をインストールして使っている軟弱マシンのため、GnuDIP入れたりするのは結構しんどい。
しかも俺のシンプルな目的に対して、GnuDIPはあまりに高機能かつ難解で、使いたかったPostgreSQLも使って動かせてないので気に入らない。
そこでちょうどデータベースも自分で使ったことなかったし、ここらへんでそろそろちゃんと勉強したいのもあって、自分でイチから作ってみることにしたということで、BIND+PHPでDiCEで更新可能なダイナミックDNSサーバ構築に続く。というわけ。