私は以下を持っています/etc/hosts
ubuntu 12.04マシン上のファイル
127.0.0.1 localhost
10.248.27.66 ec2-50-112-220-110.us-west-2.compute.amazonaws.com puppetmaster
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
ただし、Hostコマンドは名前puppetmaster
を正しく解決しませんが、telnetコマンドは解決します
root@ip-10-248-34-162:/home/ubuntu# Host puppetmaster
Host puppetmaster not found: 3(NXDOMAIN)
root@ip-10-248-34-162:/home/ubuntu# telnet puppetmaster 8140
Trying 10.248.27.66...
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.
Hostコマンドが/ etc/hostsのエントリを解決しないのはなぜですか?
Host
プログラムはlibresolv
を使用して直接DNSクエリを実行します。つまり、gethostbyname
を使用しません。
ほとんどのプログラムは、別のホストに接続しようとするときに、gethostbyname
システムコールまたは同様の関数を呼び出します。この関数は、/etc/nsswitch.conf
の構成に従います。このファイルには、Ubuntu 12.04ではデフォルトで次の行が含まれています。
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
つまり、最初に/etc/hosts
を使用し、次にDNSクエリにフォールバックします。
この方法でホスト検索を実行する場合は、getent hosts
を使用してこれを実行できます。例えば:
$ getent hosts serverfault.com
198.252.206.16 serverfault.com
これがお役に立てば幸いです。
Host
ユーティリティはDNSルックアップユーティリティ専用であるためです。
ほとんどのアプリケーションは、ライブラリ呼び出しgetaddrinfo
またはgethostbyname
を使用します。これらのライブラリは、/etc/nsswitch.conf
というファイルに問い合わせて、さまざまなルックアップを実行する方法のルックアップの優先順位とポリシーを決定します。
通常、/etc/nsswitch.conf
には次の行が含まれます
hosts: files dns
これは、最初に/etc/hosts
に問い合わせを行い、失敗した場合はDNSに問い合わせるようにプログラムに指示します。
ホストはDNSルックアップのみを行うため、/etc/hosts
を覗いてルックアップを行うことはありません。
Dig
とnslookup
はHost
と同じように動作することがわかります。
これは、これらすべてのコマンドの目的がDNSルックアップを行うことであり、ファイルを調べることではないためです。
他のほとんどのプログラムは、オペレーティングシステムの名前リゾルバを使用して、/etc/nsswitch.conf
次に(必要な場合)/etc/resolv.conf
は、要求しているホスト名を解決する方法を決定します。 (これは単純化であり、他のオプションがあります。)nsswitch.conf
ファイルは通常、DNSではなくローカルファイルを優先します。