PLDNS


はじめに

特にネットワーク関係のプログラムを開発していると、 安いブロードバンドルータを使って、LAN からひきこもりたくなります。 ブロードバンドルータの設定は 「IP アドレス手動設定モード」にするのが コツです (IODATA:NP-BBRex の場合)。

改めて説明するまでもありませんが、LAN からひきこもるメリットは様々です。

当然、逆にデメリットもあります。 LAN 上のネットワークコンピュータなどを見たり、 ネットワークプリンタを利用するのに多少設定が必要 というのもその一つです。

もう一つの欠点として、LAN 上にある DNS サーバに、 サブネット (ひきこもった内部の LAN: 今後こう呼ぶ) の ホスト名を登録できないというのもあります。

まぁもともと家庭用のブロードバンドルータです。 WEB やメールを見るだけなら問題ないんですが、 ネットワーク関係のプログラム開発となると、gethostbyname やら何やらの 関数が動かないと困ります。

当初はサブネット内に Linux マシンを置いて BIND を走らせていたのですが、

などと問題があります。

そこで メインで使っているマシンで走らせるため Windows で動く簡単な DNS サーバを作ってみました。

プログラムの説明

はじめ BIND のプロトコルを WEB 上で調べたのですが見付からず、 RFC 1034/1035 を片手に (熟読した訳ではない) 、 実際に nslookup 等でパケットを流して「こういう意味だろう」と作りました。

とにかく、開発中のネットワークプログラムと、 「nslookup ホスト名/IP アドレス(サブネット内、外共に)」 が動作すればいいやとして作ったので結構いいかげんです。

と言うわけで MX レコードとやらは動きません。 IP アドレスとホスト名の検索ができるだけです (さらに言えば QCLASS は IN, QCOUNT は 1 の質問しか受け付けません。 また回答の TTL は 1 時間固定です)。 あっそれからキャッシュなどもまったくやっていません。

原理は BIND の UDP パケットが流れて来たら、解析して 自分で答えられるものは自分で答え、 分からないものは本来の DNS サーバに丸投げするという安直なものです。

使い方

実行形式はこいつです。 無事起動できると以下のようなダイアログが現れます。

まず最初に、サブネットのドメイン名と本来の DNS サーバの IP アドレスを指定してください。 続いて、登録するホスト名とその IP アドレスを指定していきます。 別名定義はできません。1 ホスト 1IP アドレスです。 登録の仕方は説明するまでもないでしょう。

またセキュリティの観点から (こんないい加減なプログラム サブネット以外で使われたくない)、 IP アドレスはプライベートアドレス空間しか設定できないようにしています。

登録できるホストの数は構造上無制限ですが、〜30 個程度を想定しています。 検索にはハッシュ等の高等技術を使わず頭から検索していますので、 あまり大量に登録しない方がいいでしょう。

無事簡易 DNS サーバが動くようになったら、サブネット上のすべての ネットワーク機器 (簡易 DNS サーバを動かしてる PC も含む)の DNS を簡易 DNS サーバの IP アドレスに設定します (「インターネットプロトコル(TCP/IP) のプロトコル」の「次の DNS サーバのアドレスを使う」の部分)。

例えばブロードバンドルータを用いて、ドメイン名を my.private.net, ルータ rooter: 192.168.0.1, 簡易 DNS サーバ dog: 192.168.0.2, その他のマシン cat: 192.168.0.3, bird: 192.168.0.4, mouse: 192.168.0.5 というネットワーク構成を行う場合

  1. ルータの設定はマニュアル通り行う。 DHCP 機能は(少なくとも dog, cat, bird, mouse に関しては) 使わない。
  2. dog 上の簡易 DNS の設定は
  3. dog, cat, bird, mouse の「インターネットプロトコル(TCP/IP) のプロトコル」上の DNS 設定は 192.168.0.2 (dog の IP アドレス) を 指定する(その他の項目はマニュアル通り)。
といった感じになります。 設定が終ったら「起動」ボタンを押してください。 定義ファイル (PLDNS.dat) に保存後、DNS 機能が働きます。 なお、プログラム起動時に定義ファイルが存在していた場合、 自動的に DNS 機能が働きます。

dog, cat, bird, mouse 等で

nslookup dogサブネット内のホスト (ドメイン無し)
nslookup cat.my.private.netサブネット内のホスト (ドメイン付き)
nslookup village.infoweb.ne.jpサブネット外のホスト
nslookup 192.168.0.3サブネット内の IP アドレス
nslookup 210.81.150.5サブネット外の IP アドレス
等が正しく動けば完成です。

こんなこと書かなきゃ分からない人には正直本プログラムを使って欲しくないのですが 念のため一応書いておきますと、 上記コマンドはコマンドプロンプトで行うものです。 また、社内 LAN 等ファイヤーウォールで守られた環境の場合、 上記サンプルのサブネット外のホストや IP アドレスはもともと (サブネット外の LAN でも) 引けない可能性がありますので、 その際は引ける ホストや IP アドレスで試してください。

うまく動くようになると、「コントロールパネル」の「タスク」でも使って コンピュータ起動時に本プログラムを自動起動するようにすれば、 いちいちログイン・起動しなくても済むようになります (Windows Xp の場合)。 本来は「サービス」にでもすればいいんでしょうが、 作り方が良く分からないしこれでも目的は達せられるものでほっといています。 それから当然ですが、簡易プログラムを動かす PC が立ち上がらなければ、 サブネット内の他の PC は動きません。

定義ファイル (PLDNS.dat) は GUI を使わず直接編集してもかまいません。 書式は見れば分かるでしょう。

おまけ

最初作るのが嫌で、「こんなプログラム絶対どこかにあるはずだ」と WEB でかなり検索したんですよ。 ところが見付かったものは、シェアウェアだったり NT Server 用だったり BIND そのものだったりしてなかなかいいものが見付かりません。

しかたなく、作り初めていよいよプログラムがほぼ完成し、名前を付ける段になって 「Windows 用の DNS サーバだから WinDNS にしよう」と、 名前がダブってないか念のため WEB で検索すると こちら の方に、欲しかったものそのものがありました。 がーん 前回と同じ轍を踏んで しまった...

その後調べると、 いろいろ あったみたいですね。 どうしてあの時見付からなかったんだろ? まっ経験値が上がったからよしとしましょう (そう考えないとやってられない)。


[戻る]