1. 事件信息
- 主机别名:
<HOST_ALIAS> - 目标地址:
<SERVER_PUBLIC_IP>:22 - 客户端:Windows OpenSSH (
OpenSSH_for_Windows_9.5p2) - 登录用户:
<SSH_USER> - 私钥文件:
C:\Users\<LOCAL_USER>\Downloads\<KEY_FILE>.pem
2. 故障现象
- 本地 SSH 报错:
kex_exchange_identification: Connection closed by remote hostConnection closed by <SERVER_PUBLIC_IP> port 22
- 服务器日志(
/var/log/auth.log)出现:Connection reset by authenticating user <SSH_USER> ... [preauth]
3. 排查结论
sshd服务正常运行,22 端口正常监听。ufw已放行 22 端口。fail2ban未安装(fail2ban-client: command not found)。- 连接失败发生在 preauth 阶段,即尚未进入正常密钥认证流程。
- 次要问题:私钥文件 ACL 过宽时,OpenSSH 会拒绝使用该私钥(后已修正权限)。
4. 根因判断
- 22 端口对公网开放,扫描流量较多,触发 SSH preauth 阶段连接不稳定/被重置。
MaxStartups默认阈值在高扫描场景下容易导致正常连接被丢弃。
5. 修复动作
5.1 调整 SSH preauth 并发阈值
bash
printf "MaxStartups 100:30:200\nLoginGraceTime 20\n" | sudo tee /etc/ssh/sshd_config.d/99-tune.conf
sudo sshd -t && sudo systemctl restart ssh
5.2 收敛 22 端口来源(只允许当前公网 IP)
bash
sudo ufw delete allow 22
sudo ufw allow from <YOUR_PUBLIC_IP> to any port 22 proto tcp
sudo ufw status
5.3 本地私钥权限修正(Windows)
- 仅保留当前用户、
Administrators、SYSTEM对.pem的访问权限。
6. 结果
- 执行以上动作后,SSH 恢复可用,
ssh <HOST_ALIAS>可正常连接。
7. 防复发建议
- 长期保持 22 端口最小来源白名单,不建议
Anywhere全开放。 - 若公网 IP 会变,考虑:
- 使用堡垒机 / WireGuard / Tailscale;
- 或使用云厂商安全组动态白名单。
- 保留
99-tune.conf,并定期复查auth.log扫描强度。