跳至內容

如何對使用 SSH 連線到 EC2 執行個體時,發生的「連線遭拒」或「連線逾時」錯誤進行疑難排解?

3 分的閱讀內容
0

當我使用 SSH 連線到 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時,收到「連線遭拒」或「連線逾時」錯誤。

簡短描述

如果您的連線逾時,那麼您會從 SSH 用戶端收到以下錯誤訊息:

「ssh:連線到主機 ec2-X-X-X-X.compute-1.amazonaws.com 連接埠 22: 連線逾時」

當伺服器沒有回應用戶端且用戶端程式放棄等待 (逾時) 時,就會發生連線逾時錯誤。

如果主機遠端拒絕您的連線,那麼您將收到以下錯誤訊息:

「ssh:連線到主機 ec2-X-X-X-X.compute-1.amazonaws.com 連接埠 22: 連線遭拒」

解決方法

「連線逾時」錯誤

如果您收到連線逾時錯誤,請確認下列組態:

**注意:**若要檢查防火牆或 TCP Wrappers 的問題,您必須具有對執行個體的作業系統 (OS) 存取權。

「連線遭拒」錯誤

如果您收到連線遭拒錯誤,請確認下列組態:

  • 執行個體上沒有防火牆封鎖 SSH 連線。
  • SSH 常駐程式 (sshd) 正在執行並接聽連接埠 22。

**注意:**若要檢查上述組態,您必須具備執行個體的作業系統層級存取權。

對通過兩個運作狀態檢查的執行個體問題進行疑難排解

若要對通過運作狀態檢查的執行個體問題進行疑難排解,請使用下列其中一種疑難排解方法。

執行 AWSSupport-TroubleshootSSH 執行手冊

最佳做法是執行 AWSSupport-TroubleshootSSH 自動化執行手冊。該執行手冊會在您的執行個體上安裝 Amazon EC2Rescue 工具,以識別並修復封鎖遠端 SSH 連線至 Linux 主機的問題。

使用適用於 Linux 的 EC2 序列主控台

使用適用於 Linux 的 EC2 序列主控台來對作業系統層級問題進行疑難排解,例如支援執行個體類型上的開機問題、網路組態問題和 SSH 組態問題。

先決條件:

如需詳細資訊,請參閱設定 EC2 序列主控台的存取權

如果沒有設定登入密碼的 Linux 帳戶,您必須執行 ssm-user 來重設具有 sudo 存取權限的帳戶的密碼。

若要確認您的組態未封鎖 SSH 存取,請完成下列步驟:

  1. 使用 EC2 序列主控台以密碼設定的 Linux 使用者身分連線到 EC2 執行個體

  2. 如果您設定了 iptables 規則,請執行以下命令以在 iptables 中新增一條規則,以接受所有來自連接埠 22 的 SSH 連線:

    sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
  3. 如果您使用以作業系統為基礎的防火牆,請將其停用。最佳做法是使用安全群組而不是防火牆。若要停用以作業系統為基礎的防火牆,請根據您的作業系統執行下列命令。
    重要:以下命令清除所有主 iptables 規則並刪除現有規則。這些命令還會新增允許傳入 SSH 連線的規則,並將主鏈的預設政策變更為接受。此組態可確保清除 iptables 規則時,不會影響執行個體網路連線。
    使用 UFW 的發行版,例如 Ubuntu 和 Debian:

    sudo iptables -F$ sudo iptables -P INPUT ACCEPT
    sudo ufw disable

    使用防火牆的發行版,例如 Red Hat Enterprise Linux (RHEL) 和 CentOS:

    sudo iptables -F $ sudo iptables -P INPUT ACCEPT
    sudo systemctl disable firewalld

    **注意:**重新取得執行個體的存取權後,請檢查防火牆組態。

  4. 若要確認 SSH 是否正在執行,以及 SSH TCP 連接埠 22 是否處於接聽狀態,請執行下列命令:

    sudo systemctl restart sshd$ sudo ss -tpln | grep -iE '22|ssh'LISTEN 0 128 *:22 *:* users:(("sshd",pid=1901,fd=3))
    LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1901,fd=4))

    **注意:**如果您的系統沒有 ss 命令,請用舊版 netstat 命令替換 ss。請務必使用與上述命令相同的語法。

  5. 若要確定 TCP Wrapper 未封鎖 SSH 連線,請執行下列命令:

    if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
    then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
  6. 使用 SSH 連線到執行個體

  7. 中斷與 EC2 序列主控台工作階段的連線

使用 Systems Manager

先決條件:若要使用 Session Manager (AWS Systems Manager 的一項功能),您的執行個體必須是受管節點。執行個體的 AWS Systems Manager Agent (SSM Agent) ping 狀態必須為線上,且附加的 IAM 角色必須具有 AmazonSSMManagedInstanceCore 權限。請確定您遵守所有 Session Manager 先決條件

使用 Session Manager 來啟動工作階段,以存取執行個體。

使用使用者資料指令碼

如果您無法使用上述疑難排解方法,請使用使用者資料指令碼停用作業系統層級防火牆和 TCP Wrapper。然後,重新啟動 sshd 服務。

**重要:**在停止和啟動執行個體之前,請執行下列動作:

**注意:**當您停止和啟動執行個體時,該執行個體的公有 IP 位址也會變更。最佳做法是使用彈性 IP 位址而不是公用 IP 位址,將外部流量路由到執行個體。

若要設定執行個體的使用者資料,請完成下列步驟:

  1. 開啟 Amazon EC2 console (Amazon EC2 主控台)。
  2. 在導覽窗格中,選擇 Instances (執行個體),然後選取您的執行個體。
  3. 停止執行個體
  4. 選擇 Actions (動作),然後選擇 Instance settings (執行個體設定)。
  5. 選擇 Edit user data (編輯使用者資料),然後輸入下列使用者資料指令碼:
    Content-Type: multipart/mixed; boundary="//"MIME-Version: 1.0
    
    --//
    Content-Type: text/cloud-config; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Content-Disposition: attachment; filename="cloud-config.txt"
    
    #cloud-config
    cloud_final_modules:
    - [scripts-user, always]
    
    --//
    Content-Type:
        text/x-shellscript; charset="us-ascii"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Content-Disposition: attachment; filename="userdata.txt"
    
    #!/bin/bash
    iptables -P INPUT ACCEPT
    iptables -F
    systemctl restart sshd.service || service sshd restart
    if [[ $( cat /etc/hosts.[ad]* | grep -vE '^#' | awk 'NF' | wc -l) -ne 0 ]];\
    then sudo sed -i '1i sshd2 sshd : ALL: allow' /etc/hosts.allow; fi
    --//
    **注意:**上述使用者資料指令碼設定為在每次重新啟動執行個體時執行。此方法會移除所有主要 iptables 規則。
  6. 選擇 Save (儲存)。
  7. 使用 SSH 連線到執行個體
  8. 重新取得執行個體存取權後,請移除使用者資料指令碼,然後確認防火牆組態是否正確。

相關資訊

連線至執行個體時發生錯誤: 連線逾時

如何對來自網際網路的 Amazon EC2 執行個體連線逾時錯誤進行疑難排解?

如何對使用 SSH 連線至 Amazon EC2 Linux 執行個體的問題進行疑難排解?

為什麼我的 EC2 Linux 執行個體無法連線且狀態檢查失敗?