梅本です。 >>> 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 :-)