SSH 连不上
逐步拆解:从“connection timed out”到“access denied”——如何判断断点究竟在哪里,并通过面板控制台恢复访问。
更新于 2026年8月23日
SSH 连不上看起来每次都一样,但原因有五种,解决办法各不相同。先从报错信息入手——它能立刻缩小排查范围。最重要的是:您始终可以通过面板 /hosting/vds/m/<id> 中的“控制台”标签页访问机器;它独立于网络和系统内部的设置。
读懂报错
| 报错信息 | 断在哪里 |
|---|---|
Connection timed out | 数据包没有到达:机器已关机、有过滤规则、地址错误 |
Connection refused | 机器有响应,但端口上没人监听:sshd 服务没有运行 |
Permission denied (publickey) | 网络正常,密钥不匹配 |
Permission denied (password) | 密码不匹配或密码登录已被禁用 |
Host key verification failed | 机器的指纹变了——通常发生在重装之后 |
查看详细信息很有用:ssh -vvv root@YOUR_ADDRESS 会显示卡在了哪个阶段。
连接超时
- 在“概览”标签页检查机器状态。如果图表已经停止,说明机器没有运行——请在面板中开机或重启。
- 确认地址正确,并且机器本身可以连通:
ping YOUR_ADDRESS。 - 通过控制台登录并检查过滤规则:
ss -tulpn | grep sshd
nft list ruleset | head -40 # or iptables -S
ufw status # Debian, Ubuntu
firewall-cmd --list-all # AlmaLinux, CentOS Stream
经典情况——您执行了 ufw enable,却没有放行 22 端口。在控制台用一条命令即可解决:ufw allow 22/tcp。
- 检查 fail2ban 是否在多次失败尝试后封禁了您:
fail2ban-client status sshd;解封——fail2ban-client set sshd unbanip YOUR_IP。
连接被拒绝
服务没有运行,或者监听的端口不对。
systemctl status sshd || systemctl status ssh
journalctl -u sshd -n 50 --no-pager
sshd -t # check configuration for errors
systemctl restart sshd
sshd -t 往往能救场:/etc/ssh/sshd_config 里一个拼写错误,就会导致服务在重启后无法启动。如果您改了端口,请用 -p NUMBER 连接,并且别忘了在过滤规则中放行它。
权限被拒绝
如果报的是密钥错误,请在机器上检查:
ls -la /root/.ssh
chmod 700 /root/.ssh && chmod 600 /root/.ssh/authorized_keys
grep -E 'PermitRootLogin|PubkeyAuthentication|PasswordAuthentication' /etc/ssh/sshd_config
如果权限比允许的更严格,sshd 会静默拒绝。面板“访问”标签页中的密钥列表是整体替换的:添加新密钥时,别不小心删掉还能用的那把。保存列表会重启正在运行的机器,所以请一次性编辑完整。
忘了 root 密码——在“访问”标签页查看;它以加密形式存储,点击按钮即可显示。如果您在系统内部改过密码,面板并不知道:要么通过控制台登录并用 passwd 命令修改,要么点击“修改密码”——面板会生成新密码并重启机器。
Host key verification failed
重装系统后,指纹会改变。在您这一侧删除旧记录:
ssh-keygen -R YOUR_ADDRESS
如果没有重装过,不要盲目确认新指纹——请通过控制台核实:ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub。
什么都试过了还是不行
把机器启动到恢复模式:“访问”标签页 → 启动模式 → SystemRescue 磁盘。机器会从镜像启动,root 免密码登录,您的磁盘显示为 /dev/sda。挂载它并编辑配置:
mount /dev/sda1 /mnt
nano /mnt/etc/ssh/sshd_config
然后切回正常启动模式并重启机器。
修改 SSH 设置之前,请再开一个会话并保持打开。如果新配置把您锁在外面,您可以通过旧连接修复,而不用调出控制台。