当初の目的とは全然違う方向に行ってしまったけど、
勢いづいて作ってしまったので紹介。

まず、DynamicDNSとは、動的IPアドレスで自宅サーバを運営するときに不可欠なサービス。
固定IPアドレスを取得してる俺としては、特にコレといって使い道なし。

なぜこれを作ってしまったかという顛末は別の機会に書くとして、何をどう作ったかという内容。
というか、主な仕様の紹介。

  1. WEBでユーザ登録できる。
  2. ユーザ名・パスワード・ドメイン名はデータベースに格納。(PostgreSQL)
  3. なんとパスワードはいっちょ前に暗号化まで。
  4. 更新には、nsupdateコマンドを利用。
  5. DiCEで更新できる。

細かいソースを書くのもあれなので、だいたいの概要を。

まずはWEBで登録出来るフォームを作成。
ユーザ名と、更新用のパスワード、希望サブドメイン+ドメインの組み合わせ。本登録URL送信用メールアドレスを入力すると、確認画面表示後、確認ボタンでランダムなURLを生成してメールを発射する。

ランダムな文字列は、PHPでランダムな文字列を作るで紹介してる関数を利用して作る。

ランダムなURLを生成する理由は、使えるメールアドレスなしで登録出来ないようにすることと、POSTで登録データをガシガシ送って大量にサブドメイン登録されるのを防ぐため。

やってることは、ランダムな文字列を生成して、それをそのままファイル名にして一時ファイルを作成。その中身は、登録情報。
メールで送るURLは、そのランダムな文字列をGETで送信するもの。
GETで送られた文字列名のファイルが存在すれば、今登録したパスワードを入力するフォームを表示。
これが通れば、データベースにすべての情報を書き込む。

これでユーザ登録は完了。


アップデートはアップデート用のPHPスクリプトにPOSTで各データを送ることでアップデートする。
何のデータも送らなければユーザ名・パスワード・ドメイン名・IPアドレスを入力するフォームを表示。

POSTでデータが送られてきたら、それを検証。
サブドメイン+ドメイン名がユニークなので、そこからユーザ名とパスワードを引っ張り出して認証。

パスワードの暗号化は、なんとなくやってみたかっただけなんだけど、とりあえず登録時に送られたパスワードをPHPのMD5()関数で暗号化してデータベースに登録。
データベースから引っ張り出した文字列と、md5("パスワードとして送られた文字列を")が同じなら認証通る。
つまりネットワーク上を流れるのは生のパスなんで、あんまり意味ないかと。

認証が通ればexec()関数でnsupdateコマンドを発行して更新する。

DiCEでの更新については、同じスクリプトをそのまま使える。
DiCEはHTTPでスクリプトにPOSTやGETデータを送信出来るので、
入力フォームと同じフォーマットでデータを送るようにプラグインを作ってやればいい。
これについて詳しくは別項で。

テスト公開。
Genkikko Server Dynamic Domain
問題が起こったら消す可能性あり。


2007.11.04追記
要望があったのでソース公開。
ツッコミ歓迎。
新規ユーザ登録スクリプト
DDNSアップデートスクリプト

これだけだと、仮登録ファイルだけで放置されたファイルがいつまでも残るので、
指定以上古いファイルを削除するスクリプトをcronで走らせる。
これについては近々別項で。