TOP > プログラマ2.0日報 > ワタシはダレ?

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

ワタシはダレ?

2007.09.05

今回はかなり微妙な話です。

「あなたのお名前は?」と聞かれれば、記憶喪失でもない限り、自分の名前を答えられるのが、当たり前の人間です。が...「コンピュータの名前」となると、かなり微妙な問題がいろいろある、というのに突き当たってしまいました。

UNIX 系ならば、「マシン名」は /etc/hostname に書かれているのがこれだ、と言えますし、Windows ならばレジストリに書いてあるはずです。ここで Java のような「プラットフォーム独立」を謳う処理系での問題を考えると、OS互換性の問題がありますから、何か「うまくラップしたかたちで、マシン名を拾えるようにする」というのが、方法論になります。

で、Java の場合、java.net.InetAddress#getLocalHost()が、起動マシンのマシン名を取得する手段になります。このメソッドは native メソッドなので実装詳細はよく分からないのですが、挙動から推測するに Linux の場合、gethostname(2)を呼び出す仕様になっているようです。gethostname(2)は実質的に /proc/sys/kernel/hostnameを読んでいるようです。ここらへん、強引に/proc/sys/kernel/hostnameを書き換えると、/bin/hostnameの出力とInetAddress#getLocalHost()の戻り値に影響が及びますから、そういう感じの実装でしょう。

/etc/hostsを書き換えるなど、いろいろ実験してみましたが、getLocalHost()の挙動はこんな感じで実装されているようです。

  1. 1.gethostname(2)を呼んでホスト名を取得する。
  2. 2.そのホスト名で、ネームサービスを呼んで、IPアドレスに解決する。この時ネームサービスの呼び出しがセキュリティ的に出来なければ、localhost を返す。 
  3. 3.解決されたIPアドレスから、もう一度ホスト名(ドメイン付きかも)に解決し、その最初のものを返す。

ですから、この戻り値はOSのホスト名解決のやり方にかなり依存します。LANをプライベートアドレスで運用している場合では、LAN内部でIPアドレスからホスト名に解決する時に、FQDN で解決することはフツーありませんから、プライベートアドレスで運用している時に、これが返すのは一般にドメイン付きではないでしょう。

JDKの古いバージョンですと、結構よくgetLocalHost()が「ループバックアドレスを返して困る...」という話があったようですが、今ではほとんどそういうことはないようです。勿論今でも、(非署名)Applet などでセキュリティ制限がかかるケースでは セキュリティ例外のハンドラの中でわざと localhost を返します。そういうことなので、まあ、一応OKなのかな?という気がしないでもないですが....

面白いことに、java.net.InetAddressには、getCanonicalHostName()というインスタンス・メソッドがあります。ここで、getLocalHost()で取得した「ローカルホストを表すInetAddress」を引数に渡して、このメソッドを呼ぶと、意外なことにこれが必ずしもgetLocalHost()のホスト名と一致するわけでもないのです。

ホントは、インターネットは「マシンの名前」なぞどうでもいい世界なのです。ですから、1つのIPアドレスに対して、複数の名前がエリアスで付く、というのは当たり前ですし、ですから、DNSの上での「C(ANONICAL)NAME」という概念があって、これがホストの「本名」に相当します。一見 Java の getCanonicalName()はこれを返すように見えて、実は全然そういうものではなかったりする...というのは、名前が悪いですね(実際には先ほどのgetLocalHost()みたいな流れで処理してます)。

しかも、「DNSの上のホスト名≠マシン名」という問題もあります。一台のマシンに、複数のネットワークカードを刺して運用する、というのは別に珍しいことでもありません。そうすると、DNSのホスト名はマシンなく、ネットワークカードのIPアドレス(これがカードのハードワイアドな識別子MACアドレスとLAN内部で結びつく)と対応しているわけです。「DNSのホスト名」はインターフェイスを識別するためのものであって、マシンを識別するためのものではない、ということなのですね。

これって、比喩的に言えば、「玄関から出て行った時にはAという名前で、勝手口から出て行ったときにはBという名前を名乗る人」みたいな状態のわけです(苦笑)。しかも、マシンの上から見たときには、「一度出て行って他人に聞かなければ、自分の名前が判らない!」ということにもなります...ここらへんが、かなりややこしいやり方でgetLocalHost()が自分の名前を解決しているベースのようですね。

あなたのお名前は何ですか?

投稿者 : 杉浦 こずえ | 投稿日時 : 2007.09.05 12:14

あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。

トラックバックURL


コメントの送信








カレンダー

<< 2007年09月 >>

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー