📡

SSH接続|「Resolver error: Error: ホスト名を解決できません」のエラーでSSH接続できない

    SSH接続

エラーの詳細

CUIでssh ユーザー名@ホスト名のようにSSH接続しようとしたら、下記のようなエラーが出る。

ssh: Could not resolve hostname *****: nodename nor servname provided, or not known

Visual Studio CodeのRemote - SSHプラグインで繋ごうとしても、下記のように似た意味のエラーが出る。

Resolver error: Error: ホスト名を解決できません

その時の~/.ssh/configは下記の通りです。

Host __[ホス名]__
    HostName __[ホス名]__
    User ユーザー名
    IdentityFile ~/.ssh/id_*****

ホスト名が正しく解決できていないので、DNSでホスト名とIPアドレスのペアを正しく解決できていない等の原因が考えられる。

エラーの原因と検証

Chat GPTに相談しつつ、エラーの原因と検証を行った流れをまとめておきます。

想定できるエラーの原因

  • .ssh/configの記述ミス
  • ssh ユーザー名@ホスト名で打ったコマンドのスペルミス
  • VPN接続ができていないからDNS解決できない可能性
  • /etc/hostsファイルに記載している内容が間違っている
  • リモートのサーバーのDNSの問題

スペルミスやVPNは確認すれば済みますが、結局のところサーバーのDNSの問題であれば、先方や社内インフラチームに問い合わせるか、IPアドレスで直接繋げる等の対処が必要。

ちなみに筆者は、スペルミスでもなくVPNも問題なく繋げられていました。他のCUIで検証しても結果は変わらず。

DNSの問題と仮定して、IPアドレスで直接繋げるパターンが一旦妥当な対処法だったので、その流れをまとめておきます。

エラーの解消

そもそも、DNSをリモートサーバーで正しく解決できるのかを、下記のコマンドを使って確かめます。

nslookup [オプション] [ホスト名またはIPアドレス]

これを叩くと下記のように返ってきます。

Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   example.com
Address: 000.00.00.000

これで一応DNS上で正しく解決されてはいることが確認できます。筆者はそれでもホスト名を使って接続できてませんでした...結局下記の方法を試して解決しています。

.ssh/configを修正するパターン

Host __[ホス名]__
    HostName __[ホス名]__
    User ユーザー名
    IdentityFile ~/.ssh/id_*****

現状上記となっているところを、下記のように修正。

Host __[ホス名]__
    HostName __[IPアドレス]__
    User ユーザー名
    IdentityFile ~/.ssh/id_*****

ここで.ssh/configの各プロパティについて一応振り返っておく。

Host 設定するホスト名のエイリアス(ニックネーム)
    HostName 実際のホスト名またはIPアドレス
    User 接続に使用するユーザー名
    Port 接続に使用するポート番号
    IdentityFile 使用するSSH鍵ファイル

HostNameにIPアドレスを打てば、IPアドレスで繋ぎに行ってくれるので、筆者は一旦これで無事に繋げられました。

/etc/hostsファイルでホスト名で繋げられるように調整

/etc/hostsは特定のホスト名がDNSで解決できない場合や、ローカルで独自にホスト名を設定したい場合に、下記のようにホスト名とIPアドレスのペアを書くことで、DNSを通さずにホスト名を使って直接繋げられる。

# __[IPアドレス]__ ホスト名
000.000.0.00 myserver.local

こちらにペアで記載することで、ssh接続時にそのホスト名を使って直接繋ぎにいけます。