Linux Network Setting

普段、深く考えずに、ホスト名などを使ってアクセスしていますが、その裏では、 IP アドレスやホスト名を得るため、 DNS サーバに問い合わせたりなどという複雑な処理を、こっそりと行ってくださっていますよね。

DNS の場合、/etc/resolv.conf というファイルを変更しますと、振舞いなどを変えることができます。

Vol.021 - resolv.conf を触ってみよう
http://www.usupi.org/sysad/021.html

しかし、実際には、DNS だけでなく、/etc/hosts ファイルや NIS などを使って、解決しているところが多いのではないかと思います。

そして、まず DNS に問い合わせてほしいなとか、 /etc/hosts に重複して登録されていても問題ないようにしたいなとか、いろいろなご要望が存在するのではないかと思います。

そんなとき、/etc/host.conf というファイルを変更することで、振舞いを変えることができます。

もしニーズがなくても、この際ですから、いろいろ設定を知っておくと、そんなシチュエーションのときに、役立つのではないでしょうか。

というわけで今週は、host.conf の設定方法をご紹介したいと思います。

それでは、まず前半で、設定項目を一気にご紹介し、後半では、それらの動作確認をしてみたいと思います。

設定できる項目のうち、今回ご紹介するものを、以下に示します。

   order {bind,hosts,nisの順序の指定}
   multi {on|off}
   reorder {on|off}
   trim {ドメインの指定} 

spoof 関連は、きっちり動作確認できていませんので、申し訳ありませんが、今回はご紹介を見送りたいと思います。すみませんごめんなさい。

まずは、order です。
問い合わせる順序を指定します。指定できるのは bind(DNS), hosts, nis で、カンマ(,) で区切って複数指定します。(ひとつだけでも OK です。)
たとえば、

 order hosts,bind

と指定しますと、まず /etc/hosts を見に行き、解決しなければ DNS に問い合わせます。

…がしかし、今どきは /etc/nsswitch.conf の hosts の設定を見に行くようでして、 host.conf の order を変更しても反映されないようです。
ですが、古いディストリビューションやアプリケーションでは、こちらを参照することもありますので、 nsswitch.conf と同じ設定にしておいた方が無難だと思います。



次は、multi です。
/etc/hosts に IP アドレスが複数設定されていたときに、すべて返してもらうための設定です。
たとえば、/etc/hosts に、

 192.168.1.1      usugw.usu.usupi.org
 10.0.0.1         usugw.usu.usupi.org

と、usugw の IP アドレスが複数登録されているとき、host.conf に

 multi on

と書いておけば、両方の IP アドレスを返してくれます。
(multi の指定がなければ、最初の IP アドレスだけを返します。)



その次は、reorder です。
複数の IP アドレスが得られたときに、同じサブネット内のアドレスを、先に返してもらうための設定です。
たとえば、前述の /etc/hosts の場合、自分の IP アドレスが 10.0.0.2 だと、 host.conf に

 reorder on

と書いておけば、10.0.0.1 を先に返してくれるようになります。



そして最後に、trim です。
IP アドレスからホスト名を得たときに、trim で指定したドメインと一致すると、その部分を取り除いた名前を返すようにするための設定です。
コロン(:)やセミコロン(;)、カンマ(,)で区切ることで、複数のドメインを指定することもできます。
たとえば、192.168.1.1 のホスト名を問い合わせて、 usugw.usu.usupi.org が得られたとき、host.conf に

 trim .usu.usupi.org

と書いておけば、.usu.usupi.org を取り除いた usugw だけを返します。
ただし、この設定は、DNS にのみ効果があります。

さらっとした説明が終わりましたので、動作確認をしてみましょう。

…の前に、動作確認用の Perl スクリプトを、先にご紹介しておきます。
以下は、ホスト名から IP アドレスなどを得るためのスクリプトです。

 #!/usr/bin/perl
 while(my $host = shift) {
     my ($name, $aliases, $t, $l, @addrs) = gethostbyname($host);
     print "Name: $name\nAliases: $aliases\nAddresses: ";
     for my $addr (@addrs) {
         print join('.', unpack("C*", $addr)) . " ";
     }
     print "\n";
 }

これを、getaddr.pl という名前で保存しておいてください。
そして、IP アドレスからホスト名などを得るためのスクリプトです。

 #!/usr/bin/perl
 use Socket;
 while(my $addr = shift) {
     my ($name, $aliases, $t, $l, @addrs) =
         gethostbyaddr(inet_aton($addr), AF_INET);
     print "Name: $name\nAliases: $aliases\nAddresses: ";
     for my $addr (@addrs) {
         print join('.', unpack("C*", $addr)) . " ";
     }
     print "\n";
 }

これを、gethost.pl という名前で保存しておきましょう。



…ええっと、順番通りにいきますと、まずは order の動作確認をすべきなのですが、変更しても変わらないため、割愛させていただきます。



というわけで、まずは、multi です。
/etc/hosts に、以下のような設定を追加してみてください。

 192.168.1.1      usugw.usu.usupi.org
 10.0.0.1         usugw.usu.usupi.org

host.conf に multi の設定がない場合、

 % ./getaddr.pl usugw.usu.usupi.org
 Name: usugw.usu.usupi.org
 Aliases:
 Addresses: 192.168.1.1

IP アドレスは1つしか得られません。
ですが、host.conf に multi on の設定がある場合は、

 % ./getaddr.pl usugw.usu.usupi.org
 Name: usugw.usu.usupi.org
 Aliases:
 Addresses: 192.168.1.1 10.0.0.1

2つとも得られるようになります。



次に、reorder です。
自分のアドレスが 10.0.0.2 の場合でも、普通に問い合わせると、前述のように、 192.168.1.1 が先に得られます。
しかし、host.conf に reorder on の設定がある場合、

 % ./getaddr.pl usugw.usu.usupi.org
 Name: usugw.usu.usupi.org
 Aliases:
 Addresses: 10.0.0.1 192.168.1.1

10.0.0.1 が先に来るようになります。



そして最後に、trim です。
普通に、10.0.0.1 のホスト名を得ようとしますと、

 % ./gethost.pl 10.0.0.1
 Name: usugw.usu.usupi.org
 Aliases:
 Addresses: 10.0.0.1

usugw.usu.usupi.org という名前が得られます。
ここで、host.conf に、

 trim .usu.usupi.org

という設定を追加しますと、

 % ./gethost.pl 10.0.0.1
 Name: usugw
 Aliases:
 Addresses: 10.0.0.1

usugw だけになります。
(ちなみに、trim usu.usupi.org と設定すると、usugw. が返ります。)

以上、host.conf の設定方法と確認方法を、簡単にご紹介しました。


nsswitch.conf



コンピュータのホスト名から対応するIPアドレスやMACアドレスを割り出す,サービス名からポート番号を調べる,といったように,名前に関連づけられた値を割り出すことを名前解決といいます。/etc/nsswitch.confでは,名前解決の順序を指定します。

 ホスト名の名前解決にはDNSを使うのが一般的ですが,それ以外にも,/etc/hostsファイルに記述されたホスト名とIPアドレスを使う方法や,NIS(Network Information Service)を使う方法,LDAPを使う方法などがあります。このような複数の名前解決手段があっても,NSS(Name Service Switch)という仕組みによってどのような順番で利用するかを指定できます。NSSの設定ファイルが/etc/nsswitch.confです。

/etc/nsswitch.confの例

passwd: nis files
shadow: nis files
group: nis files
hosts: nis files dns
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
netgroup: files
publickey: files
automount: files
aliases: files

 左側の欄には名前解決データベースの種類を記述します。名称は,/etc以下のファイル名とほぼ同じになっています(例えば,hostsは/etc/hostsに対応します)。右側の欄には,名前解決の手段を優先度の高い順に記述します。files(/etc以下のローカルファイル),nis(NIS),dns(DNS),ldap(LDAP)などを指定することができます。

 この例では,ホスト名の名前解決(hosts:と書かれた欄で設定)には,最初にNISで検索が行われます。次にローカルファイル(/etc/hostsファイル),DNSの順で検索が行われます。問い合わせ先DNSサーバーのIPアドレスは,/etc/resolv.confで指定します。
最終更新:2012年04月11日 15:50