全部排错手册
网络 / 安全更新于 4 分钟阅读 · 执行耗时因环境而异

SSH 无法连接:区分网络、端口、认证与主机密钥问题

SSH 失败信息已经指向不同层级。先读错误原文,避免在未确认网络路径前修改认证配置。

维护者 Kevin · Ovalk

适用范围与前提

适用于通常运行于 Linux 的 OpenSSH 客户端及服务端;服务名、配置路径和控制台访问方式因主机而异。

修改 sshd 或防火墙前保留现有会话并确认独立控制台可用。分享详细日志前先脱敏,其中可能包含用户名及内部主机信息。

示例不是可以直接粘贴的指令。请替换示例域名、路径、服务名和大写占位符。先收集证据;重载、回滚、清理及执行任务会改变系统状态,需批准影响范围与恢复计划。不要分享凭据或未脱敏日志。

常见症状

  • Connection refused、Connection timed out 或 Permission denied
  • 自动化部署突然无法登录服务器
  • 主机密钥变更导致 CI 中断

1. 按错误类型分层

Connection refused 表示目标可达但端口没有服务或被主动拒绝;timeout 更偏向路由、防火墙或安全组;Permission denied 才进入用户、密钥和 sshd 配置检查。

ssh -vvv user@example.com
nc -vz example.com 22

2. 从带外控制台检查服务

通过云控制台或同网段跳板主机确认 sshd 监听地址、防火墙规则和最近配置变更。远程修改 sshd_config 前,保留当前会话并先运行配置校验。

ss -lntp | grep :22
sshd -t
journalctl -u sshd --since "1 hour ago" --no-pager

3. 谨慎处理主机密钥变化

known_hosts 变化可能是重装、负载均衡切换,也可能是中间人风险。必须通过可信控制台或资产系统确认新指纹后再更新自动化环境。

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
ssh-keygen -F example.com

解读证据

观察结果下一步检查
Connection refused核对监听与目标端口;防火墙或中间设备也可能主动拒绝,这不是认证错误。
Permission denied (publickey)检查客户端提交了哪把密钥、目标用户及服务端日志;不要为绕过诊断而启用密码登录。
主机身份发生变化暂停并独立验证指纹,不要仅因警告阻止访问就删除 known_hosts 条目。

说明性诊断案例

以下假设案例用于解释推理,并非客户真实事故,也不代表已在你的技术环境中测试。

密钥轮换后自动化立即出现 Permission denied,但 TCP 可连接且主机指纹未变。应检查自动化账号、提交的密钥及服务器授权;增加防火墙开放端口无法解决认证失败。通过可信控制台核对新公钥及账号策略。

验证恢复

  • 关闭恢复会话前,用目标用户及认证方式建立第二个独立会话。
  • 验证实际部署或自动化连接,并确认可信主机密钥校验仍然启用。

回滚与停止条件

备份修改的服务端配置,重载前执行 sshd -t。新会话失败时,通过保留会话或控制台恢复原配置;回滚不应削弱主机密钥校验。

预防与长期修复

  • 保留带外控制台和经过测试的 break-glass 流程。
  • 将安全组、sshd 和授权密钥变更纳入审计。
  • 自动化系统维护可验证的主机密钥清单。

参考资料与纠错

请使用与你安装版本匹配的文档。以下资料解释基础行为,命令仍需结合实际环境验证。

向 Kevin 提交更正,请附页面地址、版本与脱敏复现步骤。请查看编辑原则(英文)