【Ubuntu】SSH で接続できないときのチェックリスト

SSH 接続トラブルシューティング - known_hosts / 鍵 / Permission denied

この記事で解決できること

  • SSHで接続できないときに、原因を順番に切り分けできます
  • Permission denied (publickey)Host key verification failed の対処が分かります
  • 鍵ファイル・権限・known_hosts・sshd設定の"新人が詰まりやすい箇所"を避けられます

💡 結論(最短)

まずはこの順番で確認すると迷子になりにくいです。

  1. 接続先とポートが合っているか(DNS/IP、ポート22以外も)
  2. 鍵で失敗しているのかPermission denied (publickey)
  3. known_hostsで止まっているのかHost key verification failed
  4. サーバ側(sshd)が生きているかsystemctl status ssh / ログ)

目次

  1. 接続コマンドを明確にする
  2. -v で原因の手がかりを出す
  3. ケースA:Permission denied (publickey)
  4. ケースB:Host key verification failed
  5. ケースC:Connection timed out
  6. ケースD:Connection refused
  7. サーバ側ログで原因を確定する

⚠️ 前提(対象環境)

  • クライアント:Ubuntu(またはmacOS等でも考え方は同じ)
  • サーバ:Ubuntu(OpenSSH server)
  • 権限:必要に応じて sudo(サーバ側確認)

1. まず接続コマンドを明確にする(基本形)

$ ssh user@server.example.com

ポートを指定する場合(例:2222):

$ ssh -p 2222 user@server.example.com

鍵を指定する場合:

$ ssh -i ~/.ssh/id_ed25519 user@server.example.com

2. "まずこれ"で原因の手がかりを出す(-v)

エラーの切り分けは、詳細ログを出すのが最短です。

$ ssh -v user@server.example.com

さらに詳細(必要なときだけ):

$ ssh -vv user@server.example.com

ケースA:Permission denied (publickey)

意味:サーバは到達しているが、鍵認証で拒否されている

確認1:鍵ファイルが存在するか

$ ls -la ~/.ssh

確認2:鍵ファイルの権限(これが悪いと鍵が使えない)

一般的な目安:

  • 秘密鍵:600
  • .ssh ディレクトリ:700
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_ed25519

確認3:どの鍵を使っているか明示する

$ ssh -i ~/.ssh/id_ed25519 user@server.example.com

確認4:サーバ側に公開鍵が登録されているか

サーバ側で確認(ログインできる別経路がある場合や、コンソールから):

$ ls -la /home/user/.ssh
$ ls -la /home/user/.ssh/authorized_keys

権限の目安:

$ chmod 700 /home/user/.ssh
$ chmod 600 /home/user/.ssh/authorized_keys
$ chown -R user:user /home/user/.ssh

💡 公開鍵が authorized_keys に無いと、正しい鍵でも通りません。

ケースB:Host key verification failed

意味:"そのサーバは本当に前に接続したサーバと同じか?"の検証で止まっています。サーバ再構築やIP再利用でよく起きます。

対処(該当ホストのknown_hostsエントリを削除):

$ ssh-keygen -R server.example.com

IPで接続している場合:

$ ssh-keygen -R 203.0.113.10

その後、再接続して指紋を確認のうえ受け入れます。

ケースC:Connection timed out

意味:ネットワーク的に到達できていない(FW/SG/ルーティング/ポート違いの可能性)

確認1:DNSが引けているか

$ dig server.example.com +short

確認2:ポートが開いているか(22以外も)

nc がある場合:

$ nc -vz server.example.com 22

ポートが違う場合:

$ nc -vz server.example.com 2222

timed out は「そもそも繋がってない」ので、鍵以前の問題です。

ケースD:Connection refused

意味:サーバに到達しているが、SSHがそのポートで待ち受けていない可能性が高い

確認1:sshdサービスが動いているか

Ubuntuでは service名は ssh のことが多いです。

$ sudo systemctl status ssh

起動:

$ sudo systemctl start ssh

自動起動:

$ sudo systemctl enable ssh

確認2:待受ポートを確認

$ sudo ss -lntp | grep ssh

4. サーバ側ログで原因を確定する(journalctl)

サーバ側でログを見ると、ほぼ確定できます。

$ sudo journalctl -u ssh -n 200

直近だけ追う:

$ sudo journalctl -u ssh -f

Permission denied の理由(鍵が違う/ユーザー違い等)がログに出ることがあります。

⚠️ 事故らないための注意点

  • 知らない相手のHost Keyを雑に受け入れない(中間者攻撃のリスク)
  • 鍵の権限は厳しめが基本(秘密鍵が 600 でないと拒否されることがあります)
  • サーバ再構築した場合は known_hosts の不一致が起きやすい

📋 検証環境

本記事のコマンドは Ubuntu 24.04 LTS / bash 5.2 で動作確認済みです。

次に読む