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
はそれを検出できないのはなぜですか?
ssh
とHost
は、完全に異なるパスに従って名前を解決するため、特に解決する名前が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
の実装がたどるパスをたどり、どこに行き詰まっているかを調べる必要があります。