[Linux] ネットワークの設定確認 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

運用しているサーバーで突然ホストベース認証がうまく機能しなくなったので原因を調べていたのですが、どうもサーバーのネットワークの設定を変更した事による影響だったようです。

ホストベース認証の設定方法については、こちら


ホストベース認証では、クライアント側とサーバー側でホストの設定を同様に設定しておかないとうまくいきません。

ホストの設定と言うのは、クライアント側のホスト名とサーバー側のホスト名の名前解決が同一であるように設定しておく必要があるということです。


Linux/Unixにおいてサーバーのホスト名(またはFQDN)から名前解決する手順は、まず/etc/host.conf内に定義されている名前解決方法の順序を読み込みます。

host.confには、下記のように定義されています。


order hosts,bind

これは、まず指定されたホスト名をhostsファイル内で名前解決できるか試し、できなかった場合は、DNSに問い合わせるという名前解決の順序を定義しています。
DNSの名前解決を優先させる場合は、書く順序を逆に指定します。


次に、hosts.confでhostsを先に指定していた場合、/etc/hostsファイルが読み込まれます。

hostsファイルは、下記のように定義されています。


127.0.0.1 localhost.localdomain localhost
192.168.0.100 foo.hogehoge.com foo

これにより、「foo」と指定しただけでも、このサーバー内では「192.168.0.100」というIPが正引きできます。

一つ注意すべき事は、IPに対して複数のホスト名を記述する事はできるわけですが、一番左(IPアドレスのすぐ右隣)に書いたホスト名が正式なホスト名とされる特性がある事です。

この順番が、サーバー間で異なるだけで逆引きされた場合のホスト名の結果が異なると言う事がおきます。

127.0.0.1は自分自身をさすループバックアドレスです。

ホスト名では、localhostと定義される事が多いです。

つまり、localhostと指定して通信すると自分自身に対して通信します。


hostsファイルで名前解決できなかった(指定したホスト名がhostsファイルに記載されていない)場合はDNSへ問合せが行われます。

(host.conf内でbindがhostsより先に記載されていた場合、こちらの処理が優先的に行われます)

DNSサーバーの設定は、/etc/resolv.confに記載されています。

resolv.confは、下記のように定義されています。


nameserver 192.168.0.200
nameserver 192.168.0.201
search hogehoge.com

nameserverに続くIPアドレスが、DNSサーバーのIPアドレスです。

複数書く事もでき、その場合は上から順に問合せが行われます。

searchに記載したドメインは、検索するドメイン名を指定します。

これは、ホスト名が省略して指定された場合に、指定されたホスト名に、search以降のドメインを追加して検索を行います。

例えば、fooというホスト名だけを指定した場合、「foo.hogehoge.com」として名前解決が行われます。


さて、このような順番でサーバー上で指定されたホスト名(またはFQDN)は名前解決されていくわけですが、一部のファイルの設定にミスがあった場合、うまく名前解決が行われません。

このような場合に、サーバー上で指定したホスト名はどのように名前解決されているのか調べたいのですが、これを完全に行ってくれるコマンドがどうも存在しないようです。

nslookupやdigコマンドではDNSに対して名前解決を行います。

hostsファイル内は見てくれません。

host.confに指定された順番どおりに、hostsファイルやDNSをみてくれて結果を返してくれるコマンドが無いわけです。

解決の順番は、先ほど述べた通りなのですが、どこかにミスがあったり読み間違えたらいったいこの名前解決は、hostsファイルで行われたものなのか、DNSで行われたのかを調べる事ができないわけです・・・。


私自身が、先に述べたホストベース認証がうまくいかなくなった原因を調査するためにこのような各サーバー上での名前解決の状況を調べたかったのですが、それを行うコマンドがなかったため、PHPのプログラムで代替手段を用意しました。

マニュアルに載っているそのままのサンプルなのですが



□ 正引き(ホスト名からIPアドレスを調べる)したい場合


<?php
$ip = gethostbyname('foo.hogehoge.com');
echo $ip;
?>

これで、サーバー上で「foo.hogehoge.com」が名前解決された場合のIPアドレスを取得する事ができます。



□ 逆引き(IPアドレスからホスト名を調べる)したい場合


<?php
$hostname = gethostbyaddr('192.168.0.100');

echo $hostname;
?>

これで、サーバー上で「192.168.0.100」に対するホスト名を取得する事ができます。

これらのプログラムをサーバー上で実行し、結果を見比べ結果が異なる場合はどこかの設定ファイルがおかしい事になります。