Ping 有回应和 SSH 登录被拒可以同时成立,这两件事并不指向隧道。回显应答与到 22 端口的 TCP 连接是选择器不同、策略不同、目标也常常不同的两类测试。记录一次有意为之的 SSH 尝试,然后说出它走到了最后一环。这一份证据足以取代十几次凭猜测改配置。

只记一次尝试,不要反复乱戳

只运行一次客户端,开启详细诊断、关闭连接复用并设置有限的连接超时。关闭复用很关键,否则此前已认证的主连接会替新尝试作答,把你要追的故障藏起来。

ssh -4 -vv -o ControlPath=none -o ConnectTimeout=10 [email protected]

保留目的地、地址族、时间戳和最后一条不含敏感信息的错误。带 IPv4 标志也意味着这次尝试对同名目标的 IPv6 路径一无所知,不要据此推断。记下尝试是从哪里发起的。在 VPN 网关上做的检查,与它身后的笔记本电脑并不是同一个视角,这类工单里大多数矛盾都来自把两者混为一谈。

第一、二环节:先 TCP,再 SSH

第一条边界是套接字的可达性:地址、端口,以及数据包实际走的路由。TCP 连接若始终建不起来,它上面就还不存在任何东西,主机密钥和账号都无从谈起。

nc -vz 10.90.4.20 22
ip route get 10.90.4.20
tcpdump -ni any 'host 10.90.4.20 and port 22'

把抓包与客户端这次尝试对上。只发出 SYN 而没有回包,指向过滤、选择器,或对端缺少路由;带 RST 的回应则指向某个主动拒绝而非静默丢弃的东西。第二条边界是 SSH 协议本身的交换。TCP 连接建立后又卡住,说明已经越过了可达性,进入协商、服务端响应或数据包处理。那是另一项排查,也正是与大小相关的问题首次变得合理的环节。

第三环节:是谁的密钥在应答

传输层起来之后,客户端要验证服务端的主机密钥。此处被拒是在说身份,而不是在说密码学:对端出示了你策略不接受的那把密钥。把它当作停止条件,并在带外、通过控制台或重建该主机的人去核实。为消掉警告而删掉已记住的条目,是唯一应当拒绝的捷径,因为它销毁了有东西意外应答的证据。

若主机确实被重建,只有在新的指纹得到确认之后才删除旧记录,并注明日期和原因。下一位工程师会遇到同样的警告,他需要这段背景。

第四、五环节:账号与权限

认证是第四条边界。凭据被拒说明服务端评估了这次尝试并拒绝了它;要查的是账号、服务端接受的凭据类型以及服务端自身的策略,而不是 VPN 密码。第五条边界是登录成功之后的授权。已认证的用户仍可能被拒绝 shell、命令、子系统或转发,而只读客户端最后一行的人会把这些拒绝当成故障。

Last stage reachedWhat it provesWhere to look next
No TCP connectionNo SSH transport existsAddress, port, route, selectors, filter, listener
TCP up, exchange incompleteReachability is not the blockerServer response, negotiation, packet handling
Host identity rejectedThe peer is not the expected hostIndependently verified host key
User authentication rejectedThe attempt reached authenticationAccount, credential and server policy
Authenticated, session deniedLogin succeeded, the operation did notShell, command or forwarding permission

密码试错几次就停手。反复猜测会造成锁定,随后看起来像另一个不相关的故障,比原工单更费时间。

回滚与留档

一次只改一处,并在重测之前写下改了什么。若某项改动让尝试更糟,立刻回退,而不是在上面再叠一个修复。用原来的客户端、在原来的上下文里重做原来的操作。换一台机器、换一个地址族登录成功,不算复现,也证明不了修复。

对外分享前先做脱敏。详细客户端输出可能带内部名称、账号标签、密钥路径和公钥标识,因此应发布分环节的结论,而不是原始轨迹。

相关文章