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

上次更新日期: 2021- 年 4 月 27 日

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

簡短描述

錯誤訊息: "Error connecting to [instance], reason: Connection timed out: connect" 是指與執行個體的連線問題,這意味著請求無法到達執行個體並且逾時。如果 SSH 未在執行個體上執行或防火牆封鎖存取,則可能會發生這種情況。

錯誤訊息: "ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection refused" 表示執行個體拒絕連線或 SSH 服務常駐程式未執行。如果防火牆拒絕存取執行個體,也可能會發生此錯誤。

解決方案

驗證以下內容:

  • 沒有防火牆封鎖連線。
  • SSH 服務正在執行個體上執行。
  • SSH tcp 連接埠 22 處於偵聽狀態。

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

方法 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 工作階段管理員

注意:使用此方法需要安裝 SSM 代理程式。如需有關工作階段管理員的詳細資訊及先決條件的完整清單,請參閱設定工作階段管理員

1.    開啟 AWS Systems Manager 主控台

2.    開始工作階段

3.    若要停用防火牆並重新啟動 SSH 服務,請執行以下名利。

$ sudo iptables -F
$ sudo service sshd restart

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

4.    驗證 SSH tcp 連接埠 (22) 處於偵聽狀態。

$ sudo netstat -tnlp | grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      849/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      849/sshd

5.    結束工作階段

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

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

AWSSupport-TroubleshootSSH 自動化文檔會在執行個體上安裝 Amazon EC2Rescue 工具。該工具會檢查並更正透過 SSH 連線至 Linux 機器時導致遠端連線錯誤的一些問題。如需詳細資訊,請參閱如何使用 AWSSupport-TroubleshootSSH Automation 工作流程對 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 (編輯使用者資料) 對話方塊中刪除使用者資料指令碼。