Technology · 実用ガイド

SSH がタイムアウト・拒否・「No route to host」?まず接続先タプルを証明する

TCP が認証へ到達していない段階で鍵を交換しないでください。hostname、解決済み address、family、port、jump path を固定し、最初の error と verbose phase を保存して、失敗した最初の hop だけを修正します。

SSH の実効設定・名前と route・TCP 境界・handshake のオリジナルイラスト
オリジナルイラスト:鍵変更前に tuple と最初の失敗 hop を固定します。 Watch at Ease

TCP が認証へ到達していない段階で鍵を交換しないでください。hostname、解決済み address、family、port、jump path を固定し、最初の error と verbose phase を保存して、失敗した最初の hop だけを修正します。

ssh -G は Host と Match を評価した後の client 設定を表示します。 ConnectTimeout は TCP 接続だけでなく初期 SSH handshake と key exchange にも適用されます。

1. 実効接続先タプルを固定する

正確な command を保存し、ssh -G target で hostname、user、port、address family、ProxyJump/ProxyCommand、config file、command-line override を記録します。共有時は credential と private host を伏せますが、内部対応表は残します。

alias が port 22 や入力名を意味するとは限りません。Match、Include、-p、IPv4/IPv6、jump host が実際の tuple を変えます。automation が container、runner、service account なら、その環境を取得し、成功した laptop test で代用しません。

2. 最初の失敗と段階を保存する

時間を制限した ssh -vvv を一度実行し、最初の決定的な行、経過時間、最後に完了した phase を保存します。DNS、local route、TCP refused、TCP timeout、banner/KEX timeout、host-key、authentication を分けます。

refused は試した tuple が active failure を受けた証拠で、多くは listener 不在または policy reject です。timeout は期限内に完了しないだけで、どの firewall、NAT、host、handshake が沈黙したかは単独で示しません。No route は鍵ではなく route/reachability の結果です。

3. 名前・address family・route を証明する

失敗した環境で hostname を解決し、全 IPv4/IPv6 address を列挙します。ssh -vvv が選んだ address、source interface、route decision を記録します。-4/-6 は分類のための制御試験で、恒久対策ではありません。

ProxyJump/ProxyCommand が有効なら client→jump と jump→destination に分けます。direct path や laptop が成功しても CI runner、VPN、cloud subnet の経路は証明されません。split DNS、NAT、hairpin の差も残します。

4. 同じ source から最初の TCP 境界を試す

同じ source identity から許可された destination/port だけを bounded TCP probe します。destination または承認済み管理路で listen address/port、host firewall、cloud policy、NAT target、最近の log を確認します。テストのために広く port を開けません。

refused は listener/active reject、timeout は packet path/handshake silence、no-route は local route、neighbor、返却 ICMP を調べます。ICMP policy と TCP policy は異なるため ping を万能 gate にしません。

5. 許可された境界を一つだけ変えて受入れる

alias/port、route、範囲を限定した firewall/NAT rule、sshd bind address、jump host のどれか一つだけを直します。out-of-band recovery を保ち、reload 前に server config syntax を検査します。

同じ source、hostname、family、port、jump path で再試行します。期待する banner/KEX、正しい host-key identity、意図した authentication result を確認し、未許可 source が引き続き拒否されることも証明します。露出が増えたら rollback します。

SSH refused・timeout・no-route の証拠比較オリジナルイラスト
オリジナルイラスト:error class から次の証明を選びます。 Watch at Ease