SSHで接続できない時の切り分け手順|ssh -vvvとsshd -Tでクライアント・サーバー両面から原因を特定する

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxトラブルシューティング > SSHで接続できない時の切り分け手順|ssh -vvvとsshd -Tでクライアント・サーバー両面から原因を特定する
「sshで接続できない」「connection refusedとしか出ない」
夜間にサーバーが応答しなくなって、焦りながら原因を探した経験はないでしょうか。

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のパーミッションが原因なことが多い


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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 -vvvsshd -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

「port 22: Connection refused」は、ポート22番へTCPパケットは届いているが、応答するプロセスがないことを意味します。
原因の候補は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 が設定されているため、admindeploy 以外のユーザーは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」の出力に自分のユーザー名が含まれていなければ、sshd_config に 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'

クラウド環境(AWS EC2やAzure VMなど)では、サーバー内のファイアウォールに加えてセキュリティグループやNSGでもブロックされる場合があります。
サーバー内の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

ホームディレクトリのパーミッションが755でも、グループが書き込み可能な場合は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

SELinuxが効いている環境(RHEL 9のデフォルトはEnforcing)で非標準ポートを使う場合は、firewalldとSELinuxの両方を設定しないとSSH接続できません。

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 sshdsudo ss -tlnp | grep sshd
・ステップ 4(timed out):sudo firewall-cmd --list-services または sudo iptables -L INPUT -n
・ステップ 5(Permission denied):sudo sshd -T | grep allowusersls -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
ホスト名で接続する場合は、DNS解決の失敗も切り分け対象の一つです。digコマンドでDNSを調べることで、ホスト名が期待するIPアドレスに解決されているか確認できます。

本記事のまとめ

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)』を無料でプレゼントしています。こちらから無料ダウンロード

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。