Ping 通但 VPN 上 SSH 失败:哪一环节坏了?
一次完整的详细尝试即可分清 TCP 可达性、SSH 传输、主机身份、用户登录与会话权限,让你不再围着隧道猜。
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 reached | What it proves | Where to look next |
|---|---|---|
| No TCP connection | No SSH transport exists | Address, port, route, selectors, filter, listener |
| TCP up, exchange incomplete | Reachability is not the blocker | Server response, negotiation, packet handling |
| Host identity rejected | The peer is not the expected host | Independently verified host key |
| User authentication rejected | The attempt reached authentication | Account, credential and server policy |
| Authenticated, session denied | Login succeeded, the operation did not | Shell, command or forwarding permission |
密码试错几次就停手。反复猜测会造成锁定,随后看起来像另一个不相关的故障,比原工单更费时间。
回滚与留档
一次只改一处,并在重测之前写下改了什么。若某项改动让尝试更糟,立刻回退,而不是在上面再叠一个修复。用原来的客户端、在原来的上下文里重做原来的操作。换一台机器、换一个地址族登录成功,不算复现,也证明不了修复。
对外分享前先做脱敏。详细客户端输出可能带内部名称、账号标签、密钥路径和公钥标识,因此应发布分环节的结论,而不是原始轨迹。