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


11

スクリプトを書いているときに、自分が付けたコンピューター名( "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名前解決プロセスにはなんらかの優先順位を含める必要があり、ネットワーク上の別のシステム/サービスによって割り当てられた、おそらくより信頼できる結果が得られます。(残念ながら、これは私が制御しない動的な名前であると想定しているため、スクリプトでは役に立ちません。)

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

回答:


9

一般に、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などの他のコマンドの両方で、より一貫した結果が表示されます。


digユーティリティを使用して、resolv.confファイルにリストされているDNSサーバーを照会したところ、両方のエントリが見つかりました。tracerouteは完全に修飾されたものを好んだと思います。
Keith Bentrup、2011

2

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

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

私はあなたがチェックをお勧めします/etc/hosts/etc/resolv.conf; getaddrinfoシステムコールの動作は後者によって指示され、前者を参照します。


1

私の推測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サーバーの設定をいじっていたのではないかと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.