华为云 ECS Linux SSH 登录失败分层排查清单:从 EIP、安全组到 sshd、密钥与 VNC 兜底

举报
yd_294423728 发表于 2026/11/05 11:35:17 2026/11/05
【摘要】 SSH 连不上华为云 Linux ECS,原因可能出在公网 IP、安全组、网络 ACL、实例防火墙、sshd 配置、密码与密钥、系统文件等多个层级。本文对照华为云官方文档,按“能否到达、是否监听、认证能否通过、系统是否正常”的顺序给出 10 层排查清单和命令,覆盖在线/离线重置密码与 VNC 兜底,对照常见报错含义,文末附速查表。

SSH 连不上华为云 ECS,是云上运维里最常见的问题之一。麻烦的地方在于:同样一句“连不上”,背后可能是公网 IP 没绑、安全组没放行、子网上挂了网络 ACL、实例里的防火墙拦了、sshd 根本没起来,也可能只是本地 known_hosts 里存了一条旧指纹。

很多人习惯从“改 sshd_config”开始试,结果越改越乱。更高效的做法是按链路分层:先确认流量能不能到达实例,再确认实例里有没有进程在听,最后再看认证环节。本文把这条链路拆成 10 层,每层给出要看的地方和可直接复制的命令,最后附一张“报错 → 层级”的速查表。

说明:文中控制台菜单名称、功能依赖等均对照华为云官方文档整理,不同区域、不同时期的控制台界面可能有差异,请以官方文档为准。

0. 先做两件事:看报错原文、试一下 VNC

在动手排查之前,建议先做两件很省时间的事。

第一,把报错原文完整保留下来。 用 -v 参数让客户端打印详细过程,报错停在哪一步,基本就决定了要查哪一层:

# -v 打印协商过程,-vvv 更详细
ssh -v root@<EIP>

# 指定端口与私钥
ssh -v -p 22 -i ~/.ssh/kp-xxx.pem root@<EIP>

大致可以这样判断:

卡住的位置 典型输出 优先排查
TCP 都没连上 Connection timed out / 长时间无响应 第 1~4 层(EIP、安全组、ACL、实例防火墙)
TCP 被立刻拒绝 Connection refused 第 5 层(sshd 未运行 / 端口不对)
连上后被断开 Connection reset by peer、Connection closed 第 4~5 层、主机安全拦截
进入认证阶段失败 Permission denied、Access denied 第 6~8 层(配置、凭证、密钥)
客户端自己拒绝 Host key verification failed 本地 known_hosts

第二,试一下控制台的 VNC 远程登录。 华为云官方的“无法登录 Linux 云服务器”排查文档,第一步就是建议先尝试通过控制台以 VNC 方式登录。路径一般是:ECS 控制台 → 弹性云服务器列表 → 目标实例“操作”列的“远程登录” → 其他方式中的 VNC 方式。

VNC 能不能登进去,是一个非常关键的分叉点:

  • VNC 能登录、SSH 不行:系统本身是好的,问题在网络链路、sshd 或认证配置,按下文第 1~8 层排查即可,而且后续很多修改都可以在 VNC 里完成。
  • VNC 也登录不了:问题可能在系统层(启动失败、文件系统、关键配置损坏等),直接跳到第 9 层。

关于 VNC 有几点要提前知道(以官方文档为准):

  1. 实例状态需要是“运行中”。
  2. VNC 不依赖弹性公网 IP,也不依赖安全组规则,所以特别适合用来兜底。
  3. VNC 登录使用的是密码。如果实例创建时选的是“密钥对”或“创建后设置”,需要先通过重置密码拿到密码(见第 7 层)。
  4. 界面提示 Press CTRL+ALT+DELETE 时,要点面板上方的“Ctrl+Alt+Del”按钮,物理键盘按组合键不生效。
  5. VNC 不支持直接复制粘贴,较长命令可以用面板上的“复制粘贴”功能发送进去。

1. 第一层:实例状态与公网 IP(EIP)

这一层最基础,但被跳过的次数也最多。

检查清单:

  1. 实例状态是否为“运行中”。关机、冻结(例如欠费)的实例都无法登录。
  2. 是否绑定了弹性公网 IP。官方文档说明,使用 PuTTY、Xshell 等远程登录工具通过公网连接时,实例需要绑定弹性公网 IP。
  3. 连接用的地址是不是当前 EIP。解绑后重新绑定、释放后重新申请,EIP 都可能变化,本地终端工具里保存的旧会话很容易连到别人的地址上。
  4. 带宽是否被打满。官方排查思路里把“带宽和 CPU 利用率过高”列为可能导致无法登录的原因之一,可以在云监控里看 EIP 出入带宽和实例 CPU。

如果是在同一个 VPC 内的另一台 ECS 上做跳板登录,则走私网 IP,不需要 EIP,但安全组规则的“源地址”就要写私网网段或对应安全组,而不是你本地的公网出口 IP。

本地先排除自己网络的问题:

# 查看本地出口公网 IP,后面配置安全组源地址时要用
curl -s https://ifconfig.me ; echo

# 测试 TCP 22 端口是否可达(任选其一)
nc -vz -w 5 <EIP> 22
telnet <EIP> 22

官方文档也建议:更换手机热点或其他网络环境测试,排除本地运营商或公司网络对 22 端口的封堵。很多办公网络会限制出方向的 22 端口,这种情况下换个热点就能连上。

2. 第二层:安全组 22 端口与源地址

安全组是实例级别的必选防护层,绝大多数 Connection timed out 都出在这里。

检查路径: ECS 详情页 →“安全组”页签 → 查看入方向规则。

检查清单:

  1. 是否放通了 SSH 端口。 入方向需要有一条“允许”、协议 TCP、端口为 sshd 实际监听端口(默认 22)的规则。如果改过 sshd 端口,记得把新端口也加进来。
  2. 源地址是否覆盖了你当前的出口 IP。 为了安全把源地址收紧到“办公室 IP/32”是好习惯,但家里、热点、公司换了出口 IP 之后就连不上了。把第 1 层查到的出口 IP 和规则对一下。
  3. 有没有优先级更高的拒绝规则。 华为云安全组规则支持“允许”和“拒绝”两种策略,按优先级匹配(数字越小优先级越高),同优先级下拒绝优先于允许。一条优先级为 1 的“拒绝 0.0.0.0/0 TCP 22”会让后面所有允许规则失效。
  4. 实例是否关联了多个安全组。 多个安全组时规则会合并按优先级匹配,只看其中一个安全组容易漏掉拒绝规则。
  5. 创建时选的预设模板。 按官方说明,“通用 Web 服务器”预设规则会放通 TCP 22(源 0.0.0.0/0);而“自定义”预设的入方向只放通同安全组内实例互通,外部流量都进不来,需要手动加 SSH 规则。

关于源地址的安全建议: 官方文档明确提示,把 22、3389 等高危端口以 0.0.0.0/0 暴露到公网存在被入侵风险,建议只允许已知 IP 访问。我习惯的做法是:临时排障时短暂放开,排查完立刻收紧回“出口 IP/32”或 IP 地址组。

3. 第三层:网络 ACL(如果子网绑定了的话)

网络 ACL 是子网级的可选防护层,很多账号根本没用到,这一层可以快速确认后跳过。两者的选型差异这里不展开,只说登录场景下需要注意的点:

  1. 先确认 ECS 所在子网有没有关联网络 ACL。 没有关联就跳过本层。
  2. 默认规则是拒绝全部。 按官方文档,网络 ACL 入方向、出方向的默认规则都是“拒绝全部”,且默认规则不能删改。如果子网刚关联了一个只有默认规则的 ACL,SSH 就会全部超时。
  3. 需要一条入方向允许规则。 协议 TCP、目的端口 22(或你的 sshd 端口)、源地址为你的出口 IP。
  4. 目的地址写私网 IP,不要写 EIP。 官方文档特别说明:对绑定了 EIP 的 ECS,网络 ACL 规则的目的地址应配置为 ECS 的私有 IP,配成 EIP 规则不会生效。
  5. 响应流量不用单独放行。 华为云网络 ACL 是有状态的,入方向放通后,对应的响应流量会自动允许流出。
  6. 改完规则后已有连接可能不立即生效。 网络 ACL 基于连接跟踪,规则变更对已建立的长连接不会马上生效,重新发起一次新连接再测。

流量的匹配顺序是先过网络 ACL,再过安全组,两层都放行才能到达实例。

4. 第四层:实例内防火墙(firewalld / iptables / ufw)与访问控制

云上两层都放通了还是超时或被重置,下一步就要看操作系统内部。这一层需要先通过 VNC 登录到实例。

4.1 系统防火墙

# CentOS / EulerOS / openEuler 等使用 firewalld 的系统
systemctl status firewalld
firewall-cmd --state
firewall-cmd --list-all
# 放通 ssh 服务(默认 22)
firewall-cmd --permanent --add-service=ssh
# 若 sshd 改了端口,例如 2222
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload

# Ubuntu / Debian 使用 ufw
ufw status verbose
ufw allow 22/tcp
# 改过端口时
ufw allow 2222/tcp

# 直接查看 iptables / nftables 规则
iptables -L INPUT -n --line-numbers
nft list ruleset 2>/dev/null | head -n 50

有一个常见的坑:在 ufw 默认策略为 deny 的情况下执行 ufw enable,而事先没有 ufw allow 22/tcp,当前会话可能还在,但新的 SSH 连接全部进不来。官方故障排除文档中 read: Connection reset by peer 的处理方法里,也给出了安全组放行 + ufw allow 22 的组合。

4.2 TCP Wrappers(hosts.deny / hosts.allow)

官方排查思路中提到要检查 /etc/hosts.deny 里是否写了本地 PC 的 IP。部分发行版较新的 OpenSSH 已不再链接 TCP Wrappers,但看一眼成本很低:

grep -v '^#' /etc/hosts.deny /etc/hosts.allow 2>/dev/null

4.3 主机安全服务(HSS)的 SSH 登录白名单 / 暴力破解拦截

如果开启了华为云主机安全服务,还有两个容易被忽视的点(以官方文档为准):

  1. 在主机安全服务的“事件管理”里,看你的出口 IP 是否因为多次输错密码被判定为暴力破解而被拦截。
  2. 如果开启了“SSH 登录白名单”,只有白名单内的 IP 才能登录,换了出口 IP 就要先加白名单。

5. 第五层:sshd 服务本身——在不在跑、在听哪个端口

Connection refused 的意思是:数据包已经到达实例,但对应端口上没有进程在监听(或被防火墙以 reject 方式拒绝)。这时候重点看 sshd。

# 服务状态(Ubuntu/Debian 上服务名可能是 ssh)
systemctl status sshd || systemctl status ssh

# 是否在监听,以及监听的地址和端口
ss -tlnp | grep -E 'sshd|:22 '

# 检查配置文件语法,有错误会直接打印出来
sshd -t

# 查看最近的启动日志
journalctl -u sshd -n 50 --no-pager || journalctl -u ssh -n 50 --no-pager

检查清单:

  1. 端口是否被改过。 grep -i '^Port' /etc/ssh/sshd_config 看一下实际端口,客户端用 ssh -p 指定。改端口时安全组、网络 ACL、系统防火墙三处都要同步,这是官方“修改默认 SSH 端口后无法登录”文档里列出的典型原因。
  2. ListenAddress 是否写死了某个 IP。 如果写成了其他网卡或旧的私网 IP,sshd 会监听在错误地址上。
  3. 配置文件语法错误。 改完 sshd_config 直接 systemctl restart sshd,如果语法错了服务会起不来。我一般会先 sshd -t 通过再重启,并且保留当前会话不关,在新窗口里测试登录。
  4. 服务起不来的其他原因: 下面这些在官方故障排除文档中都有对应条目:
    • status=203/EXEC:通常是 PATH 环境变量被改或 sshd 可执行文件缺失,可以检查 echo $PATH、ls -l /usr/sbin/sshd,必要时重装 openssh-server。
    • /var/empty/sshd must be owned by root:特权分离目录属主或权限不对(CentOS 7/EulerOS 场景)。
    • 主机密钥 /etc/ssh/ssh_host_*_key 权限过大或丢失。
# /var/empty/sshd 属主与权限(CentOS 7 / EulerOS 场景)
ls -ld /var/empty/sshd
chown -R root:root /var/empty/sshd
chmod -R 711 /var/empty/sshd

# 主机私钥权限应为 600
ls -l /etc/ssh/ssh_host_*
chmod 600 /etc/ssh/ssh_host_*_key

# 主机密钥丢失时重新生成(会导致客户端出现指纹变化提示,属于预期)
ssh-keygen -A
systemctl restart sshd

6. 第六层:sshd 认证配置——root、密码、用户白名单

能连上、能看到 password: 或 Authentications that can continue,但最后被拒绝,就进入了认证层。先看 sshd_config 里这几个参数:

grep -Ei '^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication|AllowUsers|DenyUsers|AllowGroups|DenyGroups|MaxAuthTries|AuthorizedKeysFile)' /etc/ssh/sshd_config

# 很多新发行版还会从子目录加载配置,后加载的可能覆盖前面的值
ls /etc/ssh/sshd_config.d/ 2>/dev/null && grep -rEi 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config.d/

# 查看最终生效值(最可靠)
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'
参数 影响 对应现象
PermitRootLogin no 禁止 root 登录 用 root 登录提示 Access denied / Permission denied
PermitRootLogin prohibit-password root 只能用密钥,不能用密码 密钥能登录,密码登录一直失败
PasswordAuthentication no 禁止密码认证 No supported authentication methods available、Permission denied (publickey)
AllowUsers / DenyUsers / AllowGroups / DenyGroups 用户/组白名单与黑名单 日志里出现 not allowed because not listed in AllowUsers 等
MaxAuthTries 单次连接允许的认证尝试次数 Too many authentication failures

几个容易混淆的点:

  1. 官方文档说明,拒绝策略优先于允许策略:同一个用户同时出现在 AllowUsers 和 DenyUsers 中时无法登录。
  2. sshd -T 打印的是合并所有配置文件之后的最终值,比肉眼读 sshd_config 更准。/etc/ssh/sshd_config.d/ 里的云镜像预置文件经常把 PasswordAuthentication 重新设成 no。
  3. 改完配置要重启服务才生效:
sshd -t && systemctl restart sshd

认证失败时,服务端日志能直接告诉你原因:

# CentOS / EulerOS / openEuler
tail -n 50 /var/log/secure
# Ubuntu / Debian
tail -n 50 /var/log/auth.log
# 通用
journalctl -u sshd --since "10 min ago" --no-pager

另外,官方故障排除文档还收录了几类 PAM 层面导致的认证失败,比如连续输错密码触发 pam_tally2/pam_faillock 锁定(报错 The account is locked due to 3 failed logins),以及 /etc/security/limits.conf 中 nofile 设置超过内核 fs.nr_open 导致的 Permission denied。日志里看到 PAM 相关字样时,可以按报错原文在官方文档里搜对应条目。

7. 第七层:密码凭证与重置密码

如果确认配置允许密码登录,但密码就是不对,或者根本不记得密码,就需要重置。

先确认实例的登录凭证类型。 官方文档说明:

  • 创建时选“密码”:用设置的密码登录,用户名为 root。
  • 创建时选“密钥对”:首次登录要用 SSH 密钥方式;如果想用 VNC,需要先用密钥登录后执行 passwd 设置密码,或者通过控制台重置密码。
  • 创建时选“创建后设置”:需要先在控制台“重置密码”。

控制台重置密码的两种方式(以官方文档为准):

方式 依赖 支持的状态 生效时间
在线重置密码 需开通并授权云运维中心(COC),实例需安装 UniAgent 运行中 修改后立即生效,无需重启
离线重置密码 依赖一键式重置密码插件 CloudResetPwdAgent 运行中 / 关机 运行中需重启后生效;关机状态下开机后生效

关于一键式重置密码插件,有几条值得记住的官方说明:

  1. 公共镜像创建的 ECS 默认已安装;私有镜像创建的 ECS 需要自行安装。
  2. 重装、切换操作系统或更换系统盘后,离线重置密码功能会失效,需要重新安装插件。
  3. 安装后不要自行卸载插件或删除其进程,否则离线重置会失败。
  4. 如果之前没装插件、现在又登不上去,就只能选择其他方式,比如在线重置,或参考官方“重置 Linux 云服务器密码(未安装重置密码插件)”的方法。

在实例内检查插件是否存在:

# 官方文档给出的检查方式
ls -lh /Cloud*

# 查看插件服务状态(服务名以实际安装为准)
systemctl status cloudResetPwdAgent 2>/dev/null || ps -ef | grep -i resetpwd | grep -v grep

离线重置后最常见的问题是**“重置了但新密码登不上”**:多数是因为实例没重启,或者重启后插件没有正常启动。官方文档针对开启 SELinux 导致插件启动失败的情况给出了处理方法(临时 setenforce 0 后重新安装插件),具体步骤以官方文档为准。

还有一个和插件相关的小细节:官方说明,较早创建的云服务器上插件采用 AUTO 模式,会随机占用 31000~32999 范围内的一个端口;新创建的默认 PIPE 模式不占端口。如果业务端口恰好落在这个范围内被占用,可以参考官方“业务端口被一键式重置密码插件占用”的条目。

8. 第八层:密钥对与文件权限

Permission denied (publickey) 是密钥登录里最常见的报错。它可能来自客户端(私钥不对、权限不对),也可能来自服务端(公钥没写进去、目录权限不对)。

8.1 客户端侧

# 私钥权限过宽时,OpenSSH 客户端会直接拒绝使用它(UNPROTECTED PRIVATE KEY FILE)
chmod 400 ~/.ssh/kp-xxx.pem

# 显式指定私钥,并只使用这把私钥
ssh -i ~/.ssh/kp-xxx.pem -o IdentitiesOnly=yes root@<EIP>

# 看看这把私钥对应的公钥,和服务端 authorized_keys 里的是否一致
ssh-keygen -y -f ~/.ssh/kp-xxx.pem

检查清单:

  1. 用的是不是创建这台 ECS 时选的那个密钥对。控制台的实例详情里可以看到绑定的密钥对名称。
  2. 用户名对不对。官方文档说明,使用 SSH 密钥方式登录时,非 CoreOS 的公共镜像用户名为 root,CoreOS 为 core。私有镜像或自建镜像以实际为准。
  3. Windows 上用 PuTTY 时,需要先用 PuTTYgen 把 .pem 转成 .ppk。

8.2 服务端侧(在 VNC 中操作)

sshd 默认开启 StrictModes,会检查用户主目录、.ssh 目录和 authorized_keys 的属主和权限,权限过宽时直接拒绝公钥认证。官方故障排除文档中 Authentication refused: bad ownership or modes for directory /root 就是这一类。

# 以 root 为例,普通用户把 /root 换成 /home/<user>,属主换成对应用户
ls -ld /root /root/.ssh
ls -l /root/.ssh/authorized_keys

chown -R root:root /root/.ssh
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
# 主目录不应对组和其他用户可写
chmod go-w /root

# 确认公钥确实在里面,且每把公钥占一行、没有被换行截断
cat /root/.ssh/authorized_keys

推荐的权限基线:

路径 权限 属主
用户主目录 不可被组/其他用户写(如 755 或 700) 对应用户
~/.ssh 700 对应用户
~/.ssh/authorized_keys 600 对应用户
本地私钥 .pem 400 或 600 本地用户
/etc/ssh/ssh_host_*_key 600 root

另外两个隐藏因素:

  • SELinux 上下文:用 cp/mv 放进去的 authorized_keys 可能带着错误的安全上下文,可以执行 restorecon -Rv /root/.ssh 恢复。官方“深度诊断”的检查项里也有一项 SELinux 状态检查。
  • AuthorizedKeysFile 被改:如果 sshd -T | grep authorizedkeysfile 显示的路径不是默认的 .ssh/authorized_keys,公钥要放到对应位置。

9. 第九层:系统层故障——磁盘满、/etc 权限、关键文件损坏

如果 VNC 能登进去,但 sshd 怎么也起不来;或者 VNC 也登不进去,就要看系统层。

9.1 磁盘或 inode 写满

根分区写满时,sshd 可能无法写日志、PAM 无法写会话记录,表现为登录卡住或一登就断。

df -h          # 看空间
df -i          # 看 inode,小文件很多时 inode 会先满
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15

# 已删除但仍被进程占用的大文件
lsof +L1 2>/dev/null | head -n 20

# 清理 journal 日志到指定大小
journalctl --vacuum-size=200M

9.2 关键配置或目录权限被误改

官方“错误的系统配置导致启动或远程登录失败”文档列出了几类典型问题:/etc/fstab 配置错误、SELinux 配置错误、/etc/security/limits.conf 配置错误、/etc/passwd 和 /etc/shadow 格式错误或被删、/etc/ssh 目录或 sshd_config 被删、SSH 公私钥权限过大等。

常见的情况是对 /etc 或 / 执行了递归的 chmod/chown,例如 chmod -R 777 /etc,sshd 会因为主机密钥权限过宽而拒绝启动。可以按下面的顺序检查:

ls -ld /etc /etc/ssh
ls -l /etc/ssh/
ls -l /etc/passwd /etc/shadow /etc/group

# 常见的参考权限(不同发行版可能略有不同,以发行版默认值为准)
# /etc/passwd  644   /etc/group 644
# /etc/shadow  000 或 640(Debian 系为 640,属组 shadow)
# /etc/ssh/ssh_host_*_key  600

9.3 VNC 也进不去时的兜底方案

按官方文档,可以考虑以下几种手段(操作前都建议先给系统盘创建快照):

  1. 一键诊断 / 深度诊断:ECS 控制台提供远程登录诊断和“深度诊断”(依赖云运维中心 COC,首次使用需开通授权),会检查 sshd 进程、22 端口监听、SSH 关键文件、公私钥权限、是否禁止 root 登录、防火墙、SELinux、磁盘使用率、fstab 等项目,很适合快速定位。
  2. 单用户模式 / 救援模式:通过 VNC 在 GRUB 界面编辑内核参数进入单用户模式修复,具体步骤因发行版而异,以官方“Linux 云服务器如何进入单用户模式”条目为准。注意官方提示部分 Euler 镜像的 GRUB 编辑需要额外的用户名密码。
  3. 挂载到另一台实例修复:停止异常实例,卸载系统盘,作为数据盘挂到同区域同可用区的一台正常实例上,在 /mnt/etc/... 下修复配置或权限,再挂回原实例作为系统盘。官方文档有完整的操作步骤。
  4. 以上都不行,记录资源 ID、问题发生时间和报错截图,提交工单。

10. 第十层:客户端自身的问题

最后这一层不在服务器上,但同样常见。

10.1 Host key verification failed

完整报错通常伴随 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!。官方解释为:首次连接时客户端把服务器公钥存进 ~/.ssh/known_hosts,如果服务器重装过系统、重新生成了主机密钥,或者同一个 EIP 被换绑到了别的实例上,指纹就对不上。

# 删除该 IP 的旧记录(在本地客户端执行)
ssh-keygen -R <EIP>
# 改过端口的写法
ssh-keygen -R "[<EIP>]:2222"

需要注意:这个提示本身是一种安全保护。只有在你确认服务器确实重装过、或 EIP 确实换绑过的情况下才删除旧记录;如果什么都没动过却突然指纹变化,要先排查是否存在中间人风险。

10.2 Too many authentication failures

官方文档把它归因于服务端 MaxAuthTries 的重试限制。实际中还有一个很常见的客户端原因:本地 ssh-agent 里加载了很多把私钥,客户端逐个尝试,还没轮到正确的那把,就已经超过服务端的尝试次数了。

# 只用指定的私钥,不去尝试 agent 里的其他密钥
ssh -o IdentitiesOnly=yes -i ~/.ssh/kp-xxx.pem root@<EIP>

# 想用密码登录时,跳过公钥尝试
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password root@<EIP>

# 查看 agent 里有多少把密钥
ssh-add -l

也可以在 ~/.ssh/config 里为这台主机固定配置,后续就不用每次敲参数:

cat >> ~/.ssh/config <<'CONF'
Host hw-ecs
    HostName <EIP>
    User root
    Port 22
    IdentityFile ~/.ssh/kp-xxx.pem
    IdentitiesOnly yes
    ServerAliveInterval 30
CONF

ssh hw-ecs

11. 常见报错含义对照

报错 含义 优先排查方向
Connection timed out TCP 握手没有回应,包被丢弃 EIP 是否正确/已绑定、安全组入方向、网络 ACL、本地网络封堵、实例防火墙 DROP
Connection refused 包到了实例,但端口没有进程在听,或被 REJECT sshd 是否运行、Port/ListenAddress、端口是否写错、防火墙 REJECT
Connection reset by peer / Connection closed by <IP> 连接建立后被对端重置或关闭 系统防火墙、主机安全拦截、hosts.deny、MaxStartups 限流、sshd 异常
Permission denied (publickey) 服务端只接受公钥,且公钥认证失败 私钥是否匹配、用户名、authorized_keys 内容和 600/700 权限、PasswordAuthentication no
Permission denied, please try again. 密码错误,或用户被配置限制 重置密码、AllowUsers/DenyUsers、PermitRootLogin、PAM 配置
Access denied 账号或密码错误,或禁止 root 登录 密码、PermitRootLogin
No supported authentication methods available 客户端提供的认证方式服务端都不支持 服务端关闭了密码认证而客户端只提供密码
Too many authentication failures 单次连接认证尝试次数超限 客户端加 IdentitiesOnly=yes、检查 MaxAuthTries
Host key verification failed 服务器主机密钥与本地记录不一致 确认重装/换绑后执行 ssh-keygen -R
UNPROTECTED PRIVATE KEY FILE! 本地私钥权限过宽,客户端拒绝使用 chmod 400 私钥
Authentication refused: bad ownership or modes(服务端日志) 主目录或 .ssh 权限/属主不对 修正属主和 700/600 权限
The account is locked due to N failed logins PAM 连续失败锁定 等待解锁或按官方文档处理 PAM 配置

12. 一张速查表

排查时可以从上到下逐行打勾:

层级 检查项 在哪看 / 怎么查 通过标准
0 报错原文 ssh -v root@<EIP> 明确卡在哪一步
0 VNC 能否登录 控制台“远程登录”→ VNC 能登录则系统基本正常
1 实例状态 ECS 列表 运行中
1 EIP 实例详情 已绑定且地址正确
1 本地网络 换热点、nc -vz <EIP> 22 端口可达
2 安全组 实例详情“安全组”页签 入方向允许 TCP 22,源地址包含出口 IP,无更高优先级拒绝
3 网络 ACL 子网关联的 ACL 未关联,或有允许 TCP 22 的规则(目的为私网 IP)
4 系统防火墙 firewall-cmd --list-all / ufw status / iptables -L -n 已放通 sshd 端口
4 主机安全 HSS 事件管理、SSH 白名单 出口 IP 未被拦截
5 sshd 进程与端口 systemctl status sshd、ss -tlnp、sshd -t active (running),监听正确端口,语法无误
6 认证配置 sshd -T root、密码/公钥认证与预期一致
7 密码 控制台重置密码(在线/离线) 新密码已生效(离线需重启)
8 密钥 ssh-keygen -y -f、ls -l ~/.ssh 公私钥匹配,700/600,属主正确
9 磁盘与系统文件 df -h、df -i、ls -l /etc/ssh 空间充足,关键文件存在且权限正确
9 兜底 深度诊断、单用户模式、挂载系统盘修复、工单 先快照再操作
10 本地客户端 ssh-keygen -R、IdentitiesOnly=yes 无旧指纹、无多余密钥干扰

写在最后

SSH 登录失败看起来是一个问题,其实是一条链路上的十几个检查点。按“能不能到 → 有没有在听 → 认证过不过 → 系统好不好”的顺序逐层排查,再配合 ssh -v 和服务端日志,基本都能定位到具体原因。

最后提几个预防的小建议:

  1. 改 sshd_config 前先备份,改完先 sshd -t,并保留一个已登录的会话,在新窗口测试通过后再关闭旧会话。
  2. 改 SSH 端口时,安全组、网络 ACL、系统防火墙三处同步修改。
  3. 安全组源地址尽量收紧到已知 IP 或 IP 地址组,不要长期对 0.0.0.0/0 开放 22 端口。
  4. 私有镜像创建的实例,登录正常时就把一键式重置密码插件装好,别等登不上了才想起来。
  5. 对系统盘做定期快照,系统层出问题时可以从容地挂盘修复或回滚。

文中涉及的控制台路径和功能依赖,以华为云官方文档的最新版本为准。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。