web-dev-qa-db-ja.com

SSHがこのホスト名を解決しないのはなぜですか?

storageという名前のネットワーク上のホストにSSH接続しようとすると、DNS解決エラーが発生します。

$ ssh storage
ssh: Could not resolve hostname storage: Name or service not known

しかし、ホストでDNSにクエリを実行すると、機能します

$ Host storage
storage has address 192.168.20.103

HostはIPを検出できますが、sshはそれを検出できないのはなぜですか?

13
jldugger

sshHostは、完全に異なるパスに従って名前を解決するため、特に解決する名前がFQDNでない場合(特に、どこでもFQDNを使用するように提案されている場合)、異なる結果が得られることは当然のことです。

OSとシステム構成については何も言わないので、Linuxを念頭に置いて、一般的に守らなければなりません。MacOSの詳細は多少異なり、Windowsはさらに異なりますが、一般的な概念は同じです。

  • HostはDNSを照会するため、基本的には/etc/resolv.confを調べてそこにリストされているサーバーを照会し、ホスト名が完全に修飾されていない場合はドメイン名を添付する可能性があります。他のすべての可能なソースを無視しますが、最近の多くのシステムは、他のDNSサーバーにクエリする前に/etc/hostsおよび他のソースを読み取るローカルキャッシングDNSサーバー(通常はdnsmasq)を実行しているため、Hostがそのローカルサーバーにクエリを実行すると、/etc/hostsが原因で侵入する可能性があることに注意してください。

  • sshは独自のパスに従います。 Linuxでのopensshの機能について説明します。他の実装は異なります。まず、設定ファイル(システム全体の/etc/ssh/ssh_configおよびユーザーごとの~/.ssh/config)で定義されたホストニックネームを探し、次にhosts:/etc/nsswitch.confディレクティブで指定された順序で他のソースを検索します。それは次のようなものだと言います:

    hosts: files dns
    

    つまり、/etc/hostsを調べてから、DNSをクエリします(/etc/resolv.confをもう一度)。その他の可能なソースは、廃止されたnisおよびnetinfoサービス、LDAP、Active Directoryなどです。

特定のケースをデバッグするには、sshの実装がたどるパスをたどり、どこに行き詰まっているかを調べる必要があります。

29
Dario