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,保存第一条决定性信息、耗时与最后完成阶段。分开 DNS 错误、本地路由、TCP refused、TCP timeout、SSH banner/密钥交换超时、主机密钥校验与认证失败。

refused 证明所尝试元组收到了主动失败,常见于没有监听或策略主动拒绝。timeout 只表示未及时完成,不能单独证明是哪一道防火墙、NAT、主机或握手边界沉默。No route 是路由或可达性结果,不是 SSH 密钥问题。

3. 证明名称、地址族和路由

在失败环境解析准确主机名,列出全部 IPv4 与 IPv6 地址。记录 ssh -vvv 实际尝试的地址、源接口和路由决策。-4 与 -6 只能作为受控分类实验,不应直接当永久修复。

若启用了 ProxyJump 或 ProxyCommand,应拆分路径:客户端到跳板机,再从跳板机到目标。直连成功不能证明跳板路径,笔记本成功也不能证明 CI runner、VPN 或云子网路径。保留分割 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