Watch at Ease看见世界,读懂生活。

科技 · 实用指南

SSH 提示“kex_exchange_identification: Connection closed”?先对齐预认证边界

这条消息早于普通登录失败。先固定实际路由、保存客户端停止点,并按同一时间戳对齐入口设备与 sshd 日志,只修改真正关闭套接字的组件。

SSH 提示“kex_exchange_identification: Connection closed”?先对齐预认证边界
原创示意图:在客户端日志中寻找服务器标识行和第一条 SSH 密钥交换消息。若对端从未发送 SSH banner,应先查监听器与入口路由,而不是用户密钥。 Watch at Ease

kex_exchange_identification: Connection closed by remote host 并不能证明私钥错误。它表示 TCP 已到达某个对端,但连接在 SSH 标识交换或早期密钥交换附近结束,尚不足以进入普通用户认证诊断。

把故障整理成三个观察点的时间线:客户端、网络入口和 SSH 守护进程。同一消息可能来自错误端口、代理或防火墙、sshd 启动连接限制、源地址惩罚或显式拒绝规则。

固定实际端点和一次失败时间

记录准确主机、解析地址、端口、源地址、ProxyJump 或 ProxyCommand、VPN 状态和调用者。保存一次 UTC 时间戳及完整 ssh -vvv 输出。

不要假定熟悉的主机名一定到达预期 sshd。负载均衡、NAT、托管面板端口、跳板机或旧 DNS 都可能接收 TCP 后在认证前关闭。

标记客户端真正到达的最后协议边界

在客户端日志中寻找服务器标识行和第一条 SSH 密钥交换消息。若对端从未发送 SSH banner,应先查监听器与入口路由,而不是用户密钥。

RFC 4253 要求底层连接建立后双方发送标识字符串。这里关闭属于传输或预认证观察,不能证明 authorized_keys 拒绝了用户。

对齐入口决策与 sshd 预认证日志

按相同时间戳读取防火墙、NAT、负载均衡、代理和主机安全日志,再读 sshd journal。确认哪个后端接收套接字,以及 sshd 是否记录丢弃、拒绝或配置失败。

读取包括针对客户端来源的 Match 结果在内的生效 sshd 值。优先使用有范围的临时日志,不要无限期开全局调试,并保护日志中的用户信息。

改限制或密钥前先给关闭原因分类

区分错误目标或无 SSH 监听、MaxStartups 压力、PerSourceMaxStartups、源惩罚、RefuseConnection、LoginGraceTime 超时和外部策略工具。必须由证据选择分支。

不要只因论坛提到 MaxStartups 就提高它。默认策略会概率性早丢弃;提高上限可能只增加负载,无法修复错误路由、恶意流量或源策略。

只做一个最小修复并验证前进

只改已证明的问题:改到正确监听器、修复具体代理或后端、修正精确 Match 规则、按策略豁免可信监控,或调整已证实的预认证容量。

从已知来源进行一次受控重试,确认客户端收到正确 SSH 标识、sshd 记录同一请求并进入预期认证方法,最后在不全局关闭保护的情况下执行一个真实命令。

SSH 提示“kex_exchange_identification: Connection closed”?先对齐预认证边界
原创示意图:按相同时间戳读取防火墙、NAT、负载均衡、代理和主机安全日志,再读 sshd journal。确认哪个后端接收套接字,以及 sshd 是否记录丢弃、拒绝或配置失败。 Watch at Ease