嘗試使用 SSH 連線至 EC2 執行個體時收到「連線遭拒」或「連線逾時」錯誤。如何解決此錯誤?

上次更新日期:2021-10-08

嘗試使用 SSH 連線至 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體時收到「連線遭拒」或「連線逾時」錯誤。如何解決此錯誤?

簡短描述

錯誤訊息:「ssh:連線到主機 ec2-X-X-X-X.compute-1.amazonaws.com 連接埠 22:連線逾時」。此錯誤訊息來自 SSH 用戶端。該錯誤表示伺服器沒有回應用戶端,用戶端程序已放棄 (逾時)。以下是造成此錯誤的常見原因:

  • 安全群組或網路 ACL 不允許存取。
  • 執行個體的作業系統上有防火牆。
  • 用戶端與伺服器之間有防火牆。
  • 主機不存在。

錯誤訊息:「ssh:連線到主機 ec2-X-X-X-X.compute-1.amazonaws.com 連接埠 22:連線遭拒」。此訊息來自遠端主機。以下是造成此錯誤的常見原因:

  • 主機已連線到執行個體,但沒有服務在 SSH 連接埠上接聽。
  • 防火牆已封鎖,並設定為拒絕套裝服務,而非捨棄套裝服務。

解決方案

請確認下列幾點:

有四種方法可以執行這些任務:

方法 1:使用 EC2 序列主控台

如果您設定適用於 Linux 的 EC2 序列主控台,則可以使用它來為支援的 Nitro 執行個體類型進行疑難排解。序列主控台可助您對啟動問題、網路組態和 SSH 組態問題進行疑難排解。序列主控台可連線您的執行個體,而無需工作網路連線。您可以使用 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI) 存取序列主控台。

使用序列主控台之前,請先在帳戶層級授與存取權。然後,建立 AWS Identity and Access Management (IAM) 政策,向您的 IAM 使用者授予存取權。此外,每個使用序列主控台的執行個體必須至少包含一個以密碼為基礎的使用者。如果您的執行個體無法存取且您尚未設定對序列主控台的存取權,則請遵循方法 2、3 或 4 中的指示操作。如需有關適用於 Linux 的 EC2 序列主控台的設定資訊,請參閱設定對 EC2 序列主控台的存取權

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

方法 2:使用 AWS Systems Manager Session Manager

注意:安裝 SSM Agent 需要使用此方法。如需工作階段管理員和完整必要條件清單的詳細資訊,請參閱設定工作階段管理員

1.    開啟 AWS Systems Manager 主控台

2.    啟動工作階段

3.    在規則資料表頂端另外新增下列這行,然後重新啟動 SSH 服務:

$ sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
$ sudo service sshd restart

或者,您也可以停用防火牆。最佳實務是使用安全群組而非防火牆。

若要停用防火牆,請根據您的作業系統,使用下列其中一組命令:

使用簡單防火牆的 Ubuntu

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

使用 firewalld 的發行版本 (例如,Red Hat 或 CentOS)

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

注意:前面的命令會排清所有主要的 iptables 規則,並新增一個允許傳入 SSH 連線的規則。在執行這些命令之前請考慮到這一點,因為您可能有其他需要設定的規則。在重新取得執行個體的存取權後,請檢閱您的防火牆組態 (例如 UFW、firewalld、iptables)。

4.    確定 SSH 正在執行,並驗證 SSH TCP 連接埠 (22) 處於接聽狀態。

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

注意:如果您的系統沒有 ss 命令,則可以搭配使用舊式 netstat 命令與前面範例所示的同一個語法。

5.    結束工作階段

6.    使用 SSH 連線至執行個體。

方法 3:執行 AWSSupport-TroubleshootSSH 自動化文件

AWSSupport-TroubleshootSSH 自動化文件會在執行個體上安裝 Amazon EC2Rescue 工具。該工具會檢查並更正透過 SSH 連線至 Linux 機器時導致遠端連線錯誤的一些問題。如需詳細資訊,請參閱 嘗試使用 SSH 連線至 EC2 執行個體時收到錯誤訊息。如何使用 AWSSupport-TroubleshootSSH 自動化工作流程來排查 SSH 連線問題?

方法 4:使用使用者資料指令碼

重要

  • 此程序需要停止和啟動 EC2 執行個體。請注意,如果您的執行個體由執行個體存放區支援,或者具有包含資料的執行個體存放區磁碟區,則當停止執行個體時,資料會丟失。如需詳細資訊,請參閱判斷執行個體的根裝置類型
  • 如果您的執行個體是 Amazon EC2 Auto Scaling 群組的一部分,或者您的執行個體是由使用 AWS Auto Scaling 的服務 (例如 Amazon EMR、AWS CloudFormation、AWS Elastic Beanstalk 等) 啟動的,則停止執行個體可能會終止執行個體。在此情況下,執行個體是否終止取決於 Auto Scaling 群組的執行個體縮減保護設定。如果您的執行個體屬於 Auto Scaling 群組,則請先從 Auto Scaling 群組中暫時移除該執行個體,然後再開始解決方案步驟。
  • 停止和啟動執行個體會變更執行個體的公有 IP 地址。在將外部流量路由到您的執行個體時,最佳實務是使用彈性 IP 地址而不是公有 IP 地址。

1.    檢視 EC2 執行個體主控台日誌。如果 UFW 已開啟,則 EC2 執行個體主控台日誌中會出現以下項目。

systemd[1] : starting Uncomplicated Firewall
Starting Uncomplicated firewall...

2.    開啟 Amazon EC2 主控台

3.    從導覽窗格中選擇 Instances (執行個體),然後選取您嘗試要連線到的執行個體。

4.    停止執行個體

5.    選擇 Actions (動作)Instance Settings (執行個體設定)Edit User Data (編輯使用者資料)

6.    將以下使用者資料指令碼複製到 Edit User Data (編輯使用者資料) 對話方塊,然後選擇 Save (儲存)

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 -F
service sshd restart
--//

注意:前述的命令會排清所有主要的 iptables 規則,而不僅僅是連接埠 22 的規則。在重新取得執行個體的存取權後,請檢閱您的防火牆組態 (例如,UFW、firewalld、iptables)。

7.    使用 SSH 連線至執行個體。

8.    前述的使用者資料指令碼設為在每次重新啟動執行個體時執行。重新獲得對執行個體的存取權後,移除使用者資料指令碼。

若要移除使用者資料:

1.    完成方法 4:使用使用者資料指令碼一節中的步驟 1 到步驟 4。

2.    在 Edit User Data (編輯使用者資料) 對話方塊中刪除使用者資料指令碼。