ワタシはダレ?
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.gethostname(2)を呼んでホスト名を取得する。
- 2.そのホスト名で、ネームサービスを呼んで、IPアドレスに解決する。この時ネームサービスの呼び出しがセキュリティ的に出来なければ、localhost を返す。
- 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のトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。





