解決存取權問題

本頁面提供 Bare Metal 解決方案存取問題的疑難排解提示。

請前往已知問題和限制頁面,查看您的問題是否已解決。

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