深夜のメンテで「あれ、SSHだけ繋がらない…」って状況、ネットワークエンジニアなら一度は経験してるはず。pingは通る、機器のシリアルからは入れる、でもSSHだけがNG。これ、最初めちゃくちゃ困るんですよ。
この記事では、CiscoのSSH接続が失敗する典型パターンを機器側とクライアント側に分けて整理し、実機で確認したCLIコマンドベースで切り分け手順をまとめます。最後に「aborted error status 0」など現場でよく見る具体的なエラーメッセージへの対処もセットで載せておきます。
SSHが繋がらない時の典型症状パターン
SSHが通らない、と一括りにしても症状は色々。まずは下のテーブルで自分のケースがどれかを当てはめてください。当てはめただけで原因の半分は絞れます。
| 症状 | 疑うべき原因 | 最初に打つコマンド |
|---|---|---|
| pingも通らない | L3疎通・ACL・経路 | show ip route / show access-lists |
| pingは通るがSSHだけNG | VTY設定 / 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の設定見るのが最速です。
show ip ssh と show running-config で確認するポイント
CiscoのSSHは、ただ ip ssh version 2 と書けば動くわけじゃない。前提として「ホスト名」「ドメイン名」「RSA鍵」の3点セットが必要で、ここのどれか1つでも欠けてると沈黙します。
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 と出たら、サービスが立ち上がってない。たいていは鍵未生成です。
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が Router や Switch のままだと、crypto key generate rsa で警告が出て鍵が作られないケースがあります。必ずhostname → ip domain-name → 鍵生成の順。順番が逆だと鍵名が Switch.example.local 等で固定されて、後でhostname変えるとSSHが暗黙で死んだりします。
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 4 と line vty 5 15 が分かれてるので、両方確認します。
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にヒットしてないので別原因です。
このエラー、原因はだいたい3パターン
機器のログに %SSH-5-SSH2_SESSION: SSH2 Session request from ... aborted, error status 0 が出る場合、認証フェーズの途中で切れてます。具体的には次のどれか。
| 原因 | 確認方法 | 対処 |
|---|---|---|
| クライアントが鍵交換途中で切る | TeraTermのログで KEX Algorithms 不一致を確認 | 機器側で KEX を追加 or クライアント更新 |
| login local だが username未定義 | show run | inc username | username … 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 found や no matching host key type が出るようになりました。レガシーアルゴリズムがクライアントから消えたのが原因です。
図1: SSH KEX/HostKey の対応状況(クライアント・機器の世代別)
95%
75%
45%
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のリリースノートで対応アルゴリズムを必ず確認するのが無難です。
切り分けの順番をテンプレ化しておく
深夜のメンテで頭が回らない時用に、自分はこの順番で切り分けてます。上から順にどうぞ。
| # | 確認項目 | コマンド / 見るところ |
|---|---|---|
| 1 | L3疎通 | クライアントから ping、機器から ping クライアント |
| 2 | SSHサービス | show ip ssh が Enabled になっているか |
| 3 | RSA鍵 | show crypto key mypubkey rsa |
| 4 | VTY設定 | show run | sec line vty (0-4 と 5-15 両方) |
| 5 | access-class | show 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アップグレードで対応すべきですが、保守期間切れ機器の救出にはこの手が有効です。


