5月29日 01:22

SSH 连接失败如何排查?常见原因有哪些?

SSH 故障按报错分四类:Connection refused 说明目标端口未监听(sshd 未运行或防火墙阻断);Connection timeout 说明网络不可达(路由/防火墙丢弃包);Permission denied 是认证失败(密钥不匹配或权限错误);Host key verification failed 是 known_hosts 中记录的指纹与服务器当前密钥不一致。排查第一步始终是 ssh -vvv 看详细握手过程,日志会精确显示卡在哪个阶段。密钥权限是最常见的低级错误:私钥必须 600,.ssh 目录 700,authorized_keys 600,权限过宽 sshd 会拒绝认证。

追问

ssh -vvv 输出中各阶段分别对应什么? 三个 v 递增详细度。-v 显示连接建立、密钥交换、认证尝试;-vv 增加配置解析和 IO 细节;-vvv 再增加包级调试。重点关注 debug1: Authentications that can continue 和 debug1: Offering public key 两行,前者看服务端支持哪些认证方式,后者看客户端尝试了哪些密钥。

连接频繁断开怎么解决? 通常是 NAT/防火墙空闲连接超时淘汰。客户端配置 ServerAliveInterval 60(每60秒发心跳),服务端配置 ClientAliveInterval 300。autossh 可自动重连断开的会话。

known_hosts 冲突一定是重装系统吗? 不一定。IP 被复用、服务器更新了主机密钥、或中间人攻击都会导致。确认安全后用 ssh-keygen -R host 删除旧记录,不可盲目忽略否则失去 MITM 保护。

如何不用密码只允许密钥登录? 服务端 /etc/ssh/sshd_config 设置 PasswordAuthentication no 和 PubkeyAuthentication yes,改完 sshd -t 验证语法再 systemctl restart sshd。

写段代码

bash
# 客户端 SSH 配置 ~/.ssh/config Host myserver HostName 10.0.0.1 User deploy Port 2222 IdentityFile ~/.ssh/deploy_key ServerAliveInterval 60
标签:SSH