Cisco SSHが接続できない原因と切り分け手順|公開鍵・transport input設定の落とし穴【実機検証】

Cisco SSH接続が失敗する6つのチェックポイント — ネットワーク疎通、VTY設定、鍵生成、ドメイン名、AAA、SSHアルゴリズムの落とし穴

深夜のメンテで「あれ、SSHだけ繋がらない…」って状況、ネットワークエンジニアなら一度は経験してるはず。pingは通る、機器のシリアルからは入れる、でもSSHだけがNG。これ、最初めちゃくちゃ困るんですよ。

この記事では、CiscoのSSH接続が失敗する典型パターンを機器側クライアント側に分けて整理し、実機で確認したCLIコマンドベースで切り分け手順をまとめます。最後に「aborted error status 0」など現場でよく見る具体的なエラーメッセージへの対処もセットで載せておきます。

まず症状を切り分ける:どこまで通っているか

SSHが繋がらない時の典型症状パターン

SSHが通らない、と一括りにしても症状は色々。まずは下のテーブルで自分のケースがどれかを当てはめてください。当てはめただけで原因の半分は絞れます。

症状疑うべき原因最初に打つコマンド
pingも通らないL3疎通・ACL・経路show ip route / show access-lists
pingは通るがSSHだけNGVTY設定 / SSHサービス未起動show ip ssh / show line vty 0 4
“Connection refused” が即返るcrypto key 未生成 / SSH無効show crypto key mypubkey rsa
“no matching key exchange method”クライアント・機器でアルゴリズム不一致show ip ssh (ver表示)
“aborted, error status 0”認証即切断 / login local 不整合show users / debug ip ssh
パスワード弾かれるAAA / username設定ミスshow run | sec aaa / username
💡 現場での体験談

以前、客先の保守でCatalyst 9300を入れ替えた直後、運用端末からSSHだけが通らなくて30分くらい唸ったことがあります。pingはOK、Telnetも通る。原因は「transport input telnetのままになっていて、SSHを許可してなかった」だけ。コンフィグレビューを横着すると、こういうので30分溶かします。ぶっちゃけVTYの設定見るのが最速です。

機器側でまず確認する5つの設定

show ip ssh と show running-config で確認するポイント

CiscoのSSHは、ただ ip ssh version 2 と書けば動くわけじゃない。前提として「ホスト名」「ドメイン名」「RSA鍵」の3点セットが必要で、ここのどれか1つでも欠けてると沈黙します。

Step 1: SSHサービス自体が有効か
Switch# show ip ssh
SSH Enabled - version 2.0
Authentication methods:publickey,keyboard-interactive,password
Authentication Publickey Algorithms:x509v3-ssh-rsa,ssh-rsa
Hostkey Algorithms:x509v3-ssh-rsa,ssh-rsa
Encryption Algorithms:aes128-ctr,aes192-ctr,aes256-ctr
MAC Algorithms:hmac-sha2-256,hmac-sha2-512,hmac-sha1
KEX Algorithms:diffie-hellman-group-exchange-sha1,...

これで SSH Disabled - version 2.0 と出たら、サービスが立ち上がってない。たいていは鍵未生成です。

Step 2: hostname / ip domain-name / RSA鍵
Switch(config)# hostname CORE-SW01
CORE-SW01(config)# ip domain-name example.local
CORE-SW01(config)# crypto key generate rsa modulus 2048
The name for the keys will be: CORE-SW01.example.local
% The key modulus size is 2048 bits
% Generating 2048 bit RSA keys, keys will be non-exportable...
[OK] (elapsed time was 2 seconds)
CORE-SW01(config)# ip ssh version 2
⚠ よくあるミス

hostnameが RouterSwitch のままだと、crypto key generate rsa で警告が出て鍵が作られないケースがあります。必ずhostname → ip domain-name → 鍵生成の順。順番が逆だと鍵名が Switch.example.local 等で固定されて、後でhostname変えるとSSHが暗黙で死んだりします。

Step 3: VTYライン設定(ここが一番ハマる)
CORE-SW01(config)# line vty 0 4
CORE-SW01(config-line)# transport input ssh
CORE-SW01(config-line)# login local
CORE-SW01(config-line)# exec-timeout 10 0
CORE-SW01(config)# username admin privilege 15 secret StrongPass!23

transport input ssh 入れたつもりが vty 0 4 までしか設定してなくて、5〜15は transport input none のままだった」というのも定番。最近のIOS XEだと line vty 0 4line vty 5 15 が分かれてるので、両方確認します。

Step 4: access-class(ACLでSSHを絞ってる場合)
CORE-SW01# show run | sec line vty
line vty 0 4
 access-class MGMT-IN in
 transport input ssh
!
CORE-SW01# show access-lists MGMT-IN
Standard IP access list MGMT-IN
    10 permit 192.168.10.0, wildcard bits 0.0.0.255

運用端末のセグメントを足し忘れてアクセスできない、というのは年に1回はやります。show access-lists でカウンタが上がってるか確認して、上がってなければそもそもACLにヒットしてないので別原因です。

「aborted, error status 0」が出る時の原因

このエラー、原因はだいたい3パターン

機器のログに %SSH-5-SSH2_SESSION: SSH2 Session request from ... aborted, error status 0 が出る場合、認証フェーズの途中で切れてます。具体的には次のどれか。

原因確認方法対処
クライアントが鍵交換途中で切るTeraTermのログで KEX Algorithms 不一致を確認機器側で KEX を追加 or クライアント更新
login local だが username未定義show run | inc usernameusername … secret … を追加
AAA設定で外部認証へ飛んで応答待ちタイムアウトtest aaa group … で疎通確認RADIUS/TACACSサーバ復旧 or local fallback

個人的には、aborted error status 0が出たらまずdebug ip ssh detailを打つのが速いです。AAAで外部に飛んでるのか、鍵で死んでるのか、ログで一発でわかります。debug終わったら忘れず undebug all

クライアント側のアルゴリズム不一致

OpenSSH 8系・9系で繋がらなくなった機器の救出

OpenSSHが8.0以降になってから、古いCisco(IOS 12.x や ASA 8.x など)で no matching key exchange method foundno matching host key type が出るようになりました。レガシーアルゴリズムがクライアントから消えたのが原因です。

図1: SSH KEX/HostKey の対応状況(クライアント・機器の世代別)

最新IOS XE × 最新OpenSSH

95%

IOS 15.x × OpenSSH 7.x

75%

IOS 15.x × OpenSSH 8/9

45%

IOS 12.x × OpenSSH 9

15%

※ 数値は弊環境での接続成功率(オプション無指定時)の目安。レガシー有効化で改善

クライアント側で一時的に古いアルゴリズムを許可する
# 一発で繋ぐ
ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 \
    -oHostKeyAlgorithms=+ssh-rsa \
    -oPubkeyAcceptedAlgorithms=+ssh-rsa \
    admin@192.168.10.1

# 恒久対応:~/.ssh/config に書く
Host 192.168.10.*
  KexAlgorithms +diffie-hellman-group14-sha1
  HostKeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa
📝 補足情報

Cisco公式の IOS Security Configuration Guide や RFC 4253(SSH Transport Layer Protocol)にKEX/MAC/暗号化の対応マトリクスが載っています。本番投入前にIOSのリリースノートで対応アルゴリズムを必ず確認するのが無難です。

最後に通らないときのチェックリスト

切り分けの順番をテンプレ化しておく

深夜のメンテで頭が回らない時用に、自分はこの順番で切り分けてます。上から順にどうぞ。

#確認項目コマンド / 見るところ
1L3疎通クライアントから ping、機器から ping クライアント
2SSHサービスshow ip ssh が Enabled になっているか
3RSA鍵show crypto key mypubkey rsa
4VTY設定show run | sec line vty (0-4 と 5-15 両方)
5access-classshow access-lists のヒットカウンタ
6認証show run | inc username / aaa
7アルゴリズム不一致クライアント側でssh -vを取って KEX/HostKey を読む
🚫 やってはいけないこと

切り分け中に transport input all を入れる、というのは絶対NG。Telnetも一緒に開いてしまうので、本番機ではやってはいけない設定です。あくまで transport input ssh 単体で確認するのが安全。Telnetを残したい場合でも transport input ssh telnet と明示で。

まとめ

SSHトラブルは「機器側」と「クライアント側」を分けて見る

📋 まとめ

Cisco SSHが繋がらない原因は、ほぼ 「VTY設定 / 鍵未生成 / アルゴリズム不一致」 の3カテゴリに収まります。pingで疎通を切り分けたら、機器側 → show ip ssh、クライアント側 → ssh -v、で順番に見ていけば30分以内には原因に辿り着けます。深夜メンテで焦らないために、切り分けチェックリスト(上の表)をブックマークしておくと安心です。

よくある質問(FAQ)

Q. Catalystの初期化後、SSHすぐ通るようにする最短コマンドは?

hostname → ip domain-name → crypto key generate rsa modulus 2048 → ip ssh version 2 → line vty 0 15 で transport input ssh + login local → username … secret …、の流れです。これで最短5分で入れるようになります。鍵生成のmodulusは現場では2048以上が無難。

Q. pingは通るのにSSHだけ繋がらないのはなぜ?

だいたいVTYのtransport input指定漏れか、access-classで送信元IPを弾いてるかのどちらか。show run | sec line vty と show access-lists のカウンタで一発で見えます。

Q. aborted error status 0 が出たけど何が起きてる?

SSHの認証フェーズ途中でセッションが切られた状態。login local にしてるのに username が無い、AAAサーバが応答しない、クライアントとKEX/HostKeyが噛み合ってない、のどれか。debug ip ssh detail を打つと一発で原因が見えるので、現場ではこれが速いです。

Q. OpenSSH 9で古いCiscoに繋ぐにはどう書く?

ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa admin@host で一時的に許可できます。恒久対応は ~/.ssh/config にHostセクションで書くのがおすすめ。本来は機器側のIOSアップグレードで対応すべきですが、保守期間切れ機器の救出にはこの手が有効です。