web-dev-qa-db-ja.com

tracerouteはどのように名前を解決しますか?

スクリプトを書いているときに、自分が指定したコンピューター名( "Selenium-rc"など)でマシンを参照したいと思いました。 "Selenium-rc"を使用してpingを実行できなかったため、次のコマンドを実行して名前が認識されるかどうかを確認しました。

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 Hops max, 52 byte packets
 1  Selenium-rc (192.168.235.41)  0.545 ms  0.241 ms  0.124 ms

さて、tracerouteは名前を「見つけました」。どうやって?次 ...

> traceroute Selenium-rc
traceroute: unknown Host Selenium-rc

うーん...ホストが不明であるため、ここでの検索メカニズムは異なる必要があります。最初の例ではtracerouteに固有のプロセスを使用していたのに対し、これはシステムの名前解決プロセスを使用していると想定しています。正しい?

それから、少し後で戻ってきたとき...

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 Hops max, 52 byte packets
 1  minint-q4e8i52.mycorp.net (192.168.235.41)  0.509 ms  0.206 ms  0.136 ms

わかりました、別の結果です。 "Selenium-rc"の名前はマシン自体では変更されませんでしたが、traceroute名前解決プロセスには何らかの優先順位を含める必要があり、ネットワーク上の別のシステム/サービスによって割り当てられた、おそらくより信頼できる結果が得られます。 (残念ながら、これは私が制御しない動的な名前であると想定しているため、スクリプトでは役に立ちません。)

誰かが結果を説明できますか?

11
Keith Bentrup

一般に、LinuxとUnixでは、tracerouteとpingの両方がgethostbyname()の呼び出しを使用してシステムの名前を検索します。 gethostbyname()は、システム構成ファイルを使用して、ネーミングデータベース(/ etc/hosts、DNSなど)を照会する順序を決定します。

Linuxでは、デフォルトのアクションは、最初にDNSを照会し、次に/ etc/hostsを照会する(または以前は使用されていた)ものです。これは、/ etc/Host.confで目的の順序を設定することにより、変更または更新できます。

DNSの前に/ etc/hostsを検索するには、/ etc/Host.confで次の順序を設定します。

order hosts,bind

Solarisでは、この同じ順序は、ホストデータベースのエントリの/etc/nsswitch.confファイルを介して制御されます。

ホスト:ファイルDNS

DNSを検索する前に/ etc/hostsを検索するように検索順序を設定します。

Tracerouteとpingはどちらも、これらの方法を使用して、構成されているすべてのネーミングデータベースを検索します。 HostコマンドとnslookupコマンドはどちらもDNSのみを使用するため、一貫性のないように見える結果が必ずしも複製されるわけではありません。

Solarisにはルックアップツールgetentがあり、これを使用して、tracerouteやpingと同じ方法でホストまたはアドレスを識別できます-構成されたネーミングデータベースのセットに従って検索します。

getent hosts <hostname>

/etc/nsswitch.confで、ホスト用にリストされているデータベースを検索します。

そう。あなたのケースでは、一貫した結果を達成するために、以下を/ etc/hostsに追加します

192.168.235.41 Selenium-rc

また、/ etc/Host.confに以下が含まれていることを確認してください。

order hosts,bind

または、/ etc/nsswitch.confに以下が含まれていることを確認します。

hosts: files dns

これが完了すると、ping、traceroute、およびssh、telnet、curl、wgetなどの他のコマンドの両方で、より一貫した結果が表示されます。

9
Tim Kennedy

逆ルックアップが適切に設定されているようですが、順方向ではありません。

システムはIPアドレス192.168.235.41を検索して、それがSelenium-rcであることを認識できますが、Selenium-rcを検索しようとすると失敗します。

/etc/hosts/etc/resolv.confを確認することをお勧めします。 getaddrinfoシステムコールの動作は後者によって決定され、前者を参照します。

2
Shadur

私の推測:traceroute 192.168.235.41は、IPアドレス192.168.235.41に対応する名前を見つけるためにDNS要求を送信しました。 traceroute -n 192.168.235.41は、見つかった各IPアドレスに対してDNSルックアップを行わずにtracerouteを開始する方法です。 DNSサーバーはDNSシステムが待機するよりも応答に時間がかかったため、最初にtracerouteは192.168.235.41のホスト名を提供しませんでした。 tracerouteが192.168.235.41からパケットを送受信するまでに、DNSサーバーが応答しているため、tracerouteはホスト名を提供できます。

それで、「DNSサーバーの問題」と言います。非常に便利なタイミングで、他のことを疑っていました。ここで「マーフィーの法則」を考えてください。少し後で戻ってきたときに、同じIPアドレスに別の名前が付けられているため、トレースルートを行っているときに誰かがDNSサーバーの設定をいじっていたのではないかと思います。

1
Bruce Ediger