云服务器在 Ubuntu 系统升级(尤其是 apt upgrade 或 do-release-upgrade)后出现 SSH 无法连接的情况,是运维过程中非常典型且令人头疼的问题。这通常不是单一原因造成的,而是涉及内核、网络配置、安全策略或服务状态等多个层面的变化。
以下从技术角度梳理的常见原因及排查逻辑,按发生概率从高到低排列:
1. SSH 服务未自动重启或启动失败
这是最常见的原因。系统升级可能更新了 openssh-server 包,但升级脚本有时未能正确触发服务重启,或者因依赖库冲突导致服务启动失败。
- 现象:端口监听正常,但连接超时或被拒绝;或通过控制台(VNC/Serial Console)登录成功,但
systemctl status ssh显示 failed。 - 排查:
- 通过云厂商提供的 VNC 控制台 或 串口控制台 登录服务器。
- 执行
sudo systemctl status ssh查看服务状态。 - 如果服务未运行,尝试手动启动:
sudo systemctl start ssh。 - 检查日志:
journalctl -u ssh -e查看具体报错信息(如权限问题、密钥生成失败等)。
2. 防火墙规则被重置或新规则冲突
Ubuntu 升级过程中,可能会更新 ufw(Uncomplicated Firewall)或 iptables 的配置,特别是如果系统中安装了其他安全软件(如 fail2ban、cloud-init 相关模块),它们可能在升级时重新加载了默认规则,意外阻断了 22 端口。
- 现象:本地 ping 通 IP,但 telnet 22 端口不通。
- 排查:
- 登录控制台后,检查 UFW 状态:
sudo ufw status verbose。 - 检查 iptables 规则:
sudo iptables -L -n -v。 - 临时放行所有流量测试:
sudo ufw allow all(仅限测试,确认后立即恢复最小权限原则)。 - 注意:某些云厂商的安全组(Security Group)与主机内防火墙需同时开放。
- 登录控制台后,检查 UFW 状态:
3. SSH 配置文件语法错误或权限变更
升级过程中,/etc/ssh/sshd_config 可能被替换为默认版本,或与用户自定义配置合并时产生语法错误。此外,关键文件权限也可能被重置。
- 现象:SSH 服务启动失败,日志中提示 "Bad configuration option" 或 "Permissions 0644 for ‘/etc/ssh/sshd_config’ are too open"。
- 排查:
- 验证配置语法:
sudo sshd -t。如果输出错误信息,根据提示修复/etc/ssh/sshd_config。 - 检查权限:确保
/etc/ssh/sshd_config权限为644,属主为root:root。 - 检查
~/.ssh/authorized_keys权限是否为600,目录.ssh为700。
- 验证配置语法:
4. 网络接口配置变更或 IP 地址漂移
升级可能触发了网络管理器(Netplan、NetworkManager)的重置,导致网卡未正确获取 IP,或 DHCP 租约失效。在云服务器环境中,还需考虑弹性公网 IP(EIP)绑定关系是否异常。
- 现象:无法 ping 通服务器 IP,或能 ping 通但 SSH 不通。
- 排查:
- 登录控制台后,执行
ip addr show确认网卡是否有 IP。 - 检查 Netplan 配置:
cat /etc/netplan/*.yaml,确保配置无误并应用:sudo netplan apply。 - 对于使用静态 IP 的实例,确认网关和 DNS 设置是否正确。
- 登录控制台后,执行
5. SELinux 或 AppArmor 策略限制
虽然 Ubuntu 默认禁用 SELinux,但部分企业级镜像或经过安全加固的系统可能启用了 AppArmor。升级可能引入了新的 AppArmor 配置文件,限制了 sshd 的访问权限。
- 现象:SSH 服务看似正常运行,但连接立即断开,日志中出现 AppArmor denied 错误。
- 排查:
- 检查 dmesg 或 syslog:
grep apparmor /var/log/syslog | grep sshd。 - 临时将 AppArmor 设为宽容模式测试:
sudo aa-complain /usr/sbin/sshd。
- 检查 dmesg 或 syslog:
6. 内核模块或加密套件不兼容
较新的 Ubuntu 版本可能默认启用更强的加密算法(如 SHA-2、EdDSA),而客户端(尤其是老旧的 SSH 客户端)不支持这些算法,导致握手失败。反之,旧版 SSH 客户端可能因 TLS/SSL 协议版本不匹配而被拒绝。
- 现象:客户端报 "Unable to negotiate with … no matching key exchange method found" 或类似协商错误。
- 排查:
- 在客户端使用详细模式连接:
ssh -vvv user@ip,查看最后失败的步骤。 - 在服务端
/etc/ssh/sshd_config中添加兼容性选项(谨慎操作):KexAlgorithms +diffie-hellman-group-exchange-sha256 Ciphers +aes128-ctr,aes192-ctr,aes256-ctr
- 在客户端使用详细模式连接:
7. 云厂商元数据服务或初始化脚本干扰
部分云厂商在实例首次启动或升级后会运行 cloud-init 脚本。如果该脚本包含修改 SSH 配置、重置密码或调整网络规则的指令,可能在升级后再次执行,覆盖原有配置。
- 现象:每次重启后 SSH 行为不一致,或密码突然失效。
- 排查:
- 检查
/var/log/cloud-init.log。 - 确认是否误将
password_authentication设置为no且未配置公钥认证。
- 检查
✅ 推荐应急处理流程
当 SSH 中断时,请按以下步骤操作:
- 优先使用 VNC/串口控制台登录:这是最可靠的回退路径,不受网络和服务影响。
- 检查 SSH 服务状态:
sudo systemctl restart ssh sudo systemctl enable ssh journalctl -u ssh -f - 验证防火墙:
sudo ufw status sudo iptables -L -n - 检查磁盘空间:
df -h(若根分区满,可能导致日志写入失败或服务异常。)
- 临时允许 root 登录调试(仅用于紧急排查,完成后务必关闭):
在/etc/ssh/sshd_config中设置PermitRootLogin yes,重启 ssh 服务。
重要提醒:在进行任何生产环境升级前,务必创建系统快照或备份关键配置文件(如
/etc/ssh/,/etc/netplan/,/etc/fstab)。升级命令建议使用sudo apt update && sudo apt upgrade -y而非直接do-release-upgrade,以降低风险。
云技术博客