排查访问权限问题

本页面介绍了有关裸金属解决方案访问问题的问题排查提示。

查看您的疑问或问题是否已在已知问题和限制页面中得到解决。

SSH 客户端无法连接

如果您的 SSH 客户端无法连接到服务器,您可能会看到以下错误之一:

  • connection timeoutconnection refused:SSH 客户端无法连接。

  • Permission denied (publickey):SSH 客户端无法进行身份验证。

如需诊断失败的 SSH 连接,请按以下步骤操作:

  1. 测试连接性。

    使用 pingtraceroutenc 命令确保主机可访问并且 SSH 端口 (22) 已打开。

    ping SERVER_NAME
    
    traceroute SERVER_NAME
    
    echo "" | nc SERVER_NAME 22
    

    如果这不起作用,则问题可能在于网络层,与 SSH 无关。

  2. 检查客户端调试输出。

    1. 启用 SSH 协议的详细程度。

      ssh -v SERVER_NAME -i ~/.ssh/id_ecdsa
      

      该命令会输出显示客户端 SSH 协议密钥事件的调试输出。

      以下示例输出显示客户端发送了其密钥,但服务器拒绝了该密钥。服务器要求使用其他公钥继续进行身份验证,但客户端没有额外的密钥可以提供。

      .. .. ..
      debug1: Server host key: ecdsa-sha2-nistp256 SHA256:V9cRYdqcAJv+RPfN+oofNTVdUxs6VlocP4uMWOxeGKI
      debug1: Host 'bms-server' is known and matches the ECDSA host key.
      debug1: Found key in /root/.ssh/known_hosts:1
      debug1: rekey after 134217728 blocks
      debug1: SSH2_MSG_NEWKEYS sent
      debug1: expecting SSH2_MSG_NEWKEYS
      debug1: SSH2_MSG_NEWKEYS received
      debug1: rekey after 134217728 blocks
      debug1: SSH2_MSG_EXT_INFO received
      debug1: kex_input_ext_info: server-sig-algs=
      debug1: SSH2_MSG_SERVICE_ACCEPT received
      debug1: Authentications that can continue: publickey
      debug1: Next authentication method: publickey
      debug1: Offering ECDSA public key: /root/.ssh/id_ecdsa
      debug1: Authentications that can continue: publickey
      debug1: No more authentication methods to try.
      Permission denied (publickey).
      
    2. 如果 SSH 详细输出未明确指出错误消息的原因,请运行 strace 命令:

      strace ssh SERVER_NAME -i ~/.ssh/id_ecdsa > strace-ssh.txt 2>&1
      
    3. 检查 strace 输出是否存在与核心问题相关的错误。

      在某些情况下,凭借客户端调试输出无法确认问题。您可能还需要运行服务器端跟踪来查找错误。无法通过 SSH 连接到服务器后,请使用交互式串行控制台来执行后续步骤。

  3. 检查服务器端调试输出。

    1. 找到当前的 SSH 设置。

      grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
      
    2. 如需获取 SSH 的详细信息,请在 /etc/ssh/sshd_config 文件中设置以下参数。

      SyslogFacility AUTH
      LogLevel DEBUG
      
    3. 如需应用更改,请重启服务。

      service sshd restart
      
    4. 在客户端,运行 ssh 命令并从日志中提取 sshd 消息:

      grep sshd /var/log/messages
      

      或者,您可以使用以下命令导出该时间段内的所有相关消息:

      journalctl -u sshd -S "START_TIME" -U "END_TIME" --utc
      

      替换以下内容:

      • START_TIME:时间段的开始时间,格式为 yyyy-mm-dd hh:mm:ss
      • END_TIME:时间段的结束时间,格式为 yyyy-mm-dd hh:mm:ss

      示例:

      journalctl -u sshd -S "2023-04-25 18:38:00" -U "2023-04-25 18:40:00" --utc
      

如需解决这些问题,请考虑执行以下步骤:

  • 验证客户端密钥文件是否设置了只读权限(标志 400)。否则,SSH 客户端不会接受它。

    如需为正在使用的私钥设置只读标志,请运行以下命令:

    chmod 400 ~/.ssh/id_ed25519
    
  • 在服务器端,检查是否已在相应用户的本地配置文件 (~/.ssh/authorized_keys) 中指定客户端公钥。

  • 在某些情况下,问题可能与 SSH 协议版本或 SSH 算法有关。服务器端和客户端调试输出可能指示此类问题。通常,sshsshd_configman 页面提供了维护必要配置的详细信息。例如,如需查找支持的密钥交换算法或加密算法,请使用以下命令:

    # Find key exchange algorithms
    ssh -Q kex
    # Find the symmetric encryption ciphers
    ssh -Q cipher