SSHができない時の原因と対処法
別のマシンにSSHしようとしたら繋がらない!というトラブルはよく起こります。
ここではSSHできない原因や調査方法、トラブル例を紹介します。
ここのトラブルシューティング集ではこれまでSSHできていた→SSHできなくなったという状態を仮定しています。基本は接続できなかった時の表示やログを見て調べましょう。
- インターネットは接続されてるか?(物理的に無線LAN、ケーブル刺さってるか?)
- 対象のホスト名・IPアドレスは正しいか?
- ルーティング設定は正しいか?
- リモートホストは起動しているか?
- リモートホストのsshdは起動しているか?
- ファイアウォールで許可されているか?(firewalld, iptables)
物理的なトラブルは起きていないか?
意外と見落としがちなのが物理的なトラブルです。今まで正常だったのにいきなりできなくなったというときは物理関係を疑ってみるのも重要です。ハードウエアの故障(ルーター、スイッチ、NIC)も起こりえます。物理的なトラブルはSSHに限らず他の部分にもトラブルを起こしているはずなので気づくのは早いと思います。
- マシンは起動してるか?(目視や管理ツール)
- ルータやスイッチトラブルは起きていないか?(tracerouteでパケットの到達を確認)
- 自分のマシンはネットワークに接続しているか?
人為的なミス
よくあるミスはリモートログイン先のIPアドレスを間違えているという単純なミスです。数字なので間違っていることに気付きににくいです。自分が接続しようと思っていた接続先を勘違いしていることもあります。初歩的ですが確かめましょう。
- 今接続しようとしているホストが接続したいホストか?
- 接続先のIPアドレスやホスト名は正しいか?ポート番号はあっているか?(22では無い時もある)
- 今いるホストは正しいホストか?(多段SSHの場合)
- 指定した秘密鍵は正しいか?パスフレーズやパスワードは正しいか?
ネットワークトラブル
物理的なトラブルが起きたり、アップデートや再起動などが原因で設定が変わってネットワークトラブルが起こることがあります。
ネットワークトラブルは関係するサーバーだけでなく、ルータやスイッチ、ネットワークケーブルなどのトラブルを考慮しましょう。
トラブルシューティング
ネットワークに接続してるか?
自分のマシンがネットワークにつながっていなければ話になりません。無線LANに接続していないとか、特定のLANに接続しているのか?を確認しましょう。ケーブルが外れかかっているということもよくあります。
sshdは起動しているか?
接続先のマシンがアップデートや再起動をしていた場合sshd(デーモン)が起動していない場合があります。その場合はstatusでsshdの起動状態を確認し、起動していない場合はstartで起動します。
systemctl status sshd
systemctl start sshd
再起動時に自動起動させたい場合は以下のように設定します。
systemctl enable sshd
接続先のポートを確認
SSH以外でログインできる場合(直接やVNCなど)はポートの情報を確認しましょう。netstatコマンドでsshdが使用しているポートを確認しましょう。ポートが変更されている場合はポート番号が22から変更されているのが確認できます。また、listen状態(接続待ち)でないと接続できません。
# netstat -altpn
firewallに拒否されていないか?
firewalldやiptablesの設定が変更されていないか?起動していなかったものが起動している場合もあります。
systemctl status firewalld
systemctl status iptables
で起動状態を確認しましょう。サービスやポートの通信が拒否されていないか確認しましょう。問題が無ければfirewallの設定を一時的に停止していみる方法もあります。
SSH設定の確認
SSHの設定関連を確認しましょう。/etc/ssh/ssh_configを確認します。
- 公開鍵認証の場合秘密鍵は正しいか?
- パスワード認証の場合パスワードは正しいか?
- 使用するポートは正しいか?
SSHの秘密鍵のパーミッションの確認 id_rsa
秘密鍵は重要な情報なので秘密鍵は所有者以外は読み書きできない設定にする必要があります。
秘密鍵が600または400のパーミッションになっているか確認しましょう。
chmod 600 id_rsa
.sshディレクトリのパーミッション
秘密鍵がおいてある.sshディレクトリはパーミッションを700に設定します。
原因を探る方法
まずはssh接続を試した際に出てくるエラー文をしっかりと読むのが大事です。
pingやtraceruoteを使う
ネットワークの疎通を確認する簡単な方法はpingを飛ばすことです。pingが不達であればネットワークトラブルが起きている可能性があります。tracerouteではpingが経由するサーバーを追うことができます。
sshデバッグモードを使う
ssh -vのオプションを使うと接続過程のログが表示されます。実際にvオプションを使ってみた画面です。最終的にconnection refused(接続拒否)されています。
/var/log/secure (RedHat系) または /var/log/auth.log (debian)