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

4 分的閱讀內容
0

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

簡短描述

錯誤訊息:"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection timed out"。此錯誤訊息來自 SSH 用戶端。該錯誤表示伺服器沒有回應用戶端,且用戶端程式放棄 (逾時)。以下是導致此錯誤的常見原因:

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

錯誤訊息:"ssh: connect to host ec2-X-X-X-X.compute-1.amazonaws.com port 22: Connection refused"。此訊息來自遠端主機。以下是導致此錯誤的常見原因:

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

解決方法

「連線逾時」錯誤

對於「連線逾時」錯誤,請檢查下列事項:

**注意:**最後兩個驗證步驟需要執行個體的作業系統層級存取權。

「連線遭拒」錯誤

對於「連線遭拒」錯誤,請驗證下列事項:

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

**注意:**這兩個驗證步驟需要執行個體的作業系統層級存取權。

如果執行個體通過這兩種運作狀態檢查,請將下列四種方法之一與您的組態搭配使用

  • 方法 1: 使用適用於 Linux 的 EC2 序列主控台。
  • 方法 2: 使用 AWS Systems Manager Session Manager。
  • 方法 3: 執行 AWSSupport-TroubleshootSSH 自動化執行手冊。
  • 方法 4: 使用使用者資料指令碼。

方法 1: 使用適用於 Linux 的 EC2 序列主控台

如果已設定,您可以使用適用於 Linux 的 EC2 序列主控台對支援的 Nito 型執行個體類型的作業系統層級問題進行疑難排解。序列主控台可協助您對開機問題、網路組態及 SSH 組態問題進行疑難排解。使用 Amazon EC2 主控台或 AWS Command Line Interface (AWS CLI) 可存取序列主控台。

使用序列主控台之前,先在帳戶層級授予主控台存取權。然後,建立 AWS Identity and Access Management (IAM) 政策,將存取權授予 IAM 使用者。

**注意:**每個使用序列主控台的執行個體都必須包含至少一個具有 sudo 存取權的以密碼為基礎的 Linux 使用者。

如需設定適用於 Linux 的 EC2 序列主控台的詳細資訊,請參閱設定 EC2 序列主控台的存取權。如果沒有設定登入密碼的 Linux 帳戶,您必須執行 ssm-user 來重設具有 sudo 存取權限的帳戶的密碼。如需有關執行 ssm-user 命令的詳細資訊,請參閱 在 Linux 和 macOS 上管理 ssm-user sudo 帳戶許可

設定後,使用設定密碼的 Linux 使用者透過 EC2 序列主控台連線至 EC2 執行個體。

接下來,執行下列命令。這些命令會驗證 SSH 連線不會被作業系統防火牆或 TCP 包裝函式封鎖。這些命令也會驗證 sshd 服務是否正在連接埠 22 上執行並接聽。

1.    如果您已設定 iptables 規則,則執行下列命令以在 iptables 中新增規則以接受預設連接埠 22 上的所有 SSH 連線:

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

由於最佳實務是使用安全群組而非作業系統型防火牆,因此可以完全停用防火牆。若要停用作業系統型防火牆,請視您的作業系統而定,使用下列其中一組命令:

重要:下列命令會排清所有主要的 iptables 規則。它們還會新增一個允許傳入 SSH 連線的規則。此外,它們將主要鏈結的預設政策變更為接受,以便排清 iptables 規則不會影響執行個體網路連線。由於這些命令會排清所有主要 iptables,因此它們也會排清任何現有規則。

使用 UFW 的發行版 (Ubuntu、Debian)

$ 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

**注意:**重新取得執行個體的存取權之後,請檢閱防火牆組態 (UFW、firewalld、iptables)。

2.    驗證 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 命令與上述範例中顯示的相同語法搭配使用。

3.    確保 TCP 包裝函式未封鎖 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

4.    接下來,使用 SSH 連線至執行個體。

5.    如果不再需要 EC2 序列主控台工作階段,請中斷其連線。

方法 2: 使用 AWS Systems Manager Session Manager

注意:若要使用此方法,執行個體必須是 SSM 受管執行個體,且其 SSM 代理程式 ping 狀態必須為線上。如需 Session Manager 和完整的先決條件清單,請參閱設定 Session Manager

若要確認 SSH 連線未被防火牆或 TCP 包裝函式封鎖,且 sshd 服務正在連接埠 22 上執行並接聽:

1.    開啟 AWS Systems Manager

2.    使用 Session Manager 啟動執行個體的工作階段

3.    執行「方法 1: 使用適用於 Linux 的 EC2 序列主控台」中的步驟 1-4。

4.    如果不再需要 Session Manager 工作階段,請關閉它。

方法 3: 執行 AWSSupport-TroubleshootSSH 執行手冊

AWSSupport-TroubleshootSSH 自動化執行手冊會在執行個體上安裝適用於 Linux 的 Amazon EC2Rescue 工具。此工具會檢查並嘗試修正阻止透過 SSH 遠端連線 Linux 主機的問題。

若要執行 AWSSupport-TroubleshootSSH 執行手冊,請執行以下操作:

1.    開啟 AWSSupport-TroubleshootSSH 頁面。

2.    選取 執行此自動化 (主控台)。

如需詳細資訊,請參閱我在嘗試使用 SSH 連線至 EC2 執行個體時收到錯誤。如何使用 AWSSupport-TroubleshootSSH 自動化工作流程對 SSH 連線問題進行疑難排解?

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

如果所述的方法都不適合您的環境,則使用 EC2 使用者資料指令碼。EC2 使用者資料指令碼會關閉作業系統層級防火牆和 TCP 包裝函式,然後重新啟動 sshd 服務。

重要:

  • 此程序需要停止並啟動 EC2 執行個體。如果執行個體具有儲存在執行個體儲存體磁碟區上的任何資料,該資料會在停止執行個體後刪除。
  • 如果執行個體屬於 Amazon EC2 Auto Scaling 群組,則終止執行個體也可能會停止 Auto Scaling 群組內的執行個體。
  • 如果執行個體由使用 AWS Auto Scaling 的服務啟動,則終止執行個體也可能會停止 Auto Scaling 群組內的執行個體。
  • 執行個體終止取決於 Auto Scaling 群組的執行個體縮減保護設定。如果執行個體屬於 Auto Scaling 群組,請先暫時從 Auto Scaling 群組中移除該執行個體,然後再開始解決方法步驟。
  • 停止和啟動執行個體會變更執行個體的公有 IP 地址。將外部流量路由至執行個體時,最佳實務是使用 Elastic IP 地址,而非公有 IP 地址。

請依照以下步驟設定執行個體的使用者資料:

1.    開啟 Amazon EC2 主控台

2.    從導覽窗格中選擇執行個體,然後選取您打算連線的執行個體。

3.    停止執行個體

4.    選擇動作執行個體設定編輯使用者資料

5.    將下列使用者資料指令碼複製到編輯使用者資料對話方塊中,然後選擇儲存

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
--//

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

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

**注意:**上述命令會排清所有主要的 iptables 規則。重新取得執行個體的存取權之後,請檢閱防火牆組態的準確性 (例如 UFW、firewalldiptables)。

若要移除使用者資料,請執行以下操作:

1.    完成方法 4: 使用使用者資料指令碼區段中的步驟 1-4。

2.    刪除編輯使用者資料對話方塊中的使用者資料指令碼。

相關資訊

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

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

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

為什麼我的 EC2 Linux 執行個體無法連線且無法進行其中一個或兩個狀態檢查?

AWS 官方
AWS 官方已更新 1 年前