SSH 连接失败排查记录

初始状态

  • 客户端: 本地 Windows (OpenSSH 客户端)
  • 服务器: 云平台 Linux 虚拟机 (Azure)
  • 症状: 本地 SSH 客户端连接失败。
  • 已知条件: 云平台自带的 Bastion(网页终端)可以正常登录。

排查模块一:服务器日志分析

  • 问题: sshd 服务日志 (journalctl -u sshd) 显示多条警告和错误。
    • Deprecated option RhostsRSAAuthentication (及其他 Deprecated 警告)
    • error: Unable to load host key: /etc/ssh/ssh_host_dsa_key
  • 排查过程:
    1. 分析 Deprecated 警告:确认这些是 sshd_config 配置文件中的旧配置项,它们是“警告”而非“错误”,服务会忽略它们并正常运行。
    2. 分析 Unable to load host key:确认 dsa_key 是一种过时的密钥类型,新系统默认不生成。服务会跳过此密钥,正常加载其他(如 RSA, ED25519)密钥。
  • 结论: 服务器日志中的这些条目不是导致连接失败的原因。

排查模块二:网络连通性测试

  • 问题: 本地客户端与服务器 22 端口之间的网络是否被防火墙(云平台 NSG 或系统防火墙)阻挡?

  • 排查过程:

    1. 在本地 Windows PowerShell 终端执行端口连通性测试:

      1
      Test-NetConnection -ComputerName [服务器IP] -Port 22
  • 结论:

    • 命令返回 TcpTestSucceeded : True
    • 这证明网络路径畅通,且云平台防火墙 (NSG) 和服务器系统防火墙均正确允许 22 端口的流量。

排查模块三:身份验证排查

  • 问题: 网络畅通,为何连接失败?

  • 排查过程 (1):分析服务器实时日志 (误导信息)

    1. 在服务器上运行 sudo journalctl -f -u sshd 实时监控。
    2. 在本地尝试登录。
    3. 服务器日志显示 Failed password for root from [未知IP]
    4. 分析: 日志中的用户名 (root) 和源 IP ([未知IP]) 与本地客户端 (azureuser, [本地IP]) 不符。
    5. 结论: 这是来自互联网的“暴力破解”攻击,与本次排查的登录失败无关,属于背景噪音。
  • 排查过程 (2):分析本地详细日志 (定位原因)

    1. 在本地客户端运行 ssh -vvv azureuser@[服务器IP]
    2. 日志关键信息:
      • Connection established. (连接成功建立)
      • Remote protocol version 2.0, remote software version OpenSSH_9.6p1 Ubuntu... (服务器为新版 OpenSSH)
      • identity file F:\\...\\centos_tydi.pem type -1 (本地正使用一个 .pem 密钥)
      • 日志在 SSH2_MSG_KEXINIT sent 步骤后挂起并最终失败。
    3. 分析: .pem 密钥通常是较旧的 ssh-rsa (SHA-1) 算法。新版 OpenSSH (9.6p1) 出于安全原因默认禁用了此算法。客户端与服务器无法在加密算法上达成一致,导致协商失败。
  • 解决方案 (1):升级密钥 (推荐)

    1. 生成新的 ed25519 密钥对 (ssh-keygen -t ed25519)。
    2. 通过 Bastion 登录,将新 ed25519 公钥添加到服务器的 ~/.ssh/authorized_keys
    3. 修改本地 ~/.ssh/config,将 IdentityFile 指向新 ed25519 私钥
    4. 结果: 登录成功。
  • 解决方案 (2):兼容旧密钥 (不推荐)

    1. 修改本地 ~/.ssh/config 文件,为该主机添加:

      1
      2
      HostkeyAlgorithms +ssh-rsa
      PubkeyAcceptedAlgorithms +ssh-rsa
    2. 结果: 强制本地客户端启用旧算法,亦可登录成功。


排查模块四:周期性“连接超时”问题

  • 问题: 使用新密钥登录成功后,过一段时间(如下次登录),又会偶发“连接超时”。

  • 排查过程:

    1. 询问得知,用户通过 VPN 进行连接。
    2. 分析: VPN 服务在每次重连时会分配不同的出口 IP 地址。
    3. 云平台防火墙 (NSG) 规则被设置为仅允许单个 IP(上次登录的 IP)。
    4. 当 VPN IP 变化后,新 IP 被 NSG 拦截,导致“连接超时”。
  • 解决方案:

    1. 修改云平台 NSG 入站规则,将 SSH (22端口) 的“源 (Source)”设置为 Any (0.0.0.0/0)。