ssh -v user@host详细打印每一步,卡在连接、密钥还是认证一目了然。
约 1433 字大约 5 分钟
2026-05-14
SSH 连不上是运维的“噩梦场景”——因为它往往是你访问机器的唯一通道。但它其实是个层次清晰的问题:网络通不通、sshd 在不在、认证过不过、主机指纹变没变。这篇按层走一遍,相关安全概念见 SSH 安全基础。
按报错分流(超时 / 拒绝 / 认证失败 / 指纹变化),分别对应网络、sshd、认证、known_hosts,用 ssh -v 看握手卡在哪。
ssh -v user@host详细打印每一步,卡在连接、密钥还是认证一目了然。
nc -vz host 22先把网络层和 SSH 层分开:端口通不通。
systemctl status sshd拒绝连接时,到服务端确认 sshd 在运行、在监听。
ssh-keygen -R host服务器确实重装过后,删掉 known_hosts 里的过期记录。
SSH 的报错直接指向不同的层,先对号入座:
| 报错 | 卡在哪一层 | 往哪查 |
|---|---|---|
Connection timed out | 网络不通 / 防火墙静默丢包 | 网络、防火墙、云安全组 |
Connection refused | 包到了,但 22 端口没人监听 | sshd 没起、或端口改了 |
Permission denied | 网络和 sshd 都正常,认证没过 | 用户名、密钥、密钥权限、服务端策略 |
REMOTE HOST IDENTIFICATION HAS CHANGED | 主机指纹和记录的不一致 | 核实服务器是否重装,再处理 |
ssh -v user@host 会把整个握手过程详细打出来——卡在哪一步,输出里看得清清楚楚。
nc -vz host 22 # 22 端口通不通
ping host # 主机本身可达吗nc 也连不上 → 网络层问题:路由、本机防火墙、云安全组(云服务器尤其常见,安全组没放行 22)。ping 通但 nc 22 不通 → 主机在,但到 22 端口的路被挡了。
Connection refused 说明包到了主机,但 22 端口没人接。如果你还有别的途径进到服务器(云控制台、带外管理):
systemctl status sshd # sshd 在运行吗
ss -lntp | grep :22 # 22 端口在监听吗,监听地址对吗
journalctl -u sshd -n 50 # sshd 有没有启动失败常见原因:sshd 挂了、sshd 配置改错起不来、或 SSH 端口被改成了别的。
Permission denied 说明网络和 sshd 都没问题,是“证明你是你”这一步没过。ssh -v 的输出里能看到它尝试了哪些认证方式、为什么被拒。常见原因:
authorized_keys 里没有对应公钥600、~/.ssh 是 700,否则直接拒绝使用REMOTE HOST IDENTIFICATION HAS CHANGED 不是“连不上”,是 SSH 在主动拦你——服务器指纹和上次记录的不一样了。可能是服务器重装了(正常),也可能是中间人攻击(危险)。
不要条件反射地 ssh-keygen -R 删掉了事。先核实:这台服务器最近是不是真的重装过、重置过主机密钥?确认无误,再 ssh-keygen -R host 清掉旧记录重连。这条警告存在的全部意义就是让你停下来核实一次。
改 sshd 配置前,务必留一条活动连接
SSH 排查最危险的动作:在远程机器上改 sshd_config 然后 restart sshd——如果改错了(端口、监听地址、认证方式),你当前这条连接断开后就再也连不进去了。铁律:① 改 sshd 配置、重启 sshd 之前,保持当前这条 SSH 会话不要关,它是你唯一的补救通道;② 用 sshd -t 先检查配置语法;③ 新开一个终端测试能连上,再关掉旧会话;④ 重要机器确保有云控制台 / 带外管理兜底。
| 误区 | 更稳妥的做法 |
|---|---|
| 连不上就反复重试 | 先看报错分流:timeout / refused / denied 各查不同层 |
不用 ssh -v 盲猜 | ssh -v 把握手过程打出来,卡在哪一步一目了然 |
指纹变化警告直接 ssh-keygen -R | 先核实服务器是否真的重装过,再清记录 |
| 改 sshd 配置时关掉了当前会话 | 留住当前会话当补救通道,新开终端验证通过再关 |
版权归属:Shuo Liu