夜間にサーバーが応答しなくなって、焦りながら原因を探した経験はないでしょうか。
SSH接続が失敗する原因は複数あります。ファイアウォール、sshdの停止、鍵のパーミッション、sshd_configのAllowUsers制限など、原因は様々ですが、どれも同じ「接続できない」というエラーで現れます。手当たり次第に設定を触るのは逆効果です。
この記事では、クライアント側の詳細ログを取得する
ssh -vvv と、サーバー側の有効設定を出力する sshd -T を組み合わせた、体系的な切り分け手順を解説します。動作確認環境: RHEL 9.4 / Ubuntu 24.04 LTS
この記事のポイント
・ssh -vvvで接続試行の詳細ログを確認できる
・sshd -Tでサーバーの有効な設定値を即確認できる
・「connection refused」はポートとsshdの起動状態を最初に確認
・鍵認証失敗は~/.ssh/authorized_keysのパーミッションが原因なことが多い
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SSH接続失敗の全体像 — エラーの種類と調査の起点
SSH接続が失敗した時、まずエラーメッセージの種類で大まかな原因を絞り込みます。・connection refused:ポート22番がブロックされているか、sshdが起動していない
・connection timed out:ファイアウォール(iptables/firewalldのDROP)かネットワーク経路の問題
・Permission denied (publickey):鍵認証の設定ミスか、AllowUsers/DenyUsersによる制限
・Host key verification failed:known_hostsの不一致(サーバー再構築後など)
エラーの種類が分かっても、それだけでは「どこ」が原因かまでは特定できません。
クライアント側(自分のPC)とサーバー側の両方を調査する必要があります。
この2方向の調査を同時に進められるのが、
ssh -vvv と sshd -T の組み合わせです。
クライアント側の調査 — ssh -vvvで詳細ログを取る
ssh -vvv は、SSH接続の各フェーズで何が起きているかを段階的に出力します。-v で基本ログ、-vv でネゴシエーション詳細、-vvv で最も詳細なデバッグ情報が得られます。1. ssh -vvvの実行方法と出力の読み方
普段のssh コマンドに -vvv を追加するだけです。# 自分のPC(クライアント)で実行する ssh -vvv user@192.168.x.x # ポートを指定する場合 ssh -vvv -p 2222 user@192.168.x.x # 鍵ファイルを明示する場合 ssh -vvv -i ~/.ssh/id_ed25519 user@192.168.x.x
2. connection refusedが出た時
# connection refused の場合の出力例 OpenSSH_8.7p1, OpenSSL 3.0.7 20 Sep 2022 debug1: Reading configuration data /home/user/.ssh/config debug2: resolve_canonicalize: hostname 192.168.x.x is address debug1: Connecting to 192.168.x.x [192.168.x.x] port 22. debug1: connect to address 192.168.x.x port 22: Connection refused ssh: connect to host 192.168.x.x port 22: Connection refused
原因の候補は2つです。
・sshdが停止している
・sshdは別のポートで動いている
サーバー側(コンソールまたは別の手段でログイン済みの状態)で以下を確認します。
# sshdの起動状態を確認 sudo systemctl status sshd # sshdが実際にリッスンしているポートを確認 sudo ss -tlnp | grep sshd
ss コマンドでポート確認をする詳細は、Linux ポート確認の全コマンド(ss・lsof)も参考にしてください。3. connection timed outが出た時
# タイムアウトの場合の出力例 debug1: Connecting to 192.168.x.x [192.168.x.x] port 22. debug1: connect to address 192.168.x.x port 22: Connection timed out ssh: connect to host 192.168.x.x port 22: Connection timed out
ファイアウォールがDROPルール(パケットを黙って捨てる)で動いている時にこの症状が出ます。REJECTルールなら即座にconnection refusedになります。
自分のPC(クライアント)から確認できることとして:
# まず疎通確認(ICMPが通るか) ping 192.168.x.x # ポートが開いているかtelnetで確認(22ポートに接続を試みる) telnet 192.168.x.x 22 # 繋がれば『SSH-2.0-OpenSSH_8.7』のようなバナーが返る # タイムアウトすればfirewallのDROPルールが疑われる
4. Permission denied (publickey)が出た時
# 鍵認証失敗の場合の出力例(-vvvの末尾部分) debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Trying private key: /home/user/.ssh/id_rsa debug3: no such identity: /home/user/.ssh/id_rsa: No such file or directory debug1: Trying private key: /home/user/.ssh/id_ed25519 debug3: sign_and_send_pubkey: no mutual signature supported debug2: we did not send a packet, disable method debug1: No more authentication methods to try. user@192.168.x.x: Permission denied (publickey).
ssh -vvv がどの秘密鍵を試したかを明示してくれます。・no such identity:秘密鍵ファイルが存在しない
・sign_and_send_pubkey: no mutual signature supported:暗号アルゴリズムの不一致(古いOpenSSHのサーバー側でRSA+SHA-1が無効化されている)
・鍵ファイルは見つかったが認証失敗:サーバー側の authorized_keys の問題
どの秘密鍵を試みたかが分かれば、サーバー側の設定確認に進めます。
サーバー側の調査 — sshd -Tで有効な設定を確認する
sshd -T は、sshd_config のすべての設定を「実際に適用される値」で出力します。コメントアウトされた行やデフォルト値も含めた「最終的な有効設定」が確認できるため、設定ファイルを目読するより確実です。
1. sshd -Tで全設定を出力する
# サーバー側(rootまたはsudo可能なユーザーで実行) sudo sshd -T # よく確認する項目だけgrepで絞り込む sudo sshd -T | grep -E 'port|listenaddress|permitrootlogin|pubkeyauth|passwordauth|allowusers|denyusers|maxauthtries'
port 22 listenaddress 0.0.0.0 listenaddress :: permitrootlogin prohibit-password pubkeyauthentication yes passwordauthentication no maxauthtries 6 allowusers admin deploy
allowusers admin deploy が設定されているため、admin と deploy 以外のユーザーはSSH接続できません。sshd_config を直接読んだだけでは、インクルードファイル(
Include /etc/ssh/sshd_config.d/*.conf)の内容が把握しづらいですが、sshd -T はそれも統合して出力してくれます。2. sshd -tで設定ファイルの構文をチェックする
設定を変更した後は、sshdを再起動する前に必ず構文チェックを実施します。# 設定ファイルの構文チェック(エラーがなければ何も出力されない) sudo sshd -t # エラーがある場合の出力例 /etc/ssh/sshd_config: line 34: Bad configuration option: AllowUsers2
sshd -t でエラーが出た状態でsshdを再起動すると、sshdが起動しなくなります。リモートからの唯一の接続手段を失うことになるため、設定変更後は必ずsshd -tを実行してから再起動してください。
3. AllowUsers/DenyUsersの確認
AllowUsersはよく見落とされます。sshd -T で確認するのが最速です。# AllowUsers/DenyUsers の設定を確認 sudo sshd -T | grep -i 'allowusers\|denyusers\|allowgroups\|denygroups' # 出力がなければ制限なし(全ユーザーがSSH可能) # allowusers admin → admin だけがSSH可能 # 自分のユーザー名を確認 whoami
AllowUsers を追記するか、既存の設定を修正する必要があります。よくある原因と対処方法
1. sshdが起動していない、またはポートが違う
# sshdの状態確認 sudo systemctl status sshd # sshdが停止していれば起動 sudo systemctl start sshd # 自動起動の有効化 sudo systemctl enable sshd # sshdが実際にリッスンしているポートと設定されたポートを比較 sudo sshd -T | grep '^port' sudo ss -tlnp | grep sshd
2. ファイアウォール(firewalld/iptables)によるブロック
# firewalldの場合 sudo firewall-cmd --list-services sudo firewall-cmd --list-ports # sshサービスが含まれていれば許可済み # 含まれていなければ追加 sudo firewall-cmd --add-service=ssh --permanent sudo firewall-cmd --reload # iptablesの場合 sudo iptables -L INPUT -n -v | grep -E 'dpt:22|ssh'
サーバー内のfirewalldを確認する前に、クラウドコンソール側のインバウンドルールも必ず確認してください。
3. 鍵認証の設定ミス(パーミッション問題)
SSHの鍵認証は、ファイルのパーミッションに厳格です。少しでも緩いと「安全ではない」として自動的に無効化されます。# サーバー側のパーミッション確認と修正 # ~/.ssh ディレクトリ: 700が必須 chmod 700 ~/.ssh # authorized_keys ファイル: 600が必須 chmod 600 ~/.ssh/authorized_keys # ホームディレクトリの所有者を確認(他人が書き込めるとNG) ls -ld ~ # sshdのエラーログでパーミッション問題を確認 sudo journalctl -u sshd | tail -20
# 以下のエラーログが出た場合は鍵のパーミッションが原因 Authentication refused: bad ownership or modes for directory /home/user/.ssh
4. SELinuxによるブロック
非標準ポート(22番以外)でsshdを動かす場合、SELinuxの設定変更が必要です。# SELinuxの状態確認 getenforce # SSHに許可されているポートを確認 sudo semanage port -l | grep ssh # 出力例: # ssh_port_t tcp 22 # 非標準ポート(例:2222)を追加する場合 sudo semanage port -a -t ssh_port_t -p tcp 2222 # SELinuxの拒否ログを確認 sudo ausearch -c 'sshd' --raw | tail -20
SSH障害を「調査してなんとなく解決」ではなく、「なぜそうなるか」を理解する力を身につけませんか?
ssh -vvvとsshd -Tの使い方は分かった。でも「なぜこの切り分け順序が重要なのか」まで説明できると、現場での信頼が違います。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、RHEL10対応の2日間ハンズオンセミナーを開催しています。
「まずはLinuxの基礎から体系的に学びたい」という方には、『Linuxサーバー構築入門マニュアル(図解60P)』を無料でプレゼントしています。こちらから無料ダウンロード。
切り分けフロー — 障害パターン別の診断手順
SSH接続失敗の切り分けは、以下の順番で調査するのが効率的です。・ステップ 1: 自分のPCで
ssh -vvv を実行し、エラーの種類を確認する・ステップ 2: connection refused → ステップ 3へ / timed out → ステップ 4へ / Permission denied → ステップ 5へ
・ステップ 3(connection refused):サーバー側で
sudo systemctl status sshd と sudo ss -tlnp | grep sshd・ステップ 4(timed out):
sudo firewall-cmd --list-services または sudo iptables -L INPUT -n・ステップ 5(Permission denied):
sudo sshd -T | grep allowusers と ls -la ~/.ssh/・共通:
sudo journalctl -u sshd -n 30 でsshdのエラーログを確認する| エラー | まず確認すること | コマンド(サーバー側) |
|---|---|---|
| connection refused | sshdの起動状態 | sudo systemctl status sshd |
| connection refused | sshdのリッスンポート | sudo ss -tlnp | grep sshd |
| timed out | ファイアウォールの状態 | sudo firewall-cmd --list-services |
| Permission denied | AllowUsersの設定 | sudo sshd -T | grep allowusers |
| Permission denied | 鍵のパーミッション | ls -la ~/.ssh/ |
| 全エラー共通 | sshdエラーログ | sudo journalctl -u sshd -n 30 |
本記事のまとめ
SSH接続の切り分けは、クライアント側とサーバー側の2方向から同時に調査するのが基本です。ssh -vvv で「どのフェーズで失敗したか」を特定し、sshd -T で「サーバーが実際に適用している設定値」を確認する。この2つのコマンドを使いこなせれば、大半の障害は数分以内に原因を絞り込めます。| 確認コマンド | 目的 | 実行場所 |
|---|---|---|
ssh -vvv user@host |
接続フェーズごとの詳細ログ | 自分のPC |
sudo sshd -T |
有効な設定値を全出力 | サーバー側 |
sudo sshd -t |
設定ファイルの構文チェック | サーバー側 |
sudo sshd -T | grep allowusers |
ユーザー制限の確認 | サーバー側 |
sudo ss -tlnp | grep sshd |
リッスンポートの確認 | サーバー側 |
sudo journalctl -u sshd -n 30 |
sshdのエラーログ | サーバー側 |
SSH障害の切り分けができるエンジニアは、サーバー構築の「型」を知っている
障害リカバリの速さは、「どこを最初にみるか」の経験値で決まります。この記事の切り分けフローはRHEL10対応の2日間ハンズオンセミナーで直接演習できます。
3,100名以上を指導してきた講師が、ネットで調べても分からない「現場の型」を直接伝授します。
まずLinuxの基礎から固めたい方には、『Linuxサーバー構築入門マニュアル(図解60P)』を無料でプレゼントしています。こちらから無料ダウンロード。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:killできないプロセスとゾンビプロセスの調査・対処|Dステート・defunctの見分け方と安全な解消手順
- この記事の属するカテゴリ:Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます