エラーの詳細
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接続時にそのホスト名を使って直接繋ぎにいけます。