Watch at Ease看見世界,讀懂生活。

Technology · 實用指南

SSH 逾時、遭拒或顯示「No route to host」?先證明目的元組

TCP 尚未進入驗證時不要輪替金鑰。先固定主機名稱、解析位址、位址族、連接埠與跳板路徑,保留第一個錯誤與詳細階段,再證明首個失敗跳點,只修改一個邊界。

SSH 生效設定、名稱路由、TCP 邊界與握手示意圖
原創插畫:改金鑰前先固定元組與首個失敗跳點。 Watch at Ease

TCP 尚未進入驗證時不要輪替金鑰。先固定主機名稱、解析位址、位址族、連接埠與跳板路徑,保留第一個錯誤與詳細階段,再證明首個失敗跳點,只修改一個邊界。

ssh -G 會在計算 Host 與 Match 規則後列印用戶端設定。 ConnectTimeout 同時涵蓋 TCP 建連與初始 SSH 握手、金鑰交換。

1. 固定實際生效的目的元組

保存準確命令並執行 ssh -G target,記錄 hostname、user、port、address family、ProxyJump 或 ProxyCommand、設定檔與命令列覆寫。對外分享前遮蔽憑證與私有主機資料,但保留內部對照。

不要假設別名就是 22 埠或輸入的名稱。Match、Include、-p、IPv4/IPv6 選擇或跳板都會改變真實元組。若自動化在容器、runner 或服務帳號中執行,應擷取該環境,而不是用成功的筆電測試代替。

2. 保留第一個失敗與準確階段

執行一次有限時的 ssh -vvv,保存第一個決定性訊息、耗時與最後完成階段。分開名稱解析、本機路由、TCP refused、TCP timeout、SSH banner/金鑰交換逾時、主機金鑰驗證與登入失敗。

refused 證明嘗試的元組收到主動失敗,常見於無監聽或政策拒絕。timeout 只代表未及時完成,不能單獨證明哪個防火牆、NAT、主機或握手邊界沉默。No route 是路由或可達性結果,不是 SSH 金鑰診斷。

3. 證明名稱、位址族與路由

在失敗環境解析確切主機名稱並列出全部 IPv4、IPv6。記錄 ssh -vvv 實際嘗試的位址、來源介面與路由決策。-4 與 -6 只能作受控分類,不是永久修復。

若啟用 ProxyJump 或 ProxyCommand,拆成用戶端到跳板、跳板到目的兩段。直連成功不代表跳板路徑正常,筆電成功也不代表 CI、VPN 或雲端子網。保留 split-horizon DNS、NAT 與 hairpin 差異。

4. 從相同來源測試首個 TCP 邊界

從同一來源身分,只對授權目的與埠做有限時 TCP 探測。在目的端或核准管理通道核對監聽位址/埠、主機防火牆、雲端政策、NAT 目標與近期日誌。不要為了通過測試而向全網開新埠。

依類別找證據:refused 查監聽與主動拒絕;timeout 查封包路徑或握手沉默;no-route 查本機路由、鄰居與返回 ICMP。不要把 ping 當萬用關卡,因 ICMP 與 TCP 政策可能不同。

5. 只改一個授權邊界並驗收

只修改一個邊界:修正別名或埠、路由、單一收斂的防火牆/NAT 規則、sshd 綁定位址或跳板主機。保留帶外復原路徑,並在 reload 前檢查伺服器設定語法。

以相同來源、主機名稱、位址族、埠與跳板路徑重試。驗收需看到預期 SSH banner 或金鑰交換、正確主機金鑰與預期驗證結果;也要證明未授權來源仍被封鎖,若曝露面擴大或控制路徑受損就回復。

SSH refused、timeout 與 no-route 證據對照圖
原創插畫:讓錯誤類別決定下一項證據。 Watch at Ease