WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

VALUE DOMAIN のダイナミック DNS を使う

前回は、VALUE DOMAIN のレンタル DNS サーバーで固定の IP アドレスを設定するところまでをご紹介しました。自宅に固定 IP アドレスが割り振られているような恵まれた環境にある方はそれでいいのですが、大抵は動的割り当ての IP アドレスしか使えないと思います。そんな一般庶民でも独自ドメインによる自宅サーバーの運用を可能にする画期的な技術が、ダイナミック DNS です。

名前はいかにも先進技術っぽい感じですが、要は「IP アドレスが変わっても、自動的に [[DNS}] レコードが書き換わるようにすれば、たぶんうまくいくんじゃない?」ということです(^^;。

※このページで例示している URL は、実際のリンクに変換されるのを防ぐために":" が全角になっている場合があります。ご注意ください。m(_ _)m

VALUE DOMAIN のダイナミック DNS について

では、VALUE DOMAIN が提供するダイナミック DNS サービスの使い方をご紹介していきます。前提として、前回ご紹介した DNS の設定が正しく動いていることが前提です。

ダイナミック DNS を有効にする

最初はダイナミック DNS のサービスが無効になっているはずなので、それを有効にします。手順は以下の通りです。

  1. まだログインしていない場合は、トップページ上部のメニューからログインしてください。
  2. 「ドメイン操作」から、「ダイナミックDNS情報」をクリックします。
  3. 「変更できるドメイン」から設定を行いたいドメイン名を選択し、「変更」ボタンをクリックします。
  4. 「ダイナミックDNS設定情報」のページに移動するはずです。このとき、「必要なパラメータ情報」のところにパスワードが表示されています。このパスワードは DNS レコードを変更するのに必要なもので、Web のログインパスワードとは別のものです。後に必要になりますので、どこかにメモしておいてください。
  5. 「ダイナミックDNS機能」のところにあるチェックボックスを ON にします。
  6. 「変更」ボタンをクリックします。

これで、ダイナミック DNS の機能が有効になりました。

DNS レコードの更新方法

DNS レコードの更新は、CGI ベースになっています。ぶっちゃけた話、以下のようなアドレスの Web ページに通常のブラウザでアクセスするだけで、 DNS レコードが更新されます。

http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=<ドメイン名>&p=<パスワード>&h=<ホスト名>&i=<IPアドレス>

CGI パラメータの意味は以下のとおりです。

ドメイン名
VALUE DOMAIN と契約しているドメイン名です。
パスワード
先ほどの「ダイナミックDNS設定情報」のページで表示されたパスワードです。
ホスト名
IP アドレスを更新するホスト名を指定します。"*" ですべてのホスト、"@" でドメイン名そのものを指定できます。
IPアドレス
新しい IP アドレスを指定します。省略可能で、その場合はアクセスしたホストのアドレスが自動的に設定されます。

簡単ですね。しかし、IP アドレスが変わってアクセスできなくなるたびにブラウザで更新をしていては埒が明きませんし、不正な IP アドレスを返す期間も長くなってしまいます。以下では、更新作業を自動化する方法をご紹介しようと思います。

cron デーモンの使い方

GentooLinux をはじめとする UNIX 系の OS には、定期的に実行するタスクを自動化するための仕組みとして cron デーモンが用意されています。ここでは、更新作業を自動化する準備として、cron デーモンの使い方をご紹介します。

ユーザーに cron の使用を許可する

GentooLinux では、セキュリティー的な理由から通常のユーザーには cron の利用を許可していません。cron を使えるようにするには、ユーザーを cron グループに所属させる必要があります。その方法は以前 GentooLinux のインストールでもご紹介しましたが、もう一度おさらいしましょう。ユーザーをグループに追加するときは、gpasswd コマンドを使用します。たとえば、ユーザー hokousyacron グループに所属させるには、以下のようにします(root で実行してください)。

gpasswd -a hokousya cron

これで、cron が使えるようになります。

crontab を編集する

cron で実行するコマンドを指定するには、crontab コマンドを使います。コマンドを実行したいユーザーでログインして、以下のコマンドを実行してください。

crontab -e

すると、環境変数 EDITOR で指定されたテキストエディタが起動され、設定が編集できるようになります。普通に編集して、保存して終了すればその時点から有効になります。1 行 1 コマンドの記述で、書式は以下のようになります。

<分> <時> <日> <月> <曜日> <コマンド>

最初に実行時刻を示すフィールドが 5 つ並び、その後に実行するコマンドを記述します。<コマンド> は行末までがそのままシェルに渡されますので、オプションの指定やリダイレクト指定なども記述できます。時刻指定は基本的に数値で指定します。各フィールドの指定可能範囲は以下のとおりです。

フィールド値の範囲
0〜59
0〜23
0〜31
0〜12
曜日0〜7(0 と 7 が日曜日)

さらに、すべてのフィールドで以下のような特殊な書式も使えます。

書式機能
*すべての時刻*
s-es から e までのすべての時刻0-10
n1,n2,n3n1 と n2 と n3 の時刻0,20,40
n1/n2n1 の範囲内で n2 の間隔0-59/10

例えば、10 分ごとに "~/tmp" 内のファイルをすべて削除したければ、以下のように記述します。

*/10 * * * * rm -Rf ~/tmp/*

これを使えば、定期的に更新スクリプトを動かすようなことができそうですね。

DNS レコードの更新を自動化する

それでは、cron を使って DNS レコードの更新を自動化してみましょう。VALUE DOMAIN のサイトでは、更新処理を行うコマンドとして wget を挙げています。しかし、単純に cron で定期的に wget を起動するだけでは必要がなくても毎回更新リクエストを送信してしまい、サーバーに大きな負荷をかける可能性があります(サーバー側の処理によりますが)。そこで、ここでは ruby で簡単なスクリプトを組んで、更新を最小限に抑える方法をご紹介します。

ruby をインストールする

まずは、ruby がすでにインストールされているかを確認しましょう。以下のコマンドを実行してください。

which ruby

これで "/usr/bin/ruby" と表示されれば、ruby がインストールされています。もし表示されなければ、root ユーザーで以下のコマンドを実行してインストールしましょう。

emerge ruby

スクリプトを書く

以下が、私が作った更新スクリプトのソースです。

#! /usr/bin/ruby

require 'net/http'
require 'resolv.rb'

DNS_SERVER = ['192.168.0.1']
DOMAIN     = 'sourcewalker.com'
HOST       = '*'
PASSWORD   = 'cwqb82s6102b'

dns = Resolv::DNS.new({:nameserver=>DNS_SERVER, :search=>[DOMAIN], :ndots=>1})
cur_addr = dns.getaddress(HOST == '*' || HOST == '@' ? DOMAIN : "#{HOST}.#{DOMAIN}").to_s

Net::HTTP.version_1_2
Net::HTTP.start('dyn.value-domain.com', 80) do |http|
  new_addr = http.get('/cgi-bin/dyn.fcg?ip').body
  if new_addr != cur_addr
    response = http.get("/cgi-bin/dyn.fcg?d=#{DOMAIN}&p=#{PASSWORD}&h=#{HOST}")
  end
end

処理内容としては、まず現在設定されている IP アドレスを DNS サーバーに問い合わせ、次に現在自分のホストに割り当てられている IP アドレスを VALUE DOMAIN 提供の CGI で調査します。そしてこれらの IP アドレスが一致していなければ、ダイナミック DNS の更新リクエストを送信する、という流れになっています。

スクリプトの最初の定数に必要な設定が埋め込まれていますので、適宜それらを書き換えてください。定数の意味は以下のとおりです。

DNS_SERVER
更新するドメイン名の現在の IP アドレスを調査するために問い合わせる DNS サーバーの IP アドレスを指定します。プロバイダーの DNS サーバーなどを指定してください。複数ある場合は、[] の中にコンマ区切りで記述してください。
DOMAIN
更新するドメインです。ホスト名は含みません。
HOST
更新するホストを指定してください。すべてのホストを更新する場合は * で OK です。
PASSWORD
前述のドメイン変更用パスワードを指定してください。

これを適当なファイル名で保存します。ここでは、"/home/hokousya/bin/ddns_update.rb" に保存したと仮定します。さらに、以下のコマンドを実行してファイルに実行権限を付加しましょう。

chmod a+x /home/hokousya/bin/ddns_update.rb

まずは普通にコマンドラインから実行して、正常に更新できるかどうかを試して見ましょう。"/home/hokousya/bin/ddns_update.rb" を実行して、以下のように表示されれば OK です。

status=0
OK

host コマンドなどを使って正常に IP アドレスが設定されていることを確認してください。

cron で定期実行する。

それでは、最後の仕上げとして上記のコマンドを cron に登録します。"crontab -e" を実行し、以下の行を追加して保存します。

*/10 * * * * /home/hokousya/bin/dns_update.rb > /dev/null 2>&1

最後で標準出力とエラー出力をリダイレクトしているのは、cron がメールを投げようとするのを防ぐためです。これで、10 分間隔で "ddns_update.rb" が実行されるようになります。

以上で、ドメイン名を使って外部から自由に自宅サーバーにアクセスできるようになります。Web サーバー、メールサーバーなど、これまでプロバイダーなどに依存していた多くのサービスを自宅サーバーに構築できるわけです。これぞ自宅サーバーの醍醐味といえるでしょう(^^)。皆さんもぜひやってみてください!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles