梅本です。

>>> Tue, 23 Feb 2010 19:19:47 +0900 の刻に「kazumi」、すなわち
>>> FURUSAWA Kazumi <kaz...@mse.biglobe.ne.jp> 氏曰く

kazumi> このロジックを見て、
kazumi> (1) gethostbyaddr()でホスト名を取得
kazumi> (2) ホスト名を得られなければ「?」とする
kazumi> (3) エントリを出力し、他のエントリのために(1)以降を繰り返す
kazumi> だと考えました。

あっています。

> resolv.conf の設定より、192.168.1.1 が DNS サーバのようですが、
> この DNS サーバは正しく返事を返すのでしょうか?

kazumi> LAN の中のホストは数台なので /etc/hosts だけで管理しています。
kazumi> /etc/nsswitch.conf では「hosts: files dns」としてあるので、
kazumi> LAN 内のマシンについては /etc/hosts の段階で解決できるだろうと期待しています。

hosts になければ DNS を引きにいきます。

kazumi> ただ 192.168.1.1 については、以下のような返事をします。

kazumi> % nslookup 192.168.1.1
kazumi> Server:         192.168.1.1
kazumi> Address:        192.168.1.1#53

kazumi> Non-authoritative answer:
kazumi> 1.1.168.192.in-addr.arpa        name = modemnv3-5b1294.

kazumi> Authoritative answers can be found from:

DNS サーバは存在して、返事を返すということですね。

kazumi> この例なら、
kazumi> 192.168.1.1 は、/etc/hosts の段階でホスト名が取得できた
kazumi> 192.168.1.26 は、/etc/hosts を見ても取得できないので DNS を参照したが
kazumi> それでも駄目だった
kazumi> と、動作するのだろうと思います。

ここまではあっています。
ここで、DNS で逆引きできなかった場合、gethostbyaddr() は本来
HOST_NOT_FOUND を返します。この時は、nflags は立てませんので、次のエン
トリ以降も gethostbyaddr() でホスト名を探します。

kazumi> そして次の 192.168.1.221 は、/etc/hosts に書いてあるので
kazumi> ホスト名が取得できる筈なのですが、それを使わずに DNS を見に行ってしまいます。

/etc/hosts を見ずに DNS を見に行ったというのは誤りです。
gethostbyaddr() 自体が呼ばれなくなります。つまり、どちらも参照していま
せん。
これは、nflag が立てられた、すなわち、 gethostbyaddr() が
HOST_NOT_FOUND ではなく、TRY_AGAIN を返したということです。
クエリに対して応答する DNS サーバに対するクエリで、gethostbyaddr() が
TRY_AGAIN を返しているということは、ご使用されている DNS サーバは、PTR
レコードがなかった際に、SERVFAIL を返していると推定できます。もしそうだ
とすると、DNS サーバとして挙動がおかしいように思います。
PTR レコードがない IP アドレスを nslookup で引いたときにどのように出力
されますか?
ちなみに、手元の BIND9 の DNS サーバで試してみましたが、PTR レコードが
なかった場合、NXDOMAIN を返します。arp -a の出力では、DNS で引けなかっ
たエントリは「?」となりますが、以降のエントリは、ホスト名が出力されます。

kazumi> テスト的に作ったプログラムで gethostbyaddr("192.168.1.221") を試すと
kazumi> /etc/hosts で指定したホスト名を返すので、
kazumi> そこに問題は無いだろうと思っているのですが・・・

arp は、DNS が使えなかったら無駄な DNS クエリを止めるというように想定さ
れていると思われます。ちょっとやりすぎじゃないかという気がしなくもない
ですが、/etc/hosts だけを見るという API はないので、gethostbyaddr() を
呼ぶこと自体を止めるようにしているのでしょう。

全く DNS を使用しない環境ということであれば、/etc/nsswitch.conf で
hosts エントリから dns を削除すれば、ご希望の動きになると思います。

--
梅本 肇 @ インターネット互助会横浜  http://www.imasy.org/~ume/
u...@mahoroba.org  u...@{,jp.}FreeBSD.org
プログラムは書いた人の意図ではなく書かれた通り動く  I hate Modula-3 :-)

メールによる返信