前一阵有个朋友找我报故障:刚在VMware里装好的CentOS Stream 9,控制台能正常登root,但Windows上用Xshell连就一直弹Permission denied。他反复确认密码没输错,我也跑去对着VNC控制台看了半天,密码确实是对的。后来综合判断了一下,原因很明确:从RHEL 9这一代开始,sshd默认不再允许root通过密码远程登录。这不是密码错误,也不是防火墙拦人,而是系统故意这么设置的。如果你也刚装完CentOS Stream 9,正卡在“root远程登录被拒”这里,这篇文章就把我实际排查和处理的完整思路讲清楚,顺便把配置完仍进不去的情况也一并捋一遍。
1. 先分清楚故障类型:是“连不上”还是“登不进”
拿到这种问题,别急着改配置。第一步永远是先看SSH客户端给你什么反馈。这决定了整个排查方向。
常见的远程连接失败就三种情况:
| 现象 | 含义 | 优先排查方向 |
|---|---|---|
| Connection refused | 目标端口没有服务监听,或者被防火墙直接拒绝 | sshd是否启动、端口是否监听22、防火墙规则 |
| Connection timed out | 网络通不到,或中间设备丢包丢弃 | IP是否可达、路由、云安全组/物理防火墙 |
| Permission denied | TCP已建立连接,但认证环节失败 | 用户名、密码、密钥、sshd认证策略 |
标题里说的这个场景,大概率属于第三种:你输错密码才可能这样,但问题是即使密码正确,系统也照样弹Permission denied。如果我用root密码登录,日志里很可能会看到 Failed password for root 或者 Permission denied 这类记录,这就说明认证请求已经到了sshd进程,只是sshd根据配置不让你通过。
我建议你把远程客户端的输出调整到verbose模式再看一次:
bash复制ssh -vvv root@目标主机IP
这一堆输出里重点看最后几行。如果能看到类似:
text复制Authentications that can continue: publickey
注意:可能只有“publickey”被列出。说明sshd只要求公钥认证,根本不会接受你输入的密码。这基本就能锁定问题出在sshd配置上,而不是密码或账号本身。
服务端同时可以看日志:
bash复制journalctl -u sshd --since "10 minutes ago" | tail -n 50
CentOS/RHEL系列传统的认证日志在/var/log/secure,也可以一起看:
bash复制tail -n 30 /var/log/secure
看到Failed password for root from 192.168.x.x port xxx ssh2并不可怕,这只能说明客户端在尝试密码认证;但如果看到Authentication refused或类似字样,甚至没有任何密码验证日志而是直接断开,那就要往PermitRootLogin这条策略上靠。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 根因在这里:RHEL 9系列把root密码登录默认关了
CentOS Stream 9继承的是RHEL 9的那套安全基线。OpenSSH在RHEL 9上的默认行为是这样的:root用户允许通过SSH登录,但不允许使用密码认证。换句话说,默认值是PermitRootLogin prohibit-password。
你打开/etc/ssh/sshd_config看,可能看到的是一行注释:
