<> By: 横田 裕思 [1. これは何ですか] DNS Balance は動的な負荷分散を行なう事の出来る DNS サーバーです。 昨今は kernel.org や *bsd.org, RING サーバーなど、広範囲にミラーサーバを 置くようなサーバが増えてきました。従来は手動でミラーサーバを選択した のですが、この DNS Balance によりそれを自動化できます。 DNS Balance には以下のような機能があります。 o 各サーバの報告により提供するアドレスを動的に変化させる事が出来る。 o クライアントの IP アドレス毎に提供するサーバの IP アドレスを 変える事が出来る。 o 必要最小限の機能のみを提供する事により、より安全な運用が出来る(はず)。 [2. 必要なもの] DNS Balance は Ruby (http://www.ruby-lang.org/) で作成していますので Ruby を手に入れてインストールしておいて下さい。最近ではバイナリパッケージ もあるようです。 [3. 実行] 1. DNS Balance のアーカイブを "/usr/local/share" で展開して下さい。 他のディレクトリで展開する場合は スクリプト "dns_balance.rb" の先頭部分の 変数 $prefix の値を変更して下さい。 2. 展開されたアーカイブの中の addrdb.rb がアドレスデータベースです。 これを編集する事により、提供するアドレス情報を決めます。 これは Ruby のプログラムで記述されているので、記述を間違うと おかしくなりますので気をつけて下さい。 ------------------ $addr_db = { "130.12.0.0/16" => { # => 130.12.0.0/16 からの問い合わせ。 # IPアドレス 123.45.67.89 に対しては # "123.45.67.89/32" から # "0.0.0.0/1" の順に調べていきます。 "www.foo.com" => [ # => www.foo.com のアドレス問い合わせ。 # ホスト名は小文字で書いて下さい。 [[1,2,3,4], 0], # => アドレス情報と接続の難しさ(最大10000) [[1,2,3,5], 10000], # の組を並べます。接続の難しさは 0 で [[1,2,3,6], 9000], # 最も接続しやすく、10000 で接続不可に [[1,2,3,7], 9000], # なります。 ], }, "default" => { # => 特に指定のない場合は "default" の "www.foo.com" => [ # 情報が使われます。 [[1,2,3,4], 0], [[1,2,3,5], 100], [[1,2,3,6], 1000], [[1,2,3,7], 9000], ], "localhost" => [ [[127,0,0,1], 0], ], }, } ------------------ 3. クライアントのアドレスの振り分け先が多過ぎるようなら namespace.rb に 別名を定義しまとめて管理する事もできます。 ------------------ $namespace_db = { "127.0.0.0/8" => "localnet", # アドレスと別名の対を記述する。 "192.168.0.0/16" => "foo-net", # 検索順は 123.45.67.89 からの問い合わせなら "130.199.0.0/16" => "foo-net", # "123.45.67.89/32" から "130.123.12.0/28" => "foo-net", # "0.0.0.0/1" の順です。 } ------------------ これを使うと addrdb.rb の記述を以下のように別名で記述する事ができます。 ------------------ $addr_db = { "localnet" => { "www.foo.com" => [ [[1,2,3,6], 2000], [[1,2,3,7], 1000], ], }, "foo-net" => { "www.foo.com" => [ [[1,2,3,4], 0], [[1,2,3,5], 100], ], }, "default" => { "www.foo.com" => [ [[1,2,3,4], 0], [[1,2,3,5], 10000], [[1,2,3,6], 9000], [[1,2,3,7], 9000], ], }, } ------------------ 4. また、オプション起動時にオプション "--as" を付けると whois.ra.net で 提供される自律ネットワーク構成情報を用いて振分をする事もできます。 これは調査に若干の時間がかかるので使用には注意して下さい。 whois.ra.net では以下のようなコマンドでそのアドレスの属するネットワークを 知らせてくれます。 --------- $ whois -h whois.ra.net 192.168.0.1 route: 192.168.0.0/24 descr: Foo networks origin: AS1000 member-of: RS-COMM_FOONET mnt-by: MAINT-AS1000 changed: rm@foo.ad.jp 99999999 source: BARNET --------- ここで origin と言う項目に注目して下さい。これが 192.168.0.1 の属する 自律ネットワークです。この項目を振り分けに使用する事ができます。 -------------- $addr_db = { "AS1000" => { "www.foo.com" => [ [[1,2,3,4], 0], ], }, "default" => { "www.foo.com" => [ [[1,2,3,4], 0], [[1,2,3,5], 10000], ], }, } -------------- 5. プログラムを起動します。実行には root 権限が必要です。 "ruby /usr/local/share/DNS-Balance-x.x/dns_balance.rb" とタイプして下さい。うまく動いたら "host -v <ホスト名>" 等のコマンドで 確かめてみて下さい。 6. 展開したディレクトリに "addr" という名前のファイルがあると、一定期間毎 (標準では5分毎) に読み込みます。内容は addrdb.rb と同じです。 なお、この更新をすると以前の addrdb.rb で設定した内容が消えてしまうので 再設定して下さい。 CSV 形式のファイルから "addr" の内容を作成する スクリプトも作ってみましたので参考にして下さい。 7. オプション "-i xxx.xxx.xxx.xxx" で listen する IP アドレスを指定できます。 オプション "-h" で簡単なヘルプメッセージが出力されます。 [4. お断り] このパッケージに含まれるプログラム等については私こと 横田 裕思 に著作権が あります。使用した事による損害に対しては何の補償もありませんが、配布、 変更等は自由です。ただし、変更して配布する時は変更が分かるようにファイルに 書いて下さい。また、その際は今後の参考にしたいので、その変更点を私に教えて 下されば有難いです。 現在、このパッケージは私のWWWページにてメンテナンスをしています。 時々覗いていただくと最新情報が手に入るかもしれません。 URL http://www.netlab.is.tsukuba.ac.jp/~yokota/ http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/dns_balance/ 使用した感想、語要望、バグ報告などをメールで送っていただければ幸いです。 最後に、このパッケージを使用して下さった方、更にバク等の報告をしていただいた 全ての人に感謝します。 2002/09/06: 横田 裕思 (yokota@netlab.is.tsukuba.ac.jp)